- Browser capture
- Shopify Web Pixel: ttclid from the landing URL and the _ttp cookie when the TikTok Pixel has set it
- Purchase sent as
- CompletePayment, with value, currency and the products in the order
- Event ID
- shopify_order_ plus the order ID for purchases, which the TikTok app does not know about
- Page views
- Sent as ViewContent, because the Events API has no page view event
- Match data
- ttclid and ttp as they are; email, phone and external ID hashed with SHA-256; IP address and user agent
- Consent
- Follows Shopify's Customer Privacy status
- Refunds
- Not sent to TikTok. The event list has no refund equivalent
- Risk
- Double counting if the TikTok app also sends the same events
Why TikTok counts twice on Shopify if you do nothing
TikTok's help centre says deduplication is required when you share the same events through both the Pixel and the Events API, and that you must share the event ID through both for it to happen. Events that carry the identical event name and event ID within 48 hours are treated as one, with the first received kept. The Events API documentation adds that a low Server and Browser number points to a deduplication problem.
Shopify's TikTok app has three data sharing levels. Standard uses only the TikTok Pixel in the browser. Enhanced adds the Events API and Advanced Matching. Maximum adds Shopify's APIs on top. So at Enhanced or Maximum the app is a second server-side sender next to SignalBridge, and you would get three copies of a purchase.
Even at Standard there is an overlap. The TikTok Pixel in the browser sends CompletePayment, AddToCart, InitiateCheckout, AddPaymentInfo and ViewContent, and SignalBridge sends the same events by server. SignalBridge's Web Pixel runs in Shopify's sandbox and cannot put an event ID on a call the TikTok app makes, so the two copies have different IDs and nothing links them. TikTok's guidance is that you do not need deduplication when the two channels send different events, for example browser AddToCart and server purchases. That is the setup to aim for.
Who should send which event
SignalBridge sends ViewContent, AddToCart, InitiateCheckout, AddPaymentInfo and CompletePayment, and the TikTok app's Pixel sends the same five. The TikTok app lets you choose the exact events it tracks from its Analytics page, so use that to give each event one owner.
| TikTok event | Who should send it | Reason |
|---|---|---|
| CompletePayment | SignalBridge only | This is the event campaigns optimise for, and the one most exposed to blockers and to double counting. Turn it off in the TikTok app. |
| The other event your campaigns optimise for, if it is not a purchase | SignalBridge only | Whatever TikTok optimises on must not be counted twice. Turn it off in the TikTok app as well. |
| ViewContent, AddToCart, InitiateCheckout and AddPaymentInfo that you only watch | Both can send, with inflated counts | The two copies cannot be merged, so the counts overstate real activity. Read them as signals, not as exact numbers. |
What TikTok receives from SignalBridge on Shopify
Each Shopify event is mapped to a TikTok standard event, with the data TikTok uses for matching attached.
| Shopify event | Sent to TikTok as | What is attached |
|---|---|---|
| page_viewed | ViewContent | The page URL and referrer, ttclid and ttp when known. TikTok has no page view event, so every page view arrives as ViewContent. |
| product_viewed | ViewContent | Product ID, name, price and currency. |
| product_added_to_cart | AddToCart | Product, quantity, value and currency. |
| checkout_started and contact info entered | InitiateCheckout | Cart contents, total and currency. |
| payment_info_submitted | AddPaymentInfo | Checkout contents and total. |
| checkout_completed | CompletePayment | Value, currency, the products with price and quantity, hashed email, phone and external ID, and the event ID shopify_order_ plus the order ID. |
Match data and consent on Shopify
The ttclid is the highest-value field and is read from the landing URL by the Web Pixel when a shopper arrives from a TikTok ad. The _ttp cookie is read through Shopify's cookie access, so it is present only after the TikTok Pixel has set it in that browser. If the TikTok app is removed, expect no ttp and rely on the ttclid, email and phone.
Email and phone come from the checkout contact step or the signed-in customer. They are normalised and hashed before they leave SignalBridge. The external ID is a hash of the Shopify customer ID once it exists, otherwise of a visitor identifier.
Consent follows Shopify's Customer Privacy status. When marketing use is not allowed, the browser copy is recorded but not sent to TikTok. The order webhook carries no consent decision, so for a store that uses only the Shopify app its purchase copy is not forwarded to TikTok. Refunds and cancellations are not part of TikTok's event list, so they are never sent.
Set it up
Allow about fifteen minutes. Make the TikTok app changes before you test.
Install the SignalBridge app
Install it from the Shopify App Store and approve the permissions. The Web Pixel starts capturing events and storing the ttclid. No theme code is involved.
Find the Pixel the TikTok app uses
In TikTok Events Manager open the Pixel that the TikTok app on Shopify created. SignalBridge must send to this same Pixel so TikTok attributes server events and browser events to one place.
Connect TikTok in SignalBridge
Open the pixel's settings, choose TikTok Ads and sign in, then select that Pixel. If the Pixel does not appear, enter its Pixel Code manually together with an access token from Events Manager and your advertiser ID.
Set the TikTok app to Standard
Open the TikTok app in Shopify admin and choose the Standard data sharing level, as described in TikTok's Shopify help. That removes the app's own Events API connection.
Turn off Complete Payment in the TikTok app
On the TikTok app's Analytics page switch off the Complete Payment event, and any other event your campaigns optimise for, as described in the table above. This is what stops the double count, so do not skip it.
Add a custom tracking domain
Create a subdomain such as data.yourstore.com, point a CNAME at the SignalBridge tracking host and select it in the pixel settings, so Web Pixel requests stay first-party.
Send a test event
Copy the current Test Events code from Events Manager, paste it into the Test field on the TikTok card and run the test. A server event should appear in the Test Events tab.
Test it with a real order
Click a TikTok ad and place an order
Use a browser that has accepted marketing tracking. Click your ad, so the landing URL carries a ttclid, then buy a low-value product. In the SignalBridge event stream the Purchase should show TikTok as delivered.
Look at the event in Events Manager
Open the Pixel and find CompletePayment in the event list. With the TikTok app switched off for this event, it should appear as Server only, once per order.
Read the Server and Browser column
TikTok's documentation says that column counts events received from both channels as one. For events you assigned to a single sender, Browser or Server alone is the expected result. A purchase showing in both Browser and Server means two senders are still active.
Compare with Shopify after a day
Count CompletePayment for yesterday and compare it with the orders that came from TikTok in Shopify. A figure well above your orders means a second sender. A figure near your orders means one sender is working.
Problems that are specific to Shopify
TikTok shows about twice as many purchases as Shopify
The TikTok app's Pixel or Events API is still sending Complete Payment. Switch the event off on the app's Analytics page and set the app to Standard.
ViewContent is much higher than product views
SignalBridge sends every page view as ViewContent, because the Events API has no page view event, and the TikTok app sends its own ViewContent for product pages. Treat the count as activity, not as product views.
Events from the TikTok app and SignalBridge are never marked as Server and Browser
Expected on Shopify. The two copies have different event IDs, so TikTok cannot merge them. Use one sender for each event instead.
No ttp on server events
The _ttp cookie exists only after the TikTok Pixel has run in that browser, and consent can delay it. Matching continues with the ttclid, email and phone.
Purchases appear in a different currency
Shopify gives the currency with every checkout event. If a value ever arrives without one, SignalBridge sends USD, so set your store's default currency in the pixel settings.
Events stop after weeks of working
TikTok rejected the access token. Delivery pauses and the dashboard asks you to reconnect. Sign in again from the TikTok card.
What to know before you rely on it
- Without a consent decision saved on the order, the order webhook's purchase is not sent to TikTok, so the browser copy carries the purchase.
- Refunds, cancellations and fulfilments are not reported to TikTok.
- TikTok decides attribution. Ads Manager and SignalBridge will not agree exactly.
- Orders created in the Shopify admin or at the point of sale have no browser session, so they have no ttclid and are not sent.
Questions about this setup
Do I have to uninstall Shopify's TikTok app?
No. Keep it for the catalogue, ads and its browser Pixel. Set its data sharing to Standard and turn off the events your campaigns optimise for, starting with Complete Payment.
Why is deduplication harder on TikTok than on Meta?
TikTok's documentation names only one rule: the same event name and event ID. Meta documents a second fallback on fbp and external ID. Without a shared ID on Shopify, TikTok has no way to link the two copies.
Does this work for stores that only use SignalBridge for TikTok?
Yes. If you remove the TikTok app and its Pixel, SignalBridge is the only sender and nothing overlaps. You lose the browser Pixel and the ttp cookie, so matching leans on the ttclid, email and phone.
Which TikTok event is a Shopify order?
CompletePayment. SignalBridge maps Purchase to it. It does not send a separate PlaceAnOrder unless that event is sent explicitly.
What is the event ID for an order?
shopify_order_ followed by the numeric Shopify order ID. It is the same on the browser copy and the webhook copy, so a retry is safe.
Is hashing applied to the ttclid?
No. TikTok expects the ttclid, ttp, IP address and user agent unhashed. Email, phone and external ID are hashed with SHA-256.
Sources
The vendor documents this guide relies on. Statements about SignalBridge come from the product itself.
- TikTok For Business: Data sharing on the TikTok app on ShopifyThe Standard, Enhanced and Maximum levels and the methods each one uses.
- TikTok Ads Manager: About event deduplicationThe event name plus event ID rule, the 48-hour window and when deduplication is not needed.
- TikTok Events API: Verify events setupThe Browser, Server, and Server and Browser columns on the Pixel page.