The situation: your Shopify store carries the brand, and TikTok Shop drives impulse volume from short video. Both sell the same physical stock on the same shelf. The moment you manage two inventory counts by hand, you either oversell during a livestream or you leave stock artificially locked on one channel while the other runs dry. The fix is architectural: one source of truth, and both storefronts become projections of it.
Pick the system of record — and mean it
In most builds we make Shopify the master for product data and a small inventory service the master for stock. Every stock movement — a Shopify order, a TikTok Shop order, a supplier delivery, a manual correction — is written to that service first, and the two storefronts are updated from it. Neither storefront ever edits the other. This one rule kills the circular-update bugs that plague point-to-point connectors: Shopify tells TikTok, TikTok tells Shopify, and forty minutes later a phantom unit has appeared or vanished.
Webhook-driven sync in both directions
- Order placed on either channel → webhook received → inventory service decrements the shared count → the other channel's available quantity is pushed down.
- Cancellation or return → webhook → increment → push back up to both channels.
- Supplier goods-in → recorded once in the inventory service → both channels rise together.
- Nightly reconciliation → compare what each platform believes against the master, and alert on drift instead of silently overwriting it. Drift is a symptom; find the missed webhook that caused it.
Webhooks are fast but not guaranteed. Both platforms occasionally drop or delay deliveries, so the nightly pull-and-compare job is not optional — it is the safety net that makes the real-time layer trustworthy.
Oversell prevention: reserve buffers and atomic decrements
The classic failure is the flash sale. A creator mentions your product, two hundred people check out within a minute, and your sync loop — which reads the count, subtracts one, writes it back — loses updates because two orders read the same number. Stock check and decrement must be a single atomic operation: a conditional database update or an atomic counter, never read-then-write. If the decrement would go below zero, the order goes to a manual-review queue instead of a courier.
One fulfilment pipeline for both channels
A TikTok Shop order should land in exactly the same fulfilment flow as a Shopify order: normalise it into a common internal order format, book the ViettelPost pickup, print the label, push tracking updates back to the originating platform. We covered the courier side in detail in our ViettelPost automation guide, and the full architecture in the end-to-end stack article. The critical addition for TikTok Shop: the platform scores you on fulfilment speed, and penalty metrics accumulate if your automation lags. If your pickup-booking job runs hourly, make it event-driven instead; if your label printing waits for a human, remove the human.
Category and attribute mapping: the unglamorous 40%
TikTok Shop's category tree and required attributes do not match Shopify's product model. A listing that syncs "successfully" but into the wrong category gets suppressed in search or rejected on review. Build an explicit mapping table — Shopify product type → TikTok category ID plus required attributes — and treat unmapped products as errors that block publishing, not warnings. The same discipline applies to variants: size/colour option ordering differs between the platforms, and a silent mismatch means customers receive the wrong item.
Price and promotion sync rules
Decide the pricing relationship explicitly. Common patterns:
| Rule | Behaviour | Use when |
|---|---|---|
| Mirror | TikTok price always equals Shopify price | Simple catalogues, brand consistency |
| Offset | TikTok price = Shopify price plus channel-fee margin | Fee structures differ materially |
| Independent promos | Base price mirrors; platform campaigns run locally | You join TikTok flash-sale campaigns |
Whatever you choose, promotions must never desync the base price. When a TikTok campaign ends, the sync job should restore the mirrored price automatically — expired promos left at campaign price are one of the most common margin leaks we find in audits.
Settlement reconciliation: two payout streams, one ledger
TikTok Shop settles on its own cycle with its own fee lines; Shopify payouts (or your gateway's) arrive on another. Reconcile both against orders in a single ledger, the same way we described for cash on delivery in the COD reconciliation article: match settlement lines to order IDs, book fees per channel, and surface unmatched lines for review. Sellers who skip this discover the gap only at tax time — and if you issue e-invoices, both channels' orders must flow into the same invoicing pipeline (see our MISA AMIS integration guide).
Where to start
Begin with one-directional stock push and the nightly reconciliation, then add atomic decrements and buffers, then unify fulfilment. Marketing the channels — including auto-posting the videos that drive TikTok traffic in the first place — is its own pipeline, covered in our cross-platform posting article. Get the inventory truth right first; everything else compounds on top of it.