Skip to content

Realization Report Guide

Руководство по получению отчёта о реализации (детализированный отчёт продавца) через Wildberries SDK.

Overview

Отчёт о реализации — основной источник данных о продажах, возвратах, комиссиях и удержаниях. Содержит детализацию по каждой операции.


Quick Start

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

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

// Получить отчёт за неделю
const report = await sdk.finances.getSupplierReportdetailbyperiod({
  dateFrom: '2024-12-01',
  dateTo: '2024-12-07'
});

console.log(`Всего записей: ${report.length}`);

Метод API

getSupplierReportdetailbyperiod(params)

Модуль: sdk.finances

ПараметрТипОбязательныйОписание
dateFromstringДаНачало периода (YYYY-MM-DD)
dateTostringДаКонец периода (YYYY-MM-DD)
limitnumberНетЛимит записей (default: 100000)
rrdidnumberНетID для пагинации

Rate Limit: 1 запрос в минуту


Структура ответа

typescript
interface RealizationReportItem {
  realizationreport_id: number;    // ID отчёта о реализации
  date_from: string;               // Начало периода отчёта
  date_to: string;                 // Конец периода отчёта
  create_dt: string;               // Дата формирования отчёта
  currency_name: string;           // Валюта (RUB)
  suppliercontract_code: string;   // Код договора
  rrd_id: number;                  // ID строки (для пагинации)
  gi_id: number;                   // Номер поставки
  subject_name: string;            // Предмет
  nm_id: number;                   // Артикул WB
  brand_name: string;              // Бренд
  sa_name: string;                 // Артикул продавца
  ts_name: string;                 // Размер
  barcode: string;                 // Баркод
  doc_type_name: string;           // Тип документа
  quantity: number;                // Количество
  retail_price: number;            // Цена розничная
  retail_amount: number;           // Сумма продаж (возвратов)
  sale_percent: number;            // Согласованная скидка
  commission_percent: number;      // Процент комиссии
  office_name: string;             // Склад
  supplier_oper_name: string;      // Обоснование для оплаты
  order_dt: string;                // Дата заказа
  sale_dt: string;                 // Дата продажи
  rr_dt: string;                   // Дата операции
  shk_id: number;                  // ШК
  retail_price_withdisc_rub: number; // Цена со скидкой
  delivery_amount: number;         // Стоимость логистики
  return_amount: number;           // Сумма возврата
  delivery_rub: number;            // Стоимость логистики, руб
  gi_box_type_name: string;        // Тип коробки
  product_discount_for_report: number; // Скидка постоянного покупателя
  supplier_promo: number;          // Промокод продавца
  rid: number;                     // Уникальный ID
  ppvz_spp_prc: number;            // Скидка WB
  ppvz_kvw_prc_base: number;       // Размер кВВ без НДС
  ppvz_kvw_prc: number;            // Размер кВВ, %
  sup_rating_prc_up: number;       // Надбавка за рейтинг
  is_kgvp_v2: number;              // Признак КГТ
  ppvz_sales_commission: number;   // Удержания с продаж
  ppvz_for_pay: number;            // К перечислению продавцу
  ppvz_reward: number;             // Возмещение издержек по эквайрингу
  acquiring_fee: number;           // Эквайринг
  acquiring_percent: number;       // Процент эквайринга
  acquiring_bank: string;          // Банк эквайринг
  ppvz_vw: number;                 // Вознаграждение WB
  ppvz_vw_nds: number;             // НДС с вознаграждения WB
  ppvz_office_id: number;          // ID офиса
  ppvz_office_name: string;        // Название офиса
  ppvz_supplier_id: number;        // ID продавца
  ppvz_supplier_name: string;      // Название продавца
  ppvz_inn: string;                // ИНН продавца
  declaration_number: string;      // Номер декларации
  bonus_type_name: string;         // Тип бонуса
  sticker_id: string;              // ID стикера
  site_country: string;            // Страна
  penalty: number;                 // Штрафы
  additional_payment: number;      // Доплаты
  rebill_logistic_cost: number;    // Возмещение логистики
  rebill_logistic_org: string;     // Организация возмещения
  kiz: string;                     // КИЗ
  storage_fee: number;             // Хранение
  deduction: number;               // Прочие удержания
  acceptance: number;              // Приёмка
  srid: string;                    // Уникальный ID позиции заказа
  report_type: number;             // Тип отчёта
}

Примеры использования

1. Базовый отчёт за период

typescript
async function getRealizationReport(
  sdk: WildberriesSDK,
  dateFrom: string,
  dateTo: string
) {
  const report = await sdk.finances.getSupplierReportdetailbyperiod({
    dateFrom,
    dateTo
  });

  console.log(`Период: ${dateFrom} - ${dateTo}`);
  console.log(`Всего записей: ${report.length}`);

  return report;
}

// Использование
const report = await getRealizationReport(sdk, '2024-12-01', '2024-12-07');

2. Получение полного отчёта с пагинацией

typescript
async function getFullRealizationReport(
  sdk: WildberriesSDK,
  dateFrom: string,
  dateTo: string
): Promise<RealizationReportItem[]> {
  const allItems: RealizationReportItem[] = [];
  let rrdid = 0;
  let hasMore = true;

  while (hasMore) {
    const items = await sdk.finances.getSupplierReportdetailbyperiod({
      dateFrom,
      dateTo,
      limit: 100000,
      rrdid
    });

    if (items.length === 0) {
      hasMore = false;
    } else {
      allItems.push(...items);
      rrdid = items[items.length - 1].rrd_id;

      console.log(`Загружено: ${allItems.length} записей`);

      // Rate limit: 1 req/min
      if (items.length === 100000) {
        console.log('Ожидание 60 сек (rate limit)...');
        await new Promise(r => setTimeout(r, 61000));
      }
    }
  }

  return allItems;
}

3. Анализ продаж по типам операций

typescript
interface SalesAnalysis {
  sales: number;           // Продажи
  returns: number;         // Возвраты
  logistics: number;       // Логистика
  storage: number;         // Хранение
  commission: number;      // Комиссия
  penalties: number;       // Штрафы
  netAmount: number;       // Итого к выплате
}

async function analyzeSales(
  sdk: WildberriesSDK,
  dateFrom: string,
  dateTo: string
): Promise<SalesAnalysis> {
  const report = await getFullRealizationReport(sdk, dateFrom, dateTo);

  const analysis: SalesAnalysis = {
    sales: 0,
    returns: 0,
    logistics: 0,
    storage: 0,
    commission: 0,
    penalties: 0,
    netAmount: 0
  };

  for (const item of report) {
    const operName = item.supplier_oper_name?.toLowerCase() || '';

    if (operName.includes('продажа')) {
      analysis.sales += item.ppvz_for_pay || 0;
    } else if (operName.includes('возврат')) {
      analysis.returns += Math.abs(item.ppvz_for_pay || 0);
    } else if (operName.includes('логистик')) {
      analysis.logistics += Math.abs(item.delivery_rub || 0);
    } else if (operName.includes('хранени')) {
      analysis.storage += item.storage_fee || 0;
    }

    analysis.commission += item.ppvz_sales_commission || 0;
    analysis.penalties += item.penalty || 0;
    analysis.netAmount += item.ppvz_for_pay || 0;
  }

  return analysis;
}

// Использование
const analysis = await analyzeSales(sdk, '2024-12-01', '2024-12-07');

console.log('=== Анализ продаж ===');
console.log(`Продажи:    ${analysis.sales.toFixed(2)} ₽`);
console.log(`Возвраты:   ${analysis.returns.toFixed(2)} ₽`);
console.log(`Логистика:  ${analysis.logistics.toFixed(2)} ₽`);
console.log(`Хранение:   ${analysis.storage.toFixed(2)} ₽`);
console.log(`Комиссия:   ${analysis.commission.toFixed(2)} ₽`);
console.log(`Штрафы:     ${analysis.penalties.toFixed(2)} ₽`);
console.log(`К выплате:  ${analysis.netAmount.toFixed(2)} ₽`);

4. Отчёт по товарам

typescript
interface ProductSalesReport {
  nmId: number;
  subjectName: string;
  brandName: string;
  quantity: number;
  salesAmount: number;
  returnsAmount: number;
  netAmount: number;
}

async function getProductSalesReport(
  sdk: WildberriesSDK,
  dateFrom: string,
  dateTo: string
): Promise<ProductSalesReport[]> {
  const report = await getFullRealizationReport(sdk, dateFrom, dateTo);

  const productMap = new Map<number, ProductSalesReport>();

  for (const item of report) {
    if (!item.nm_id || item.nm_id === 0) continue;

    let product = productMap.get(item.nm_id);
    if (!product) {
      product = {
        nmId: item.nm_id,
        subjectName: item.subject_name || '',
        brandName: item.brand_name || '',
        quantity: 0,
        salesAmount: 0,
        returnsAmount: 0,
        netAmount: 0
      };
      productMap.set(item.nm_id, product);
    }

    const qty = item.quantity || 0;
    const amount = item.ppvz_for_pay || 0;

    if (qty > 0) {
      product.quantity += qty;
      product.salesAmount += amount;
    } else {
      product.returnsAmount += Math.abs(amount);
    }
    product.netAmount += amount;
  }

  return Array.from(productMap.values())
    .sort((a, b) => b.netAmount - a.netAmount);
}

// Использование
const productReport = await getProductSalesReport(sdk, '2024-12-01', '2024-12-07');

console.log('=== Топ-10 товаров по выручке ===');
productReport.slice(0, 10).forEach((p, i) => {
  console.log(`${i + 1}. nm_id=${p.nmId} | ${p.subjectName}`);
  console.log(`   Продано: ${p.quantity} шт | Выручка: ${p.netAmount.toFixed(2)} ₽`);
});

5. Ежедневная разбивка

typescript
interface DailyReport {
  date: string;
  salesCount: number;
  salesAmount: number;
  returnsCount: number;
  returnsAmount: number;
  netAmount: number;
}

async function getDailyBreakdown(
  sdk: WildberriesSDK,
  dateFrom: string,
  dateTo: string
): Promise<DailyReport[]> {
  const report = await getFullRealizationReport(sdk, dateFrom, dateTo);

  const dailyMap = new Map<string, DailyReport>();

  for (const item of report) {
    const date = item.rr_dt?.split('T')[0] || item.sale_dt?.split('T')[0];
    if (!date) continue;

    let daily = dailyMap.get(date);
    if (!daily) {
      daily = {
        date,
        salesCount: 0,
        salesAmount: 0,
        returnsCount: 0,
        returnsAmount: 0,
        netAmount: 0
      };
      dailyMap.set(date, daily);
    }

    const qty = item.quantity || 0;
    const amount = item.ppvz_for_pay || 0;

    if (qty > 0) {
      daily.salesCount += qty;
      daily.salesAmount += amount;
    } else if (qty < 0) {
      daily.returnsCount += Math.abs(qty);
      daily.returnsAmount += Math.abs(amount);
    }
    daily.netAmount += amount;
  }

  return Array.from(dailyMap.values())
    .sort((a, b) => a.date.localeCompare(b.date));
}

// Использование
const dailyReport = await getDailyBreakdown(sdk, '2024-12-01', '2024-12-07');

console.log('=== Ежедневный отчёт ===');
console.log('Дата       | Продаж | Возвратов | Выручка');
console.log('-'.repeat(50));
dailyReport.forEach(day => {
  console.log(
    `${day.date} | ${day.salesCount.toString().padStart(6)} | ` +
    `${day.returnsCount.toString().padStart(9)} | ${day.netAmount.toFixed(2)} ₽`
  );
});

Типы операций (supplier_oper_name)

ЗначениеОписание
ПродажаПродажа товара покупателю
ВозвратВозврат товара покупателем
ЛогистикаСтоимость доставки
Логистика сторноВозврат стоимости доставки
ХранениеПлатное хранение
ШтрафШтрафные санкции
КомпенсацияКомпенсации от WB
Частичная компенсацияЧастичная компенсация

Ключевые поля для финансов

ПолеОписаниеЗнак
ppvz_for_payК перечислению продавцу±
ppvz_sales_commissionКомиссия WB-
delivery_rubСтоимость логистики-
storage_feeХранение-
penaltyШтрафы-
additional_paymentДоплаты+
retail_amountСумма продажи (розница)±

Rate Limits и рекомендации

АспектРекомендация
Rate limit1 запрос в минуту
ПагинацияИспользуйте rrdid из последней записи
Размер периодаДо 365 дней за запрос
Лимит записейmax 100000 за запрос
Задержка61 сек между запросами при пагинации

Связанные материалы


← Back to Guides

Made with ❤️ for the Wildberries developer community