Net sales at category × channel type × period, the actuals feed for finance
Net sales bucketed by category, channel type and period: one row per combination with net_sales and net_items_sold, plus the window, the grain, the calendar, a coverage block counting the orders and dimensions behind the rows, and a basis note. This is the coarse actuals feed a plan is measured against.
start_date and end_date are required and end_date is INCLUSIVE, as it is on get_stock_on_hand: the service turns it into the exclusive bound, so two callers asking for 2026-01-31 and 2026-02-01 each see the period once. The window may not exceed 400 days; a caller wanting more asks twice.
categories and channel_types filter and never change the grain, and coverage then describes the filtered population, so a filtered total is honest about its own denominator instead of reading as the whole book.
Use get_sales_table when the question is per variant. This is the same book at a coarser grain, keyed the way a plan is keyed.
A key issued to one account is refused with account_mismatch: this read covers every account on the book. That account's own sales are at GET /sales/table.
Scope: sales:read.
Request
- Base URL: https://api.app.tightly.io
- URL: https://api.app.tightly.io/api/v1/sales/net-sales
- Auth: HTTP bearer
Query parameters
Product adds product_id and product_name to the grouping while preserving category, channel, period and commitment scope.
Scope to this commitment's exact merchandise membership and dates. Channel commitments also restrict the sales channel. Rolling commitments use the requested bounded window. The response confirms commitment_scope; an unknown id is refused, never treated as the company.
First day of the window (YYYY-MM-DD).
Last day of the window, inclusive (YYYY-MM-DD). At most 400 days after the start.
The period the rows are bucketed into.
Comma-separated categories to filter to. Filters; never changes the grain.
Comma-separated channel types to filter to.
Headers
The date train to answer on. One train exists today, 2026-11, the one this reference describes and the one every key is minted on, so the call answers on it with or without this header. Send it anyway, so a client built now names its train from the start.
Response
One row per category × channel type × period, the window actually read, the calendar and grain behind it, and a coverage block describing the population these totals were measured over.
Changes
No recorded changes to this operation across all 1 revision of this API.