---
title: "Buyer-side payment breakdown"
method: POST
path: "/pnl/customer-payments"
tags: ["P&L"]
---

# Buyer-side payment breakdown

`POST /pnl/customer-payments`

What the CUSTOMER paid for each order x SKU, as opposed to what the seller earned: subtotal before and after discount, which party funded each discount, shipping, retail delivery fee and tax.

Paired to order lines on (order, SKU) to get a paid date, since this sheet carries none of its own. TikTok does not guarantee that pairing is 1:1, so a payment row with no matching order line falls outside the window rather than being invented into it.

## Request body

- PnlCustomerPaymentsRequest — POST /pnl/customer-payments request body — the buyer-side breakdown.
  - `start_date` string, date, nullable — Inclusive paid-date window start.
  - `end_date` string, date, nullable — Inclusive paid-date window end.
  - `product_id` string, nullable — Filter to one product.
  - `sku_id` string, nullable — Filter to one SKU.
  - `limit` integer — Page size.
  - `offset` integer — Page offset.

## Response `200`

Successful Response

- PnlCustomerPaymentsResponse — Buyer-side payment breakdown for one shop.
  - `shop_id` integer, required
  - `seller_id` string, required
  - `total` integer, required
  - `limit` integer, required
  - `offset` integer, required
  - `payments` PnlCustomerPaymentOut[], required
    - `order_id` string, required
    - `sku_id` string, required
    - `currency` string, required
    - `amounts` object — Buyer-side breakdown: subtotal before and after discount, who funded each discount, shipping, retail delivery fee and tax.
  - `data_status` PnlDataStatus, required — Freshness and reachability of this shop's P&L data. ``state`` distinguishes "no sales" from "we cannot read the finance export": ``no_permission`` means the shop's Seller Center account lacks finance-tab access and the fix is customer-side, not a retry.
    - `state` string, required — Latest export-run status: never_run | pending | parsed | empty | failed | no_permission.
    - `last_synced_at` string, nullable — ISO timestamp of the newest successfully parsed run.
    - `last_window` PnlDateWindow — The date window an export run requested.
      - `start_date` string, nullable
      - `end_date` string, nullable

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/reacherapp/apis/reacher-data-api.md) · [All operations](https://skmtc.dev/reacherapp/apis/reacher-data-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/reacherapp/reacher-data-api/revisions/3ea20a9f734b/schema)
