Connecting Concrete CMS to TikTok Events API
Concrete CMS is a self-hosted PHP CMS used by small organisations and agencies, typically with commerce added through an add-on rather than built in. TikTok's audience skews to exactly the browsers and app contexts where browser-side tracking performs worst. The join between them succeeds or fails on one thing: whether the ttclid reaches the Concrete CMS order before the conversion happens, because TikTok can only match a conversion it can tie back to a click it recognizes.
Free30 minutesNo obligation
Specific to this pair
Concrete CMS to TikTok: ttclid caught before the cache answers
Capture ttclid with a script into a first-party cookie, since cached Concrete CMS pages skip PHP, and store it with _ttp and the order's email and phone as order attributes. Send CompletePayment through the Events API from the commerce add-on's order-completed event, with the order number as event_id shared with the pixel. Enquiry sites send SubmitForm.
TikTok visitors land in the in-app browser, and on a Concrete CMS site that first request is often served from full page cache, so any PHP that reads ?ttclid= from the URL never runs. Capture ttclid with a small script into a first-party cookie, then read that cookie when the commerce add-on creates the order and store it as an order attribute, alongside the _ttp cookie value and the order's email and phone.
Send CompletePayment from the add-on's order-completed event through the Events API, with the order number as event_id and the same event_id on any browser CompletePayment so TikTok can deduplicate. Value and currency come from the add-on's order totals. Because Concrete commerce runs on your own domain, the in-app browser usually holds the session through checkout, unless your payment gateway redirects off-site. Check which gateway your add-on uses: a PayPal or hosted-gateway redirect out of TikTok's in-app browser is exactly where TikTok orders go missing, and the server event is what recovers them.
For Concrete sites that only take enquiries, send SubmitForm when the Express form entry is saved, with the ttclid copied into a hidden field. The TikTok pixel itself can go in Concrete's Tracking Codes setting, but exclude it from cached confirmation pages for the same reason as the order hook: a cached page replays stale values. The order hook name differs by add-on and version, so confirm it rather than copying code from another Concrete site.
Concrete CMS → TikTok · what breaks
Why this join usually fails — Concrete CMS → TikTok
- 01
The ttclid never reaches Concrete CMS
Full page caching and the add-on ecosystem both interfere. Because commerce is an add-on rather than core, where the order is created differs by which add-on is installed.
- 02
Commerce as an add-on, not a core feature
Which add-on is installed determines the entire integration surface, so nothing transfers between two Concrete sites without checking first.
- 03
The ttclid is lost in the in-app browser
TikTok traffic arrives through an in-app webview whose storage behavior is inconsistent. An identifier captured but not immediately persisted server-side often is not there by the time the conversion happens.
- 04
Nothing reconciles afterwards
TikTok Events Manager shows received events and their match status. As with Meta, arriving is not the test — deduplicated and matched is. Reconcile TikTok's reported conversions against the source system for the same window.
Concrete CMS → TikTok · the fix
What working looks like — Concrete CMS → TikTok
The ttclid on every order
Conversions arriving in TikTok
Events appear in TikTok Events Manager, deduplicated against the pixel, and become usable for optimization.
Reconciled against the source
Concrete CMS → TikTok · architecture
How Concrete CMS and TikTok actually connect
- 1
Concrete CMS holds the truth
Self-hosted means you own and can query the data directly, which makes reconciliation straightforward once the identifier is present.
- 2
TikTok Events API needs a click to match
TikTok matches server events using ttclid where available, falling back to hashed contact information. Both should be sent — the fallback is what carries the events where the click ID did not survive.
- 3
The identifier is the bridge
The ttclid, captured at the visit and carried into the Concrete CMS order.
- 4
The event source decides reliability
Fire server-side. Page caching means the confirmation template may not execute.
- 5
Deduplication at the destination
TikTok deduplicates on event_id, the same pattern as Meta: the pixel and the Events API must send the same event_id for the same conversion. Mismatched IDs mean double counting.
Concrete CMS → TikTok · normal or broken
Working vs. broken, side by side — Concrete CMS → TikTok
Normal, not a fault
The ttclid present on the order
Sent from the order-completed event from your commerce add-on
Deduplicated correctly
TikTok deduplicates on event_id, the same pattern as Meta: the pixel and the Events API must send the same event_id for the same conversion. Mismatched IDs mean double counting.
Reconciles with the source
Actually broken
The ttclid missing on most records
Full page caching and the add-on ecosystem both interfere. Because commerce is an add-on rather than core, where the order is created differs by which add-on is installed.
Sent from the browser
Which add-on is installed determines the entire integration surface, so nothing transfers between two Concrete sites without checking first.
Counted twice, or not at all
TikTok traffic arrives through an in-app webview whose storage behavior is inconsistent. An identifier captured but not immediately persisted server-side often is not there by the time the conversion happens.
Nobody has reconciled it
Concrete CMS → TikTok · diagnose
Diagnostic order — Concrete CMS → TikTok
- 01
Count orders carrying the ttclid
- 02
Follow one real conversion end to end
- 03
Identify which commerce add-on is in use
That decides where the order is created and what events exist to hook.
- 04
Measure ttclid capture rate on TikTok traffic specifically
Not on all traffic. TikTok's in-app browser is the failure case, so a healthy overall capture rate can hide a poor one on exactly the traffic that matters.
- 05
Read the match rate, not the success message
TikTok Events Manager shows received events and their match status. As with Meta, arriving is not the test — deduplicated and matched is. Reconcile TikTok's reported conversions against the source system for the same window.
Concrete CMS → TikTok · prove
How it gets proven — Concrete CMS → TikTok
Source of truth
Your own database's order records, at agreed states.
- The ttclid confirmed present on a live order.
- Deduplication confirmed in Events Manager, and ttclid capture rate measured on TikTok traffic specifically.
- Order attribute confirmed populated on a purchase through a cached page.
Concrete CMS → TikTok · free audit
What we check in the free audit
- Count orders carrying the ttclid
- Follow one real conversion end to end
- Identify which commerce add-on is in use
- Measure ttclid capture rate on TikTok traffic specifically
- Read the match rate, not the success message
Checked against
Your own database's order records, at agreed states.
Free30 minutesNo obligation
Concrete CMS → TikTok · when not to buy
When you don't need this — Concrete CMS → TikTok
- Measure identifier coverage yourself first — pull your last hundred orders and count how many carry the ttclid.
- If your Concrete site is brochure-only with enquiries by form, treat it as a lead-gen site rather than a commerce one.
- If TikTok is a small share of spend, the effort is hard to justify. It pays when TikTok is a channel you are actively scaling.
Concrete CMS → TikTok · what we deliver
What gets built — Concrete CMS → TikTok
Identifier capture into Concrete CMS
Capture the identifier and persist it as order attribute data through an event listener, server-side.
Event source: the order-completed event from your commerce add-on
Fire server-side. Page caching means the confirmation template may not execute.
Dispatch to TikTok
Server events to the TikTok Events API with the ttclid, hashed contact information and a matching event_id.
Reversals where they exist
Order state changes recorded by the add-on.
Written guarantee
95%+ tracking accuracy
Measured against Your own database's order records, at agreed states.. Miss it and we keep working at no cost.
From $400 · See packages
FAQ
Concrete CMS → TikTok questions, answered
Often the ttclid was lost because the landing page came from cache, or the payment gateway redirected out of TikTok's in-app browser. Capture ttclid client-side into a cookie and send CompletePayment server-side from the order event.
Check the Concrete marketplace for your version. Most setups add the TikTok pixel through Concrete's Tracking Codes setting and send server events with a custom event listener.
Almost always because the ttclid never reached the Concrete CMS order. Full page caching and the add-on ecosystem both interfere. Because commerce is an add-on rather than core, where the order is created differs by which add-on is installed. Measure coverage before debugging the dispatch.
The ttclid — TikTok's click identifier, appended to your landing page URL and also stored in the _ttp cookie. TikTok additionally matches on hashed email and phone. In-app browser behavior makes ttclid capture more fragile than the equivalents on other platforms, so persisting it server-side as soon as it is seen matters more here than elsewhere.
The order-completed event from your commerce add-on. Fire server-side. Page caching means the confirmation template may not execute.
TikTok Events Manager shows received events and their match status. As with Meta, arriving is not the test — deduplicated and matched is. Reconcile TikTok's reported conversions against the source system for the same window.
More on Concrete CMS → TikTok
- Craft → TikTokConnecting Craft CMS to TikTok Events API
- Concrete CMS → Google AdsConnecting Concrete CMS to Google Ads
- Concrete CMS → MetaConnecting Concrete CMS to Meta Conversions API
RELATED GUIDES
Where Concrete CMS → TikTok fits in the rest of your tracking
- TikTok · Local servicesTikTok Ads conversion tracking for local service businesses
- TikTok · EcommerceTikTok Ads conversion tracking for ecommerce brands
- TikTok × Ecommerce OrdersHow to reconcile TikTok Ads against your store's order table
- TikTok · Comparison page → demoHow to track comparison page visit to demo request for TikTok Ads
- Drupal Commerce → TikTokConnecting Drupal Commerce to TikTok Events API
- Concrete CMS → QuoraConnecting Concrete CMS to Quora Ads
- Local servicesConversion tracking for local businesses, where most conversions bypass the website
- Sanity → TikTokConnecting Sanity to TikTok Events API
Free · 30 min
Get Concrete CMS and TikTok joined properly
Free30 minutesNo obligation
