Skip to content

Supplies & Tariffs Guide ​

Complete guide to managing Wildberries supply acceptance coefficients, calculating supply costs, and comparing tariffs between inventory storage and supply fulfillment options.

Table of Contents ​

Overview ​

The Supplies module (part of OrdersFbwModule) provides access to supply-related tariff data through the Wildberries Supplies API. This includes:

  • Acceptance Coefficients: Daily coefficients affecting supply acceptance costs for the next 14 days
  • Acceptance Options: Available warehouses and packaging types for specific products
  • Utility Functions: Calculate supply costs and compare tariffs across different fulfillment options

When to Use This Module ​

Use CaseMethod/Utility
Plan optimal supply timinggetAcceptanceCoefficients()
Find available warehouses for productscreateAcceptanceOption()
Estimate supply costscalculateSupplyCost()
Choose between inventory vs supplycompareTariffs()

Acceptance Coefficients ​

Method: getAcceptanceCoefficients() ​

Returns acceptance coefficients for all warehouses for the next 14 days. These coefficients directly affect your supply acceptance costs.

Signature ​

typescript
async getAcceptanceCoefficients(options?: {
  warehouseIDs?: string;
}): Promise<ModelsAcceptanceCoefficient[]>

Parameters ​

ParameterTypeDescription
warehouseIDsstringOptional. Comma-separated list of warehouse IDs to filter results

Response Type: ModelsAcceptanceCoefficient ​

typescript
interface ModelsAcceptanceCoefficient {
  /** Date when coefficient is active (YYYY-MM-DD) */
  date?: string;

  /** Acceptance coefficient:
   * -1: acceptance unavailable
   *  0: free acceptance
   * >0: cost multiplier */
  coefficient?: number;

  /** Warehouse ID */
  warehouseID?: number;

  /** Warehouse name */
  warehouseName?: string;

  /** Whether unloading is allowed */
  allowUnload?: boolean;

  /** Box type name: "Короба", "Монопаллеты", "Суперсейф", "QR-поставка с коробами" */
  boxTypeName?: string;

  /** Box type ID: 2=Boxes, 5=Monopallets, 6=Supersafe */
  boxTypeID?: number;

  /** Storage coefficient (percentage) */
  storageCoef?: string;

  /** Delivery coefficient (percentage) */
  deliveryCoef?: string;

  /** Base delivery cost per first liter */
  deliveryBaseLiter?: string;

  /** Delivery cost per additional liter */
  deliveryAdditionalLiter?: string;

  /** Base storage cost per first liter (or per pallet for pallets) */
  storageBaseLiter?: string;

  /** Storage cost per additional liter */
  storageAdditionalLiter?: string;

  /** Whether this is a sorting center */
  isSortingCenter?: boolean;
}

Example: Get All Coefficients ​

typescript
import { WildberriesSDK } from 'daytona-wildberries-typescript-sdk';

const sdk = new WildberriesSDK({ apiKey: 'your-api-key' });

// Get coefficients for all warehouses
const coefficients = await sdk.ordersFBW.getAcceptanceCoefficients();

console.log(`Found ${coefficients.length} coefficient entries`);

// Group by warehouse for analysis
const byWarehouse = new Map<number, typeof coefficients>();
for (const coef of coefficients) {
  if (!coef.warehouseID) continue;
  const existing = byWarehouse.get(coef.warehouseID) || [];
  existing.push(coef);
  byWarehouse.set(coef.warehouseID, existing);
}

// Find warehouses with free acceptance (coefficient = 0)
const freeAcceptance = coefficients.filter(c =>
  c.coefficient === 0 && c.allowUnload === true
);

console.log('Warehouses with free acceptance:',
  [...new Set(freeAcceptance.map(c => c.warehouseName))]
);

Example: Filter by Specific Warehouses ​

typescript
// Get coefficients only for Kolomino (507) and Elektrostal (130744)
const coefficients = await sdk.ordersFBW.getAcceptanceCoefficients({
  warehouseIDs: '507,130744'
});

// Find best day to supply to Kolomino
const kolominoCoefs = coefficients
  .filter(c => c.warehouseID === 507 && c.boxTypeName === 'Короба')
  .sort((a, b) => (a.coefficient ?? 999) - (b.coefficient ?? 999));

if (kolominoCoefs.length > 0) {
  const best = kolominoCoefs[0];
  console.log(`Best day for Kolomino: ${best.date}, coefficient: ${best.coefficient}`);
}

Understanding Coefficient Values ​

CoefficientMeaningAction
-1Acceptance unavailableCannot supply on this date
0Free acceptanceOptimal time to supply
1Base rateStandard pricing
>1Multiplied rateHigher cost, consider waiting

Acceptance Availability

A supply can only be accepted when both conditions are met:

  • coefficient is 0 or 1
  • allowUnload is true

Critical: Number Format

Wildberries API returns numbers with comma separators (e.g., "0,13"). You MUST convert commas to dots before parsing:

typescript
function parseWBNumber(value: string | null | undefined): number {
  if (!value) return 0;
  return parseFloat(value.replace(',', '.'));  // "0,13" → 0.13
}

Failure to do this will result in storage = 0 calculations!

Acceptance Options ​

Method: createAcceptanceOption() ​

Returns available warehouses and packaging types for a specific set of products based on their barcodes and quantities.

Signature ​

typescript
async createAcceptanceOption(
  data: ModelsGood[],
  options?: { warehouseID?: string }
): Promise<ModelsOptionsResultModel>

Parameters ​

ParameterTypeDescription
dataModelsGood[]Array of products with barcodes and quantities
warehouseIDstringOptional. Filter results to specific warehouse

Input Type: ModelsGood ​

typescript
interface ModelsGood {
  /** Product barcode */
  barcode: string;

  /** Quantity of items */
  quantity: number;
}

Example: Get Acceptance Options for Products ​

typescript
// Define products to supply
const products = [
  { barcode: '4680075251234', quantity: 100 },
  { barcode: '4680075255678', quantity: 50 }
];

// Get available options
const options = await sdk.ordersFBW.createAcceptanceOption(products);

console.log('Available warehouses:', options.warehouses);
console.log('Available box types:', options.boxTypes);

// Filter for specific warehouse
const kolominoOptions = await sdk.ordersFBW.createAcceptanceOption(products, {
  warehouseID: '507'
});

Supply Cost Calculator ​

Utility: calculateSupplyCost() ​

Calculates the estimated total supply cost including acceptance, storage, and logistics costs.

Signature ​

typescript
async function calculateSupplyCost(
  input: SupplyCostInput,
  getCoefficients: () => Promise<ModelsAcceptanceCoefficient[]>
): Promise<SupplyCostResult>

Input Type: SupplyCostInput ​

typescript
interface SupplyCostInput {
  /** Volume of goods in liters */
  volume: number;

  /** Warehouse ID */
  warehouseID: number;

  /** Number of storage days */
  days: number;

  /** Box type: 'box' | 'pallet' | 'supersafe' */
  boxType?: 'box' | 'pallet' | 'supersafe';
}

Output Type: SupplyCostResult ​

typescript
interface SupplyCostResult {
  /** Acceptance cost in rubles */
  acceptanceCost: number;

  /** Storage cost in rubles */
  storageCost: number;

  /** Logistics/delivery cost in rubles */
  logisticsCost: number;

  /** Total cost (acceptance + storage + logistics) */
  totalCost: number;

  /** Warehouse name */
  warehouseName: string;

  /** Applied coefficients for transparency */
  appliedCoefficients: {
    acceptance: number;
    storage: number;
    delivery: number;
  };
}

Example: Calculate Supply Cost ​

typescript
import { WildberriesSDK, calculateSupplyCost } from 'daytona-wildberries-typescript-sdk';

const sdk = new WildberriesSDK({ apiKey: 'your-api-key' });

// Calculate cost for 10 liters, 30 days storage at Kolomino
const result = await calculateSupplyCost(
  {
    volume: 10,
    warehouseID: 507,
    days: 30,
    boxType: 'box'
  },
  () => sdk.ordersFBW.getAcceptanceCoefficients({ warehouseIDs: '507' })
);

console.log('Cost breakdown:');
console.log(`  Acceptance: ${result.acceptanceCost} RUB`);
console.log(`  Storage: ${result.storageCost} RUB`);
console.log(`  Logistics: ${result.logisticsCost} RUB`);
console.log(`  Total: ${result.totalCost} RUB`);
console.log(`  Warehouse: ${result.warehouseName}`);
console.log('Applied coefficients:', result.appliedCoefficients);

Cost Calculation Formulas ​

IMPORTANT: Parse Number Format First

typescript
// Always parse Wildberries numbers with this helper
function parseWBNumber(value: string | null | undefined): number {
  if (!value) return 0;
  return parseFloat(value.replace(',', '.'));
}

Storage Cost:

For Boxes (BoxTypeID: 2):

storageBaseLiter: ₽ per first liter
storageAdditionalLiter: ₽ per each additional liter
storageCoef: percentage multiplier

Cost = (storageBaseLiter + (volume-1) * storageAdditionalLiter) * (storageCoef / 100) * days

For Pallets (BoxTypeID: 5):

storageBaseLiter: ₽ per entire pallet (flat rate)
storageAdditionalLiter: null (not applicable)
storageCoef: percentage multiplier

Cost = storageBaseLiter * (storageCoef / 100) * days

For Supersafe (BoxTypeID: 6):

Same formula as boxes:
Cost = (storageBaseLiter + (volume-1) * storageAdditionalLiter) * (storageCoef / 100) * days

Logistics Cost:

For boxes: (deliveryBaseLiter + (volume-1) * deliveryAdditionalLiter) * deliveryCoef/100
For pallets: deliveryBaseLiter * deliveryCoef/100 (flat rate)

Acceptance Cost:

coefficient = 0: Free (0 RUB)
coefficient > 0: coefficient * BASE_RATE (50 RUB)

Box Type Differences

Box TypeBoxTypeIDstorageBaseLiterstorageAdditionalLiterPricing Model
Короба (Boxes)2per first literper additional literVolume-based
Монопаллеты (Pallets)5per entire palletnull (not used)Flat rate
Суперсейф (Supersafe)6per first literper additional literVolume-based

Real-World Example: Storage Cost Calculation ​

Example 1: Box Storage (BoxTypeID: 2)

typescript
import { WildberriesSDK } from 'daytona-wildberries-typescript-sdk';

// Helper function - CRITICAL for correct number parsing
function parseWBNumber(value: string | null | undefined): number {
  if (!value) return 0;
  return parseFloat(value.replace(',', '.'));  // "0,13" → 0.13
}

// Calculate storage cost for boxes
function calculateBoxStorage(
  tariff: ModelsAcceptanceCoefficient,
  volume: number,
  days: number
): number {
  const base = parseWBNumber(tariff.storageBaseLiter);
  const additional = parseWBNumber(tariff.storageAdditionalLiter);
  const coef = parseWBNumber(tariff.storageCoef) || 100;

  // Formula: (base + (volume-1) * additional) * (coef / 100) * days
  return (base + (volume - 1) * additional) * (coef / 100) * days;
}

const sdk = new WildberriesSDK({ apiKey: 'your-api-key' });

// Get SUPPLY tariffs (for planning)
const coefficients = await sdk.ordersFBW.getAcceptanceCoefficients();

// Find warehouse and box type
const warehouse = coefficients.find(c =>
  c.warehouseID === 130744 &&  // Краснодар (Тихорецкая)
  c.boxTypeID === 2             // Короба (Boxes)
);

// Real API response values:
// storageBaseLiter: "0,13"
// storageAdditionalLiter: "0,13"
// storageCoef: "165"

const volume = 50; // liters
const days = 30;

const storageCost = calculateBoxStorage(warehouse, volume, days);
console.log(`Storage cost: ${storageCost.toFixed(2)} ₽`);
// Output: Storage cost: 643.50 ₽
// Calculation: (0.13 + (50-1) * 0.13) * (165 / 100) * 30 = 643.50

Example 2: Pallet Storage (BoxTypeID: 5)

typescript
// Calculate storage cost for pallets
function calculatePalletStorage(
  tariff: ModelsAcceptanceCoefficient,
  palletCount: number,
  days: number
): number {
  const base = parseWBNumber(tariff.storageBaseLiter);
  const coef = parseWBNumber(tariff.storageCoef) || 100;

  // storageAdditionalLiter is null for pallets - flat rate pricing
  // Formula: base * (coef / 100) * days
  return base * palletCount * (coef / 100) * days;
}

const palletWarehouse = coefficients.find(c =>
  c.warehouseID === 130744 &&
  c.boxTypeID === 5  // Монопаллеты (Pallets)
);

// Real API response values:
// storageBaseLiter: "41.25"
// storageAdditionalLiter: null
// storageCoef: "165"

const palletCount = 2;
const palletDays = 30;

const palletStorageCost = calculatePalletStorage(
  palletWarehouse,
  palletCount,
  palletDays
);

console.log(`Pallet storage cost: ${palletStorageCost.toFixed(2)} ₽`);
// Output: Pallet storage cost: 4083.75 ₽
// Calculation: 41.25 * 2 * (165 / 100) * 30 = 4083.75

Common Mistake: Using parseFloat Directly

typescript
// ❌ WRONG - Will return 0 for comma-separated numbers
const wrong = parseFloat(tariff.storageBaseLiter);  // "0,13" → NaN → 0

// ✅ CORRECT - Convert comma to dot first
const correct = parseFloat(tariff.storageBaseLiter.replace(',', '.'));  // "0,13" → 0.13

Tariff Comparison ​

Utility: compareTariffs() ​

Compares tariffs between inventory storage (from Tariffs API) and supply acceptance (from Supplies API) to help decide the most cost-effective fulfillment option.

Signature ​

typescript
async function compareTariffs(
  input: CompareTariffsInput,
  getBoxTariffs: () => Promise<ModelsWarehouseBoxRates[]>,  // Adapter for sdk.tariffs.getTariffsBox()
  getAcceptanceCoefficients: () => Promise<ModelsAcceptanceCoefficient[]>
): Promise<TariffComparison>

Input Type: CompareTariffsInput ​

typescript
interface CompareTariffsInput {
  /** Warehouse name to search for (supports partial matching) */
  warehouseName: string;

  /** Date for the comparison (ISO format: YYYY-MM-DD) */
  date: string;
}

Output Type: TariffComparison ​

typescript
interface TariffComparison {
  /** Warehouse name used for comparison */
  warehouseName: string;

  /** Date used for comparison */
  date: string;

  /** Tariff data from inventory storage API */
  inventory: TariffData;

  /** Tariff data from supply API */
  supply: TariffData;

  /** Percentage differences between the two sources */
  difference: TariffDifference;

  /** Recommendation: 'SUPPLY_CHEAPER' | 'INVENTORY_CHEAPER' | 'EQUAL' */
  recommendation: TariffRecommendation;
}

interface TariffData {
  deliveryBase: number;
  deliveryCoef: number;
  storageBase: number;
  storageCoef: number;
  found: boolean;
}

interface TariffDifference {
  /** (supply - inventory) / inventory * 100 */
  deliveryBasePercent: number;
  storageBasePercent: number;
}

Example: Compare Tariffs ​

typescript
import { WildberriesSDK, compareTariffs } from 'daytona-wildberries-typescript-sdk';

const sdk = new WildberriesSDK({ apiKey: 'your-api-key' });

const comparison = await compareTariffs(
  {
    warehouseName: 'Коледино',
    date: '2025-01-25'
  },
  async () => {
    const response = await sdk.tariffs.getTariffsBox({ date: '2025-01-25' });
    return response.response?.data?.warehouseList ?? [];
  },
  () => sdk.ordersFBW.getAcceptanceCoefficients()
);

console.log('Tariff Comparison for', comparison.warehouseName);
console.log('');
console.log('Inventory Storage Tariffs:');
console.log(`  Delivery base: ${comparison.inventory.deliveryBase} RUB/L`);
console.log(`  Storage base: ${comparison.inventory.storageBase} RUB/L/day`);
console.log('');
console.log('Supply Tariffs:');
console.log(`  Delivery base: ${comparison.supply.deliveryBase} RUB/L`);
console.log(`  Storage base: ${comparison.supply.storageBase} RUB/L/day`);
console.log('');
console.log('Differences:');
console.log(`  Delivery: ${comparison.difference.deliveryBasePercent.toFixed(1)}%`);
console.log(`  Storage: ${comparison.difference.storageBasePercent.toFixed(1)}%`);
console.log('');
console.log(`Recommendation: ${comparison.recommendation}`);

// Make decision based on recommendation
if (comparison.recommendation === 'SUPPLY_CHEAPER') {
  console.log('Use FBW supply for this warehouse');
} else if (comparison.recommendation === 'INVENTORY_CHEAPER') {
  console.log('Use inventory storage (FBS) for this warehouse');
} else {
  console.log('Costs are approximately equal');
}

Rate Limits ​

All supply-related methods share the same rate limits:

PeriodLimitIntervalBurst
1 minute6 requests10 seconds6 requests

Rate Limit Enforcement

The SDK automatically enforces rate limits. If you exceed the limit, requests will be queued and delayed accordingly. For high-volume operations, consider caching coefficient data.

Optimizing API Calls ​

typescript
// GOOD: Cache coefficients and reuse
const coefficients = await sdk.ordersFBW.getAcceptanceCoefficients();

// Calculate costs for multiple warehouses using cached data
const warehouseIDs = [507, 130744, 211622];
const costs = await Promise.all(
  warehouseIDs.map(warehouseID =>
    calculateSupplyCost(
      { volume: 10, warehouseID, days: 30 },
      () => Promise.resolve(coefficients) // Use cached data
    )
  )
);

// BAD: Making separate API calls for each calculation
// This would hit rate limits quickly

Best Practices ​

1. Plan Supplies During Low-Cost Periods ​

typescript
async function findOptimalSupplyDates(
  warehouseID: number,
  boxType: string = 'Короба'
) {
  const coefficients = await sdk.ordersFBW.getAcceptanceCoefficients({
    warehouseIDs: String(warehouseID)
  });

  // Filter for specific box type and available dates
  const available = coefficients
    .filter(c =>
      c.boxTypeName === boxType &&
      c.allowUnload === true &&
      (c.coefficient === 0 || c.coefficient === 1)
    )
    .sort((a, b) => (a.coefficient ?? 999) - (b.coefficient ?? 999));

  return available.map(c => ({
    date: c.date,
    coefficient: c.coefficient,
    isFree: c.coefficient === 0
  }));
}

const optimalDates = await findOptimalSupplyDates(507);
console.log('Best supply dates:', optimalDates.slice(0, 5));

2. Compare Multiple Warehouses ​

typescript
async function compareWarehouses(volume: number, days: number) {
  const coefficients = await sdk.ordersFBW.getAcceptanceCoefficients();

  // Get unique warehouses
  const warehouseIDs = [...new Set(
    coefficients.map(c => c.warehouseID).filter(Boolean)
  )] as number[];

  const results = await Promise.all(
    warehouseIDs.slice(0, 10).map(async warehouseID => {
      try {
        const cost = await calculateSupplyCost(
          { volume, warehouseID, days },
          () => Promise.resolve(coefficients)
        );
        return { warehouseID, ...cost };
      } catch {
        return null;
      }
    })
  );

  return results
    .filter(Boolean)
    .sort((a, b) => a!.totalCost - b!.totalCost);
}

const comparison = await compareWarehouses(10, 30);
console.log('Most cost-effective warehouses:');
comparison.slice(0, 5).forEach((c, i) => {
  console.log(`${i + 1}. ${c!.warehouseName}: ${c!.totalCost} RUB`);
});

3. Monitor Coefficient Changes ​

typescript
async function alertOnCoefficientChanges(warehouseID: number) {
  const coefficients = await sdk.ordersFBW.getAcceptanceCoefficients({
    warehouseIDs: String(warehouseID)
  });

  const today = new Date().toISOString().split('T')[0];
  const todayCoef = coefficients.find(c =>
    c.date === today && c.boxTypeName === 'Короба'
  );

  if (todayCoef?.coefficient === 0) {
    console.log('FREE ACCEPTANCE TODAY! Consider supplying now.');
  } else if ((todayCoef?.coefficient ?? 0) > 1) {
    console.log(`High coefficient (${todayCoef?.coefficient}x) - consider waiting`);
  }

  return todayCoef;
}

Support ​

For questions or issues:

Made with ❤️ for the Wildberries developer community