Skip to content

Shipping Management

Managing deliveries and supplies for FBS orders.

Description

This use case demonstrates how to manage the shipping process for FBS (Fulfillment by Seller) orders, including creating supplies, generating shipping labels, and tracking delivery status.

Get Supplies List

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

const sdk = new WildberriesSDK({
  apiKey: process.env.WB_API_KEY!
});

// Get all supplies
async function getSupplies() {
  const response = await sdk.ordersFBS.getSupplies({
    limit: 100,
    next: 0
  });

  console.log(`Total supplies: ${response.supplies?.length ?? 0}`);

  response.supplies?.forEach(supply => {
    console.log(`Supply ${supply.id}:`);
    console.log(`  Name: ${supply.name}`);
    console.log(`  Status: ${supply.done ? 'Completed' : 'Active'}`);
    console.log(`  Created: ${supply.createdAt}`);
  });

  return response.supplies ?? [];
}

const supplies = await getSupplies();

Get Supply Details

typescript
// Get orders in a supply
async function getSupplyDetails(supplyId: string) {
  const orders = await sdk.ordersFBS.getSupplyOrders(supplyId);

  console.log(`Supply ${supplyId} contains ${orders.orders?.length ?? 0} orders:`);

  orders.orders?.forEach(order => {
    console.log(`  Order ${order.id}:`);
    console.log(`    Article: ${order.article}`);
    console.log(`    SKU: ${order.skus?.join(', ')}`);
  });

  return orders.orders ?? [];
}

const supplyOrders = await getSupplyDetails('WB-GI-12345678');

Generate Order Stickers

typescript
// Generate shipping stickers for orders
async function generateStickers(orderIds: number[]) {
  const response = await sdk.ordersFBS.getOrdersStickers({
    orders: orderIds,
    type: 'png',    // 'png' | 'svg' | 'zpl'
    width: 58,      // Width in mm
    height: 40      // Height in mm
  });

  console.log(`Generated ${response.stickers?.length ?? 0} stickers`);

  return response.stickers ?? [];
}

// Save stickers to files
import { writeFileSync } from 'fs';

async function saveStickers(orderIds: number[], outputDir: string) {
  const stickers = await generateStickers(orderIds);

  for (const sticker of stickers) {
    if (sticker.file && sticker.orderId) {
      const buffer = Buffer.from(sticker.file, 'base64');
      const path = `${outputDir}/sticker-${sticker.orderId}.png`;
      writeFileSync(path, buffer);
      console.log(`Saved: ${path}`);
    }
  }
}

await saveStickers([123, 456, 789], './stickers');

Get Supply Barcode

typescript
// Get barcode for a supply
async function getSupplyBarcode(supplyId: string) {
  const response = await sdk.ordersFBS.getSupplyBarcode(supplyId, 'png');

  if (response.file) {
    console.log(`Barcode generated for supply ${supplyId}`);
  }

  return response;
}

// Save supply barcode
async function saveSupplyBarcode(supplyId: string, outputPath: string) {
  const barcode = await getSupplyBarcode(supplyId);

  if (barcode.file) {
    const buffer = Buffer.from(barcode.file, 'base64');
    writeFileSync(outputPath, buffer);
    console.log(`Saved supply barcode to ${outputPath}`);
  }
}

Add Boxes to Supply (TRBX)

typescript
// Add transport boxes to a supply
async function addBoxesToSupply(supplyId: string, boxCount: number) {
  const result = await sdk.ordersFBS.addSupplyTrbx(supplyId, boxCount);

  console.log(`Added ${boxCount} boxes to supply ${supplyId}`);
  console.log('Box IDs:', result.trbxIds);

  return result.trbxIds;
}

// Example: Add 3 boxes
const boxIds = await addBoxesToSupply('WB-GI-12345678', 3);

Delete Boxes from Supply

typescript
// Remove boxes from a supply
async function deleteBoxesFromSupply(supplyId: string, trbxIds: string[]) {
  await sdk.ordersFBS.deleteSupplyTrbx(supplyId, trbxIds);
  console.log(`Removed ${trbxIds.length} boxes from supply ${supplyId}`);
}

Get Box Stickers

typescript
// Get stickers for supply boxes
async function getBoxStickers(
  supplyId: string,
  trbxIds: string[],
  format: 'svg' | 'zpl' | 'png' = 'png'
) {
  const response = await sdk.ordersFBS.getSupplyTrbxStickersPost(
    supplyId,
    format,
    trbxIds
  );

  console.log(`Generated ${response.stickers?.length ?? 0} box stickers`);
  return response.stickers;
}

Cross-Border Shipping

typescript
// Get stickers for cross-border orders
async function getCrossBorderStickers(orderIds: number[]) {
  const response = await sdk.ordersFBS.getCrossBorderStickers(orderIds);

  console.log(`Cross-border stickers for ${response.stickers?.length ?? 0} orders`);
  return response.stickers;
}

// Get status history for cross-border orders
async function getCrossBorderHistory(orderIds: number[]) {
  const response = await sdk.ordersFBS.getOrdersStatusHistoryCrossBorder(orderIds);

  response.orders?.forEach(order => {
    console.log(`Order ${order.id} history:`);
    order.history?.forEach(h => {
      console.log(`  ${h.changedAt}: ${h.status}`);
    });
  });

  return response.orders;
}

Complete Supply Workflow

typescript
interface SupplyWorkflowResult {
  supplyId: string;
  orderCount: number;
  stickersGenerated: number;
  barcodeGenerated: boolean;
}

async function processSupply(supplyId: string): Promise<SupplyWorkflowResult> {
  // 1. Get supply orders
  const orders = await sdk.ordersFBS.getSupplyOrders(supplyId);
  const orderIds = orders.orders?.map(o => o.id) ?? [];

  console.log(`Processing supply ${supplyId} with ${orderIds.length} orders`);

  // 2. Generate stickers for all orders
  let stickersGenerated = 0;
  if (orderIds.length > 0) {
    const stickers = await generateStickers(orderIds);
    stickersGenerated = stickers.length;

    // Save stickers
    for (const sticker of stickers) {
      if (sticker.file) {
        const buffer = Buffer.from(sticker.file, 'base64');
        writeFileSync(`./output/order-${sticker.orderId}.png`, buffer);
      }
    }
  }

  // 3. Generate supply barcode
  const barcode = await getSupplyBarcode(supplyId);
  if (barcode.file) {
    const buffer = Buffer.from(barcode.file, 'base64');
    writeFileSync(`./output/supply-${supplyId}.png`, buffer);
  }

  return {
    supplyId,
    orderCount: orderIds.length,
    stickersGenerated,
    barcodeGenerated: !!barcode.file
  };
}

Delivery Pass Management

typescript
// Update delivery pass
async function updateDeliveryPass(passId: number, data: {
  deliveryDate?: string;
  carNumber?: string;
  driverName?: string;
}) {
  await sdk.ordersFBS.updatePass(passId, data);
  console.log(`Updated pass ${passId}`);
}

Shipping Analytics

typescript
interface ShippingMetrics {
  period: { from: string; to: string };
  totalSupplies: number;
  totalOrders: number;
  averageOrdersPerSupply: number;
  completedSupplies: number;
  pendingSupplies: number;
}

async function getShippingMetrics(days = 30): Promise<ShippingMetrics> {
  const supplies = await sdk.ordersFBS.getSupplies({
    limit: 1000,
    next: 0
  });

  const cutoffDate = new Date(Date.now() - days * 24 * 60 * 60 * 1000);

  // Filter to recent supplies
  const recentSupplies = supplies.supplies?.filter(s =>
    new Date(s.createdAt ?? 0) >= cutoffDate
  ) ?? [];

  const completed = recentSupplies.filter(s => s.done);
  const pending = recentSupplies.filter(s => !s.done);

  // Count orders in supplies
  let totalOrders = 0;
  for (const supply of recentSupplies.slice(0, 10)) { // Sample first 10
    const orders = await sdk.ordersFBS.getSupplyOrders(supply.id ?? '');
    totalOrders += orders.orders?.length ?? 0;
  }

  const avgOrders = recentSupplies.length > 0
    ? totalOrders / Math.min(10, recentSupplies.length)
    : 0;

  return {
    period: {
      from: cutoffDate.toISOString().split('T')[0],
      to: new Date().toISOString().split('T')[0]
    },
    totalSupplies: recentSupplies.length,
    totalOrders: Math.round(avgOrders * recentSupplies.length),
    averageOrdersPerSupply: Math.round(avgOrders * 10) / 10,
    completedSupplies: completed.length,
    pendingSupplies: pending.length
  };
}

Back to Examples | Previous: Stock Management | Next: Returns Handling

Made with ❤️ for the Wildberries developer community