At nine in the morning, you open the dashboard and the timestamps on the three order reports are all stuck at seven forty-two. You refresh five times, restart the sync tool, clear the browser cache—the numbers don't budge. The problem almost never lies in the act of "refreshing" itself, but in one of the four stages of the pipeline between the platform API and the pixels on your screen. Walking through them in order saves at least twenty minutes compared to random restarts.
When Reports Are Stuck, First Confirm Which Layer You Are Restarting
"Restarting the sync tool" only covers the sync aggregation layer. If the root cause is an expired source-side token, a platform-side rate limit trigger, or a broken permission routing path, restarting is like hammering nails into a wall. Pinpoint which layer is broken before you act, to avoid burning an entire morning on the wrong layer. If you are still managing multiple stores by switching between multiple windows and doing manual reconciliation, take five minutes to cross-reference with Multi-Account Store Management Tools and Workflow Breakdown the tool tier determination logic in the three-layer separation framework, and confirm which tier you are currently in.

Stage One: Platform Source — Is the API Actually Returning New Data?
The first segment of the pipeline is on the platform side. Three criteria you can verify the same day:
- Token Expiry:Log in to each platform's developer console and check the expires_in value of the current access token. When less than 2 hours remain and auto-renewal fails, all incremental pulls return 401, and the sync log may still show "request successful" while the body is empty. Fix: reissue the token and confirm the renewal callback URL has not been misconfigured.
- Rate Limit Triggered:Search your sync logs for HTTP status codes. A recent surge of 429 responses instead of 200 responses indicates the platform has throttled requests, meaning incremental data never entered the pipeline. Fix: implement exponential backoff based on the Retry-After header, or shift your scheduling window to avoid platform peak hours.
- Incremental Cursor Stuck:Check the last_cursor or last_updated field recorded by your sync script. If it is frozen at all 0, a negative value, or a timestamp from three days ago, subsequent incremental pulls will always be empty. Fix: manually reset the cursor to the most recent timestamp that had data, then trigger one pull to confirm recovery.
Stage Two: Sync & Aggregation Layer — Logs Are All Green but No Data Reached the Database
Typical Patterns of Silent Failure:After a platform API upgrade, field mappings no longer align (new fields lack default values, old fields have been renamed); concurrent writes across multiple stores create race conditions where later writes overwrite earlier ones; or an aggregation job is skipped by the scheduler but the alert threshold does not cover that job. In all three cases the sync log shows a green "success" while the number of rows written to the database is zero.
5-Minute Verification Method:Manually trigger a full (not incremental) pull for a single store, then compare the rows written to the database against the platform backend's "New Orders Today" figure. Platform shows 47 orders, database has 0 rows—the problem is at this layer; database has 47 rows—proceed to the next step.
The troubleshooting logic for silent sync failures is highly isomorphic to that of inventory sync. If you are simultaneously experiencing data mismatches on both the inventory and reporting sides, refer to the 4-layer troubleshooting approach for multi-store inventory sync failures for the minimal fix actions addressing field mapping and timing race conditions. The methodology can be reused as-is.
Stage Three: Report Calculation and Caching—Front-End Refresh ≠ Back-End Recalculation
"Not refreshing" has three distinctly different root causes, with diagnostic criteria as follows:
- Browser-side cache not invalidated:Press Ctrl+Shift+R in the address bar to force-bypass the cache. If the numbers update immediately, the issue is front-end only—simply configure a no-cache header on the Service Worker or CDN.
- Server-side precomputation task not triggered:Check the scheduling logs of the reporting service. If the last execution time was "three days ago" rather than the expected cycle, the task was skipped or a worker is down. Fix: manually trigger a full recalculation, then verify the scheduler's health status and the number of worker processes.
- Aggregated table TTL not yet reached:If the report is built on a T+1 aggregated wide table, today's data is not supposed to enter the table until tomorrow. This is not a fault—it is by design. Simply confirm that the TTL strategy is consistent with the team's expectations; no fix is required.

Step Four: Multi-Store Routing and Permissions — Your Account Never Sees That Store's Data
This is the most hidden yet most common root cause. Two high-frequency scenarios: the visible store scope of the customer service sub-account was not synced after a new TikTok Shop was opened at the end of last month, and that store's data was routed into the "Unassigned" bucket; or the data isolation fields are partitioned by platform dimension, and after a new platform launched, incremental data landed in an unowned partition. What customer service receives is always a stale snapshot — when replying to buyers, they quote inventory figures from three days prior — which is exactlyHow to Optimize Slow Multi-Store Customer Service Responsethe hidden upstream issue: if the data source has not arrived, no matter how fast the response is, it is still wrong.
72-Hour Permission Verification Checklist (execute in order):
- Log in with each sub-account one by one and confirm that the "Visible Stores" list includes all active platform accounts, with no omissions.
- Check the data routing table: verify that incremental data for each platform × each store has an assigned partition. A search for "Unassigned" records should return zero.
- Have customer service trigger a real query (e.g., "real-time inventory for a specific SKU today"), compare it against the platform backend figures, and confirm the delay does not exceed 5 minutes.
If the permission matrix itself has not been built yet, start by defining roles based on the degree of action irreversibility, then lock down data isolation rules field by field. The complete configuration steps and go-live verification checklist are in Multi-Store Sub-Account Permission Configuration Tutorial has field-by-field implementation notes that you can reference directly to fill in any gaps.
Frequently Asked Questions
After restarting the sync tool, how long should data recovery take before it is considered normal?
It depends on the sync cycle. If the normal cadence is one incremental pull every 15 minutes, the first pull after restart should complete within 1 minute and the dashboard should update within 2 minutes. If there is still no update 10 minutes after restart, the issue is not with the tool process—go back to the first stage and check the token or rate limit.
How do you handle inconsistent timestamps across multi-platform reports?
First, confirm whether each platform's API data output cadence differs (e.g., Amazon's order API has roughly a 30-minute delay, while TikTok Shop is near real-time). Once expectations are aligned, label each data source's "data available time" on the dashboard instead of displaying a uniform "last updated" time, so the team does not misinterpret the gap as a failure.
Is a slow customer service response always a reporting issue?
Not necessarily. First check whether the data source behind the customer service query tool is real-time. If the source itself is a T+1 aggregated table, no matter how fast the agent responds, they can only reference outdated data. Follow Step Three to confirm the cache TTL, then follow Step Four to confirm whether that customer service account can see the target store. Only after ruling out data accessibility should you look at the response workflow itself.
How do you set up alerts so you catch issues before things get stuck again?
Add a heartbeat check at the sync aggregation layer: every 10 minutes, compare the "latest order timestamp in the platform backend" with the "latest timestamp in the local database." If the difference exceeds 2 sync cycles, push an alert to the ops channel. Add a change notification at the permission layer: whenever the visible store list of any sub-account is modified, automatically send a confirmation request to the permission administrator.

