The problem: why does a manually entered Shopee order table always drift?
A manually entered order table drifts because it is a snapshot of one moment, while Shopee orders keep changing status for 7–15 days after being placed. A file exported on Monday morning does not know which order was returned on Thursday afternoon. The person making the report is also the one choosing the columns and filters.
A common situation: warehouse staff download the "Đã giao" (Delivered) file, the accountant downloads the "Doanh thu" (Revenue) file, and the shop owner looks at the number in the app. Three sources, three numbers. Nobody is entirely wrong, but nobody can answer "how much did we really sell this week?"
What you need is a table pulled straight from the Shopee API that updates itself without passing through the hands of whoever writes the report.
Thinking leads the way: what data do you need, and how do you read it correctly?
Each management question maps to its own Shopee data source. Use the wrong source and the number still looks reasonable but is wrong. The table below is the mapping Quantri360 uses for its own dashboard.
| Question | Shopee API | Field to read |
|---|---|---|
| How many orders are there, and which just changed status? | get_order_list |
order_sn, filter time_range_field=update_time |
| What did the customer buy, and how many? | get_order_detail |
item_list, order_status |
| Has the order reached the customer? | get_package_detail |
the package's logistics status |
| How much money does the shop actually receive? | get_escrow_detail |
escrow_amount_after_adjustment |
Three traps that have produced real errors:
- Failed deliveries still carry a completed status. Shopee keeps
order_status = COMPLETEDfor failed deliveries. Only the package status (LOGISTICS_DELIVERY_FAILED) tells you the goods came back. Filter byorder_statusand failed orders get added to revenue. - Money received is not the selling price. The order price has not yet deducted the fixed fee, service fee, payment fee or shop vouchers. The amount the shop receives is escrow after adjustment. In
get_escrow_detail, each product's price is the total for the whole line when the quantity is above 1; multiplying by quantity again doubles revenue. - The 15-day window and pagination.
get_order_listonly accepts atime_from–time_torange of up to 15 days. To pull a month you must split it into segments, and loop oncursoruntilmore = false. Forget either one and orders go missing with no error to warn you.
AI speeds it up: how long does setup take, and what are the steps?
The no-code route takes about 15 minutes, and the longest part is clicking to approve authorization on Shopee and Google. There are two routes; choose based on whether you need fixed columns or custom columns.
Route 1: scheduled connection on Partner (no code)
- Create an account at the Partner sign-up page and turn on two-factor authentication (required).
- Go to the Shopee platform page and authorize your shop. A brand with many shops authorizes each one.
- Under Destinations → Google Sheets → sign in to Google. Leave the spreadsheet field blank and the system creates a new spreadsheet in your Drive.
- Under Connections: choose Shopee → the order data type → the Google Sheets destination → a schedule of hourly, daily at H:00 or weekly (Vietnam time). You can filter by shop and status.
The first run pulls the last 24 hours, and later runs pull changes since the previous run (going back 5 minutes so as not to miss orders right at the boundary). The automatic schedule is a paid add-on: see the pricing.
Current note: the processed Shopee order type (one row per SKU, standard columns) is "Coming soon". The raw type is available now: one row per order, with a raw_json column holding Shopee's original response.
Route 2: custom columns with n8n or Apps Script
Call the Shopee API through 360 with one API key. You do not need your own Shopee app, and you do not send partner_id or a signature:
curl -s "https://partner.quantri360.com/v1/shopee/api/v2/order/get_order_list?time_range_field=update_time&time_from=1760893200&time_to=1760979600&page_size=50" \
-H "Authorization: Bearer $KEY"
After logging in, Docs has a ready-made n8n workflow template for Shopee: scheduled at 06:00, pulling yesterday's orders, looping on the cursor automatically. You only add a Google Sheets node. Details are in the Partner docs.
Use AI to read the table. Once the table updates itself, copy a week of data into ChatGPT or Claude with a clear question:
"These are Shopee orders for the last 7 days. Calculate the failed delivery rate by province, using only the package status, not order_status. List the top 5 provinces and the number of orders in each."
The more clearly your question states which column and which definition, the less AI has to guess.
Measurable results
Measure before and after over the same working week to know whether the tool is worth the money. The three metrics below can be measured with data you already have, with no estimates.
- Staff hours: time how long exporting, pasting and fixing columns takes during a week before connecting. Afterward this drops to 0.
- Data latency: check the connection's run log (run time, order count, errors). With an hourly schedule the latest orders are at most about one hour behind.
- Discrepancies found: count orders with a completed status but a failed delivery package, and the gap between selling price and escrow. That is the money previously miscounted.
Google Sheets only appends rows and does not overwrite. An order that changes status three times has three rows. When aggregating, keep the latest row by order_id. If you need in-place overwrites, see how to load orders into MySQL / PostgreSQL / SQL Server. To automate further steps (sending alerts, writing to a CRM), see Shopee with n8n.
Related APIs
- get_order_list: order list by creation or update window, up to 15 days per call.
- get_order_detail: details of up to 50 orders at a time, including the product list.
- get_package_detail: package status, the only place that shows failed delivery.
- get_escrow_detail: the money the shop actually receives and each fee on an order.
- get_return_list: return requests, separating returned orders from failed deliveries.
Read more: business process automation, the overview article for this topic.