Flavoso APIAPI referenceReports

Reports

Sales per day, week or month and sales per dish, by the same rules as the figures in the dashboard. More under Reports.

Endpoints

Sales report

get/reports/sales

Scope:
reports:read
Plan:
every plan

Sales of a period, per day, week (Monday to Sunday), month or in total, with exactly the numbers the restaurant's dashboard and its DATEV export show: cancelled orders are not revenue, an online order counts once it is paid, days are local days of the restaurant.

gross is what guests paid without tips (items, delivery and service fees, minus discounts). VAT is computed per day, payment method and rate and then summed, like the accounting export; net is gross - tax. Amounts without a stored VAT rate appear in by_tax_rate with rate_bps: null and count fully into net.

Parameters

NameInDescription
fromstring (date)requiredqueryFirst day of the report, a local date of the restaurant (YYYY-MM-DD). Included.
tostring (date)requiredqueryLast day of the report, a local date (YYYY-MM-DD). Included. At most 366 days after from.
group_bystringqueryday (default), week, month or total. Periods at the edges are cut to from and to."day""week""month""total"default "day"

Response200

OK

  • objectstringrequired

    Always sales_report.

    Values:"sales_report"

  • currencystringrequired

    ISO 4217 of all amounts.

  • timezonestringrequired

    The time zone the days are counted in.

  • fromstring (date)required

    First day, included. A date YYYY-MM-DD in the restaurant's time zone.

  • tostring (date)required

    Last day, included. A date YYYY-MM-DD in the restaurant's time zone.

  • group_bystringrequired

    The period of each bucket.

    Values:"day""week""month""total"

  • totalsSalesBucketrequired

    The whole period.

    Child fields (14)
    • period_startstring (date)required

      First day of the period (cut to from). A date YYYY-MM-DD in the restaurant's time zone.

    • period_endstring (date)required

      Last day of the period (cut to to), included. A date YYYY-MM-DD in the restaurant's time zone.

    • ordersintegerrequired

      Counted orders (not cancelled; online ones only when paid).

    • grossintegerrequired

      What guests paid without tips: items, delivery and service fees, minus discounts. Integer amount in the smallest currency unit (cents).

    • netintegerrequired

      gross − tax. Integer amount in the smallest currency unit (cents).

    • taxintegerrequired

      VAT contained in gross, computed per day, payment method and rate. Integer amount in the smallest currency unit (cents).

    • tipsintegerrequired

      Tips (pass-through, not revenue). Integer amount in the smallest currency unit (cents).

    • delivery_feesintegerrequired

      Delivery fees, included in gross. Integer amount in the smallest currency unit (cents).

    • service_feesintegerrequired

      Service fees, included in gross. Integer amount in the smallest currency unit (cents).

    • discountsintegerrequired

      Discounts (stamp card), already subtracted from gross. Integer amount in the smallest currency unit (cents).

    • by_tax_rateTaxLine[]required

      gross, net and tax per rate; rate_bps null for amounts without a stored rate.

      Child fields (4)
      • rate_bpsintegerrequirednullable

        The rate in basis points (700 = 7 %). null: no rate was stored for this part (not the same as 0 %); then net and tax are null.

      • grossintegerrequired

        Gross amount at this rate. Integer amount in the smallest currency unit (cents).

      • netintegerrequirednullable

        gross − tax, in cents. null when rate_bps is null.

      • taxintegerrequirednullable

        VAT contained in gross: round(gross × rate / (10000 + rate)), in cents. null when rate_bps is null.

    • by_payment_methodobjectrequired

      Split by payment method.

      Child fields (2)
      • onlinePaymentSplitrequired

        Orders, gross (without tips) and tips of one part.

        Child fields (3)
        • ordersintegerrequired

          Counted orders.

        • grossintegerrequired

          Gross without tips. Integer amount in the smallest currency unit (cents).

        • tipsintegerrequired

          Tips. Integer amount in the smallest currency unit (cents).

      • on_sitePaymentSplitrequired

        Orders, gross (without tips) and tips of one part.

        Child fields (3)
        • ordersintegerrequired

          Counted orders.

        • grossintegerrequired

          Gross without tips. Integer amount in the smallest currency unit (cents).

        • tipsintegerrequired

          Tips. Integer amount in the smallest currency unit (cents).

    • by_typeobjectrequired

      Split by order type.

      Child fields (3)
      • pickupPaymentSplitrequired

        Orders, gross (without tips) and tips of one part.

        Child fields (3)
        • ordersintegerrequired

          Counted orders.

        • grossintegerrequired

          Gross without tips. Integer amount in the smallest currency unit (cents).

        • tipsintegerrequired

          Tips. Integer amount in the smallest currency unit (cents).

      • deliveryPaymentSplitrequired

        Orders, gross (without tips) and tips of one part.

        Child fields (3)
        • ordersintegerrequired

          Counted orders.

        • grossintegerrequired

          Gross without tips. Integer amount in the smallest currency unit (cents).

        • tipsintegerrequired

          Tips. Integer amount in the smallest currency unit (cents).

      • dine_inPaymentSplitrequired

        Orders, gross (without tips) and tips of one part.

        Child fields (3)
        • ordersintegerrequired

          Counted orders.

        • grossintegerrequired

          Gross without tips. Integer amount in the smallest currency unit (cents).

        • tipsintegerrequired

          Tips. Integer amount in the smallest currency unit (cents).

    • cancelledobjectrequired

      Orders placed (and paid, if online) and later cancelled; not part of the figures above.

      Child fields (2)
      • ordersintegerrequired

        How many.

      • grossintegerrequired

        Their totals. Integer amount in the smallest currency unit (cents).

  • bucketsSalesBucket[]required

    Every period of the range, also those without orders.

    Child fields (14)
    • period_startstring (date)required

      First day of the period (cut to from). A date YYYY-MM-DD in the restaurant's time zone.

    • period_endstring (date)required

      Last day of the period (cut to to), included. A date YYYY-MM-DD in the restaurant's time zone.

    • ordersintegerrequired

      Counted orders (not cancelled; online ones only when paid).

    • grossintegerrequired

      What guests paid without tips: items, delivery and service fees, minus discounts. Integer amount in the smallest currency unit (cents).

    • netintegerrequired

      gross − tax. Integer amount in the smallest currency unit (cents).

    • taxintegerrequired

      VAT contained in gross, computed per day, payment method and rate. Integer amount in the smallest currency unit (cents).

    • tipsintegerrequired

      Tips (pass-through, not revenue). Integer amount in the smallest currency unit (cents).

    • delivery_feesintegerrequired

      Delivery fees, included in gross. Integer amount in the smallest currency unit (cents).

    • service_feesintegerrequired

      Service fees, included in gross. Integer amount in the smallest currency unit (cents).

    • discountsintegerrequired

      Discounts (stamp card), already subtracted from gross. Integer amount in the smallest currency unit (cents).

    • by_tax_rateTaxLine[]required

      gross, net and tax per rate; rate_bps null for amounts without a stored rate.

      Child fields (4)
      • rate_bpsintegerrequirednullable

        The rate in basis points (700 = 7 %). null: no rate was stored for this part (not the same as 0 %); then net and tax are null.

      • grossintegerrequired

        Gross amount at this rate. Integer amount in the smallest currency unit (cents).

      • netintegerrequirednullable

        gross − tax, in cents. null when rate_bps is null.

      • taxintegerrequirednullable

        VAT contained in gross: round(gross × rate / (10000 + rate)), in cents. null when rate_bps is null.

    • by_payment_methodobjectrequired

      Split by payment method.

      Child fields (2)
      • onlinePaymentSplitrequired

        Orders, gross (without tips) and tips of one part.

        Child fields (3)
        • ordersintegerrequired

          Counted orders.

        • grossintegerrequired

          Gross without tips. Integer amount in the smallest currency unit (cents).

        • tipsintegerrequired

          Tips. Integer amount in the smallest currency unit (cents).

      • on_sitePaymentSplitrequired

        Orders, gross (without tips) and tips of one part.

        Child fields (3)
        • ordersintegerrequired

          Counted orders.

        • grossintegerrequired

          Gross without tips. Integer amount in the smallest currency unit (cents).

        • tipsintegerrequired

          Tips. Integer amount in the smallest currency unit (cents).

    • by_typeobjectrequired

      Split by order type.

      Child fields (3)
      • pickupPaymentSplitrequired

        Orders, gross (without tips) and tips of one part.

        Child fields (3)
        • ordersintegerrequired

          Counted orders.

        • grossintegerrequired

          Gross without tips. Integer amount in the smallest currency unit (cents).

        • tipsintegerrequired

          Tips. Integer amount in the smallest currency unit (cents).

      • deliveryPaymentSplitrequired

        Orders, gross (without tips) and tips of one part.

        Child fields (3)
        • ordersintegerrequired

          Counted orders.

        • grossintegerrequired

          Gross without tips. Integer amount in the smallest currency unit (cents).

        • tipsintegerrequired

          Tips. Integer amount in the smallest currency unit (cents).

      • dine_inPaymentSplitrequired

        Orders, gross (without tips) and tips of one part.

        Child fields (3)
        • ordersintegerrequired

          Counted orders.

        • grossintegerrequired

          Gross without tips. Integer amount in the smallest currency unit (cents).

        • tipsintegerrequired

          Tips. Integer amount in the smallest currency unit (cents).

    • cancelledobjectrequired

      Orders placed (and paid, if online) and later cancelled; not part of the figures above.

      Child fields (2)
      • ordersintegerrequired

        How many.

      • grossintegerrequired

        Their totals. Integer amount in the smallest currency unit (cents).

Errors

  • 400invalid_request: a parameter or the body is wrong, or it contains a query parameter or field the operation does not know. param names the field.
  • 401unauthorized: missing, malformed, expired or revoked access token, or the app was disconnected or suspended.
  • 403insufficient_scope, plan_required (with param when an order type is not in the plan) or account_inactive.
  • 429rate_limited: more than 120 requests per minute on this connection. Wait Retry-After seconds.
  • 500server_error. Safe to retry with the same Idempotency-Key.

All error codes

Request
curl "https://api.flavoso.com/v1/reports/sales?from=2026-10-01&to=2026-10-31" \
  -H "Authorization: Bearer $ACCESS_TOKEN"
Response
{
  "object": "sales_report",
  "currency": "EUR",
  "timezone": "Europe/Berlin",
  "from": "2026-10-05",
  "to": "2026-10-11",
  "group_by": "week",
  "totals": {
    "period_start": "2026-10-05",
    "period_end": "2026-10-11",
    "orders": 182,
    "gross": 451230,
    "net": 410954,
    "tax": 40276,
    "tips": 12840,
    "delivery_fees": 21000,
    "service_fees": 0,
    "discounts": 3150,
    "by_tax_rate": [
      {
        "rate_bps": 700,
        "gross": 353210,
        "net": 330103,
        "tax": 23107
      },
      {
        "rate_bps": 1900,
        "gross": 98020,
        "net": 82851,
        "tax": 15169
      }
    ],
    "by_payment_method": {
      "online": {
        "orders": 121,
        "gross": 301900,
        "tips": 10210
      },
      "on_site": {
        "orders": 61,
        "gross": 149330,
        "tips": 2630
      }
    },
    "by_type": {
      "pickup": {
        "orders": 96,
        "gross": 201140,
        "tips": 4120
      },
      "delivery": {
        "orders": 64,
        "gross": 196300,
        "tips": 7380
      },
      "dine_in": {
        "orders": 22,
        "gross": 53790,
        "tips": 1340
      }
    },
    "cancelled": {
      "orders": 4,
      "gross": 9870
    }
  },
  "buckets": [
    {
      "period_start": "2026-10-05",
      "period_end": "2026-10-11",
      "orders": 182,
      "gross": 451230,
      "net": 410954,
      "tax": 40276,
      "tips": 12840,
      "delivery_fees": 21000,
      "service_fees": 0,
      "discounts": 3150,
      "by_tax_rate": [
        {
          "rate_bps": 700,
          "gross": 353210,
          "net": 330103,
          "tax": 23107
        },
        {
          "rate_bps": 1900,
          "gross": 98020,
          "net": 82851,
          "tax": 15169
        }
      ],
      "by_payment_method": {
        "online": {
          "orders": 121,
          "gross": 301900,
          "tips": 10210
        },
        "on_site": {
          "orders": 61,
          "gross": 149330,
          "tips": 2630
        }
      },
      "by_type": {
        "pickup": {
          "orders": 96,
          "gross": 201140,
          "tips": 4120
        },
        "delivery": {
          "orders": 64,
          "gross": 196300,
          "tips": 7380
        },
        "dine_in": {
          "orders": 22,
          "gross": 53790,
          "tips": 1340
        }
      },
      "cancelled": {
        "orders": 4,
        "gross": 9870
      }
    }
  ]
}

Product sales report

get/reports/products

Scope:
reports:read
Plan:
every plan

The best-selling dishes of a period: quantity and the sum of their order lines (price including options, before order discounts), counted like the sales report. A dish deleted from the menu appears under its name with product_id: null. A ranking without pages: has_more says whether more dishes sold than limit.

Parameters

NameInDescription
fromstring (date)requiredqueryFirst day of the report, a local date of the restaurant (YYYY-MM-DD). Included.
tostring (date)requiredqueryLast day of the report, a local date (YYYY-MM-DD). Included. At most 366 days after from.
limitintegerqueryHow many dishes, 1 to 100. Default 25.1 to 100 · default 25

Response200

OK

  • objectstringrequired

    Always list.

    Values:"list"

  • dataProductSales[]required

    The items of this page.

    Child fields (5)
    • objectstringrequired

      Always product_sales.

      Values:"product_sales"

    • product_idstring (uuid)requirednullable

      The dish; null when it was deleted from the menu.

    • namestringrequired

      The dish's latest name in the period.

    • quantityintegerrequired

      Units sold.

    • grossintegerrequired

      Sum of its order lines (incl. options, before order discounts). Integer amount in the smallest currency unit (cents).

  • has_morebooleanrequired

    Whether another page follows.

  • next_cursorstringrequirednullable

    Pass as cursor (with the same filters) to get the next page; null on the last page.

Errors

  • 400invalid_request: a parameter or the body is wrong, or it contains a query parameter or field the operation does not know. param names the field.
  • 401unauthorized: missing, malformed, expired or revoked access token, or the app was disconnected or suspended.
  • 403insufficient_scope, plan_required (with param when an order type is not in the plan) or account_inactive.
  • 429rate_limited: more than 120 requests per minute on this connection. Wait Retry-After seconds.
  • 500server_error. Safe to retry with the same Idempotency-Key.

All error codes

Request
curl "https://api.flavoso.com/v1/reports/products?from=2026-10-01&to=2026-10-31" \
  -H "Authorization: Bearer $ACCESS_TOKEN"
Response
{
  "object": "list",
  "data": [
    {
      "object": "product_sales",
      "product_id": "2d6f8a1c-3e5b-4d7f-9a2c-4e6b8d0f2a46",
      "name": "Pizza Margherita",
      "quantity": 214,
      "gross": 176550
    }
  ],
  "has_more": true,
  "next_cursor": null
}

Still unclear? Write to support@flavoso.com and include the id from X-Request-Id. It lets us find your request in the log.