← back to Govarbitrage

src/engines/constants.ts

57 lines

import type { ConditionKey, SourceKey } from "./types";

// Fraction of *new retail* a used unit fetches, by condition. These are the
// backbone of the valuation model; documented so estimates are auditable.
export const CONDITION_RETAIL_FACTOR: Record<ConditionKey, number> = {
  NEW: 0.78,
  LIKE_NEW: 0.62,
  USED_GOOD: 0.46,
  USED_FAIR: 0.31,
  FOR_PARTS: 0.12,
  UNKNOWN: 0.35,
};

// Typical repair burden as a fraction of new retail, by condition.
export const CONDITION_REPAIR_FACTOR: Record<ConditionKey, number> = {
  NEW: 0,
  LIKE_NEW: 0.01,
  USED_GOOD: 0.03,
  USED_FAIR: 0.07,
  FOR_PARTS: 0.18,
  UNKNOWN: 0.05,
};

// Buyer's premium charged by each source (fraction of hammer/winning bid).
export const BUYER_PREMIUM_RATE: Record<SourceKey, number> = {
  GOVDEALS: 0.1,
  PUBLIC_SURPLUS: 0.1,
  GSA_AUCTIONS: 0,
  COUNTY: 0.1,
  STATE_SURPLUS: 0.08,
  UNIVERSITY_SURPLUS: 0.1,
  MUNICIBID: 0.1,
  BID4ASSETS: 0.1,
  CSV: 0.1,
  EXTENSION: 0.1,
  OTHER: 0.1,
};

// Marketplace + payment fee rates (fraction of resale price).
export const MARKETPLACE_FEE_RATE = 0.132; // eBay-typical final value fee
export const PAYMENT_FEE_RATE = 0.03; // managed-payments processing

// Prep/handling cost assumptions (US dollars).
export const PACKING_BASE = 12;
export const PACKING_PER_LB = 0.15;
export const PHOTOGRAPHY_COST = 8;
export const LISTING_LABOR_COST = 10;
export const TESTING_COST_PER_UNIT = 15;
export const PICKUP_LABOR_HOURLY = 35;
export const STORAGE_PER_MONTH = 18;

// Weight threshold (lbs) above which an item ships as LTL freight, not parcel.
export const FREIGHT_THRESHOLD_LBS = 150;

// Target ROI used to back-solve the recommended maximum bid.
export const TARGET_ROI = 0.4;