Orders & revenue

Sync TikTok Shop orders to Google Sheets, one SKU per row

Authorize your TikTok Shop shop on Quantri360 Partner, choose the "Processed orders" type, a Google Sheets destination and a run schedule. Each row is one SKU with standardized status, discounts, shop voucher and shipping. Marketplace fees and settlement amounts are pulled separately through the finance API.

The problem: why are TikTok Shop export files hard to use for management?

Manual export files are hard to use because they mix several layers of information and lack consistent meaning. One order has many products, each product has its own discount, and shop vouchers and marketplace vouchers share a column. The "Đã hủy" (Cancelled) status covers both customer cancellations and failed deliveries.

Shops running livestreams often have a few hundred to a few thousand orders each week. Staff spend the morning downloading files, merging them and fixing columns. By the afternoon the numbers are old, because orders are still being delivered.

You need a table where each row has a clear meaning, that updates automatically, and where the reader does not have to guess which column holds which money.

Thinking leads the way: what data do you need, and how do you read it correctly?

TikTok Shop order data lives in three different APIs: order information, line-level price details, and return requests. The Quantri360 "Đơn hàng đã xử lý" (Processed orders) type calls all three and combines them into one flat table, one SKU per row.

Question Table column TikTok source
What stage is the order at? status (created, paid, shipping, delivered, delivery_failed, cancelled, returned, completed) and the original platform_status orders
How much did the customer pay for each SKU? item_unit_sale_price, item_line_discount, item_line_voucher price_detail
Which orders were returned? status = returned, returns_json returns/search
Shipped where, by which carrier? ship_province, ship_carrier, ship_tracking_code orders

Three traps to know before reading the numbers:

  • Failed deliveries sit inside cancelled orders. TikTok returns CANCELLED for both customer-cancelled orders and failed deliveries; only the cancellation reason ("Giao gói hàng thất bại", package delivery failed) separates the two. The 360 table already splits them into delivery_failed and cancelled. A truly returned order is one the customer received and then sent back, with a return request attached.
  • Discounts must match by line ID. Two SKUs at the same price in one order easily get the wrong discount if matched by price. The table uses item_line_id (the line ID issued by TikTok) as the key, not the row sequence number.
  • A blank marketplace fee means "unknown", not 0. Commission, transaction fees and settlement amounts only exist after TikTok settles, in the finance API. Blank platform_fee and escrow_amount cells mean there is no number yet. The 202309 version of statement_transactions has stopped returning data; use version 202501.

AI speeds it up: how long does setup take, and what are the steps?

Setup takes about 15 minutes with no code. You only need TikTok Shop owner permission and a Google account.

Note: The steps below that send data to Google Sheets automatically are part of Auto Data, which is temporarily closed and not accepting sign-ups. In the meantime, use the API method at the end of this section.

  1. Create an account at the Partner sign-up page and turn on two-factor authentication.
  2. Go to the TikTok Shop platform and authorize your shop. A brand with many shops authorizes each one once.
  3. Destinations → Google Sheets → sign in to Google. Leave the spreadsheet field blank and the system creates a new spreadsheet; the default tab is named Orders, and the first row holds the column headers.
  4. Connections: TikTok Shop → "Đơn hàng đã xử lý" (Processed orders) → the destination you just created → delivery method. Choose a schedule of hourly, daily at H:00 or weekly, or run it by hand when needed.
  5. Add filters if you want: only certain shops, only certain statuses (for example only delivered and returned for accounting).

The automatic schedule and realtime delivery are paid add-ons, with details in the pricing. Realtime (pushed as soon as TikTok reports a status change, batched every 10–60 seconds) is currently for brands using only the API product.

Prefer to program it yourself? Call the TikTok Shop order API through 360, which works today:

curl -s -X POST "https://partner.quantri360.com/v1/tiktok/order/202309/orders/search?page_size=50&platform_shop_id=<shop_id>" \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"update_time_ge":1760893200,"update_time_lt":1760979600}'

The result is TikTok's original data: a list of orders with next_page_token for the next page. Get details for up to 50 orders at a time with GET /v1/tiktok/order/202309/orders?ids=<order_id>.

Use AI to read the table. After a livestream session, copy that day's rows into ChatGPT or Claude:

"These are TikTok Shop orders for October 20, one SKU per row. Calculate by item_parent_sku: quantity sold, delivery_failed rate, returned rate. Do not merge delivery_failed into cancelled. Which codes have a failed delivery rate above 15%?"

AI does the calculation quickly. Choosing the right definition is still up to the manager.

Measurable results

Evaluate using the data in the table and the run log itself, with no outside numbers needed. The four metrics below are enough to tell whether the connection is worth keeping.

  • Staff hours: the time spent downloading and merging files each week before connecting, compared with after the table runs on its own.
  • Latency: the fetched_at column shows when 360 pulled the order from TikTok; compare it with the time you open the table.
  • Discrepancies found: the number of delivery_failed orders previously inside "cancelled", and the number of rows with different discounts between the manual file and the new table.
  • Fee coverage: the share of rows that have escrow_amount. Rows still blank are unsettled orders that need following up.

Google Sheets appends rows on each run and does not overwrite. When aggregating, keep the row with the latest fetched_at per order_id + item_line_id. For automatic overwrites, load into MySQL / PostgreSQL / SQL Server. If you also sell on Shopee, see the Shopee order table in Google Sheets.

Read more: business process automation, the overview article for this topic.

Quantri360
Written by Quantri360 · Management & data consulting team

Building Quantri360, a multichannel sales risk management platform; writing about managing with real data and applying AI to operations.

Updated
Message us on Messenger