Skip to content

Order Processing

Complete FBS order fulfillment workflow.

Description

This use case demonstrates the complete order processing workflow for FBS (Fulfillment by Seller) orders, from receiving new orders to generating shipping labels.

Get New Orders

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

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

async function getNewOrders() {
  const response = await sdk.ordersFBS.getNewOrders();

  console.log(`New orders: ${response.orders?.length ?? 0}`);

  response.orders?.forEach(order => {
    console.log(`Order #${order.id}:`);
    console.log(`  Article: ${order.article}`);
    console.log(`  SKU: ${order.skus?.join(', ')}`);
    console.log(`  Price: ${order.price / 100} RUB`);
    console.log(`  Created: ${new Date(order.createdAt).toLocaleString()}`);
  });

  return response.orders ?? [];
}

const orders = await getNewOrders();

Get Orders with Filters

typescript
// Get orders from the last 7 days
async function getRecentOrders() {
  const sevenDaysAgo = Math.floor(Date.now() / 1000) - (7 * 24 * 60 * 60);

  const response = await sdk.ordersFBS.getOrders({
    dateFrom: sevenDaysAgo,
    limit: 1000,
    next: 0
  });

  return response.orders ?? [];
}

// Get all orders with pagination
async function getAllOrders(dateFrom: number) {
  const allOrders = [];
  let next = 0;

  while (true) {
    const response = await sdk.ordersFBS.getOrders({
      dateFrom,
      limit: 1000,
      next
    });

    if (!response.orders?.length) break;

    allOrders.push(...response.orders);
    next = response.next ?? 0;

    if (response.orders.length < 1000) break;
  }

  return allOrders;
}

Check Order Statuses

typescript
async function checkOrderStatuses(orderIds: number[]) {
  const response = await sdk.ordersFBS.getOrderStatuses(orderIds);

  const statusSummary: Record<string, number> = {};

  response.orders.forEach(order => {
    const status = order.supplierStatus ?? 'unknown';
    statusSummary[status] = (statusSummary[status] ?? 0) + 1;
  });

  console.log('Order Status Summary:');
  Object.entries(statusSummary).forEach(([status, count]) => {
    console.log(`  ${status}: ${count}`);
  });

  return response.orders;
}

Generate Shipping Stickers

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

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

  return response.stickers ?? [];
}

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

async function saveStickersToFiles(orderIds: number[]) {
  const stickers = await getOrderStickers(orderIds);

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

Complete Order Processing Workflow

typescript
interface ProcessedOrder {
  orderId: number;
  status: 'success' | 'failed';
  sticker?: string;
  error?: string;
}

async function processNewOrders(): Promise<ProcessedOrder[]> {
  const results: ProcessedOrder[] = [];

  // 1. Get new orders
  const { orders } = await sdk.ordersFBS.getNewOrders();

  if (!orders?.length) {
    console.log('No new orders to process');
    return results;
  }

  console.log(`Processing ${orders.length} orders...`);

  // 2. Process each order
  for (const order of orders) {
    try {
      // Check order status
      const [statusInfo] = (
        await sdk.ordersFBS.getOrderStatuses([order.id])
      ).orders;

      // Skip if already processed
      if (statusInfo.supplierStatus !== 'new') {
        console.log(`Order ${order.id} already processed`);
        continue;
      }

      // Generate sticker
      const stickerResponse = await sdk.ordersFBS.getOrdersStickers({
        orders: [order.id],
        type: 'png',
        width: 58,
        height: 40
      });

      const sticker = stickerResponse.stickers?.[0];

      results.push({
        orderId: order.id,
        status: 'success',
        sticker: sticker?.file
      });

      console.log(`Order ${order.id} processed successfully`);

    } catch (error) {
      results.push({
        orderId: order.id,
        status: 'failed',
        error: (error as Error).message
      });
      console.error(`Failed to process order ${order.id}:`, error);
    }
  }

  // 3. Summary
  const successful = results.filter(r => r.status === 'success').length;
  const failed = results.filter(r => r.status === 'failed').length;
  console.log(`Processing complete: ${successful} success, ${failed} failed`);

  return results;
}

Supply Management

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

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

// Get supply details with orders
async function getSupplyDetails(supplyId: string) {
  const response = await sdk.ordersFBS.getSupplyOrders(supplyId);

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

  return response.orders ?? [];
}

// Get supply sticker
async function getSupplySticker(supplyId: string) {
  const response = await sdk.ordersFBS.getSupplyBarcode(supplyId, 'png');
  return response;
}

Order Analytics

typescript
interface OrderAnalytics {
  totalOrders: number;
  totalRevenue: number;
  averageOrderValue: number;
  ordersByStatus: Record<string, number>;
  ordersByDay: Record<string, number>;
}

async function analyzeOrders(days = 30): Promise<OrderAnalytics> {
  const fromDate = Math.floor(Date.now() / 1000) - (days * 24 * 60 * 60);
  const orders = await getAllOrders(fromDate);
  const statuses = await sdk.ordersFBS.getOrderStatuses(
    orders.map(o => o.id)
  );

  // Calculate analytics
  const totalRevenue = orders.reduce((sum, o) => sum + (o.price / 100), 0);

  const ordersByStatus: Record<string, number> = {};
  statuses.orders.forEach(s => {
    const status = s.supplierStatus ?? 'unknown';
    ordersByStatus[status] = (ordersByStatus[status] ?? 0) + 1;
  });

  const ordersByDay: Record<string, number> = {};
  orders.forEach(o => {
    const day = new Date(o.createdAt).toISOString().split('T')[0];
    ordersByDay[day] = (ordersByDay[day] ?? 0) + 1;
  });

  return {
    totalOrders: orders.length,
    totalRevenue,
    averageOrderValue: orders.length > 0 ? totalRevenue / orders.length : 0,
    ordersByStatus,
    ordersByDay
  };
}

// Usage
const analytics = await analyzeOrders(30);
console.log('30-day Order Analytics:');
console.log(`  Total Orders: ${analytics.totalOrders}`);
console.log(`  Total Revenue: ${analytics.totalRevenue.toFixed(2)} RUB`);
console.log(`  Average Order: ${analytics.averageOrderValue.toFixed(2)} RUB`);

Back to Examples | Previous: Product Catalog | Next: Shipping Management

Made with ❤️ for the Wildberries developer community