[{"data":1,"prerenderedAt":677},["ShallowReactive",2],{"blog-tiktok-pixel-setup-en":3,"blog-ad-banners-en":649},{"id":4,"title":5,"excerpt":6,"content":7,"coverImage":592,"meta":600,"site":603,"status":623,"slug":624,"author":625,"category":635,"publishDate":643,"featured":290,"updatedAt":644,"createdAt":645,"contentHtml":646,"previewUrl":647,"localeSlugs":648},660,"TikTok Pixel Setup (2026): Events, Matching and the Server-Side Layer","A complete TikTok Pixel setup walkthrough: install methods, which events to fire, Advanced Matching and hashing rules, pre-spend validation, and why the Events API is standard rather than optional.",{"root":8},{"children":9,"direction":19,"format":15,"indent":13,"type":591,"version":18},[10,21,25,31,35,61,65,69,77,174,178,186,190,194,198,248,260,295,299,303,307,325,338,342,350,354,385,389,397,405,409,413,417,455,459,512,516,521,528,532,536,540,547,551,557,561,568,572,576,578],{"children":11,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[12],{"detail":13,"format":13,"mode":14,"style":15,"text":16,"type":17,"version":18},0,"normal","","Most TikTok Pixel guides stop at \"paste the code and you're done.\" That instruction is correct and almost useless, because the part that decides whether your campaigns can optimize is what happens after the snippet loads: which events fire, what identifiers travel with them, and whether TikTok can match those events back to the people who saw your ads.","text",1,null,"paragraph",{"children":22,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[23],{"detail":13,"format":13,"mode":14,"style":15,"text":24,"type":17,"version":18},"This guide walks the TikTok Pixel setup end to end — install, events, validation, and the server-side layer — with the failure modes called out at each step, because a pixel that is installed but mis-configured looks identical to a working one in the dashboard until you try to build an audience from it.",{"children":26,"direction":19,"format":15,"indent":13,"type":29,"version":18,"tag":30},[27],{"detail":13,"format":13,"mode":14,"style":15,"text":28,"type":17,"version":18},"What the TikTok Pixel actually does","heading","h2",{"children":32,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[33],{"detail":13,"format":13,"mode":14,"style":15,"text":34,"type":17,"version":18},"The pixel is a small JavaScript snippet you place on your site. When it loads, it does three things:",{"children":36,"direction":19,"format":15,"indent":13,"type":58,"version":18,"listType":59,"start":18,"tag":60},[37,44,51],{"children":38,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":18},[39,41],{"detail":13,"format":18,"mode":14,"style":15,"text":40,"type":17,"version":18},"Fires a page-level event",{"detail":13,"format":13,"mode":14,"style":15,"text":42,"type":17,"version":18}," so TikTok knows a visit happened.","listitem",{"children":45,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":50},[46,48],{"detail":13,"format":18,"mode":14,"style":15,"text":47,"type":17,"version":18},"Fires any additional events you define",{"detail":13,"format":13,"mode":14,"style":15,"text":49,"type":17,"version":18}," — a product view, a checkout start, a purchase.",2,{"children":52,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":57},[53,55],{"detail":13,"format":18,"mode":14,"style":15,"text":54,"type":17,"version":18},"Attaches identifiers",{"detail":13,"format":13,"mode":14,"style":15,"text":56,"type":17,"version":18}," to those events: a first-party cookie, the click identifier TikTok appends to your landing page URL, and optionally hashed customer data.",3,"list","number","ol",{"children":62,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[63],{"detail":13,"format":13,"mode":14,"style":15,"text":64,"type":17,"version":18},"That third point is the one most setups get wrong, and it is the one that determines reporting quality. An event without usable identifiers still appears in your event log. It just cannot be attributed to an ad, which means it contributes nothing to conversion optimization.",{"children":66,"direction":19,"format":15,"indent":13,"type":29,"version":18,"tag":30},[67],{"detail":13,"format":13,"mode":14,"style":15,"text":68,"type":17,"version":18},"Step 1: Create the pixel and decide on your install method",{"children":70,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[71,73,75],{"detail":13,"format":13,"mode":14,"style":15,"text":72,"type":17,"version":18},"In TikTok Ads Manager, the pixel lives under ",{"detail":13,"format":18,"mode":14,"style":15,"text":74,"type":17,"version":18},"Assets → Events → Web Events",{"detail":13,"format":13,"mode":14,"style":15,"text":76,"type":17,"version":18},". Creating one gives you a pixel ID and a choice of installation method:",{"children":78,"direction":19,"format":15,"indent":13,"type":173,"version":18},[79,101,124,146],{"children":80,"direction":19,"format":15,"indent":13,"type":100,"version":18},[81,88,94],{"children":82,"direction":19,"format":15,"indent":13,"type":87,"version":18,"backgroundColor":19,"colSpan":18,"headerState":18,"rowSpan":18},[83],{"children":84,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[85],{"detail":13,"format":13,"mode":14,"style":15,"text":86,"type":17,"version":18}," Method ","tablecell",{"children":89,"direction":19,"format":15,"indent":13,"type":87,"version":18,"backgroundColor":19,"colSpan":18,"headerState":18,"rowSpan":18},[90],{"children":91,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[92],{"detail":13,"format":13,"mode":14,"style":15,"text":93,"type":17,"version":18}," What it is ",{"children":95,"direction":19,"format":15,"indent":13,"type":87,"version":18,"backgroundColor":19,"colSpan":18,"headerState":18,"rowSpan":18},[96],{"children":97,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[98],{"detail":13,"format":13,"mode":14,"style":15,"text":99,"type":17,"version":18}," When to use it ","tablerow",{"children":102,"direction":19,"format":15,"indent":13,"type":100,"version":18},[103,112,118],{"children":104,"direction":19,"format":15,"indent":13,"type":87,"version":18,"backgroundColor":19,"colSpan":18,"headerState":13,"rowSpan":18},[105],{"children":106,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[107,109,111],{"detail":13,"format":13,"mode":14,"style":15,"text":108,"type":17,"version":18}," ",{"detail":13,"format":18,"mode":14,"style":15,"text":110,"type":17,"version":18},"Partner integration",{"detail":13,"format":13,"mode":14,"style":15,"text":108,"type":17,"version":18},{"children":113,"direction":19,"format":15,"indent":13,"type":87,"version":18,"backgroundColor":19,"colSpan":18,"headerState":13,"rowSpan":18},[114],{"children":115,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[116],{"detail":13,"format":13,"mode":14,"style":15,"text":117,"type":17,"version":18}," A prebuilt connector for Shopify, WooCommerce, BigCommerce, Wix, Google Tag Manager and others ",{"children":119,"direction":19,"format":15,"indent":13,"type":87,"version":18,"backgroundColor":19,"colSpan":18,"headerState":13,"rowSpan":18},[120],{"children":121,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[122],{"detail":13,"format":13,"mode":14,"style":15,"text":123,"type":17,"version":18}," Your site runs on a supported platform and you want standard ecommerce events mapped for you ",{"children":125,"direction":19,"format":15,"indent":13,"type":100,"version":18},[126,134,140],{"children":127,"direction":19,"format":15,"indent":13,"type":87,"version":18,"backgroundColor":19,"colSpan":18,"headerState":13,"rowSpan":18},[128],{"children":129,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[130,131,133],{"detail":13,"format":13,"mode":14,"style":15,"text":108,"type":17,"version":18},{"detail":13,"format":18,"mode":14,"style":15,"text":132,"type":17,"version":18},"Manual — standard mode",{"detail":13,"format":13,"mode":14,"style":15,"text":108,"type":17,"version":18},{"children":135,"direction":19,"format":15,"indent":13,"type":87,"version":18,"backgroundColor":19,"colSpan":18,"headerState":13,"rowSpan":18},[136],{"children":137,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[138],{"detail":13,"format":13,"mode":14,"style":15,"text":139,"type":17,"version":18}," You paste the base code, then configure events through TikTok's UI by pointing at URLs or CSS selectors ",{"children":141,"direction":19,"format":15,"indent":13,"type":87,"version":18,"backgroundColor":19,"colSpan":18,"headerState":13,"rowSpan":18},[142],{"children":143,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[144],{"detail":13,"format":13,"mode":14,"style":15,"text":145,"type":17,"version":18}," You control the site but do not want to write event code ",{"children":147,"direction":19,"format":15,"indent":13,"type":100,"version":18},[148,156,167],{"children":149,"direction":19,"format":15,"indent":13,"type":87,"version":18,"backgroundColor":19,"colSpan":18,"headerState":13,"rowSpan":18},[150],{"children":151,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[152,153,155],{"detail":13,"format":13,"mode":14,"style":15,"text":108,"type":17,"version":18},{"detail":13,"format":18,"mode":14,"style":15,"text":154,"type":17,"version":18},"Manual — developer mode",{"detail":13,"format":13,"mode":14,"style":15,"text":108,"type":17,"version":18},{"children":157,"direction":19,"format":15,"indent":13,"type":87,"version":18,"backgroundColor":19,"colSpan":18,"headerState":13,"rowSpan":18},[158],{"children":159,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[160,162,165],{"detail":13,"format":13,"mode":14,"style":15,"text":161,"type":17,"version":18}," You paste the base code and call ",{"detail":13,"format":163,"mode":14,"style":15,"text":164,"type":17,"version":18},16,"ttq.track()",{"detail":13,"format":13,"mode":14,"style":15,"text":166,"type":17,"version":18}," yourself in your application code ",{"children":168,"direction":19,"format":15,"indent":13,"type":87,"version":18,"backgroundColor":19,"colSpan":18,"headerState":13,"rowSpan":18},[169],{"children":170,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[171],{"detail":13,"format":13,"mode":14,"style":15,"text":172,"type":17,"version":18}," Your events depend on application state that a URL or selector cannot express ","table",{"children":175,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[176],{"detail":13,"format":13,"mode":14,"style":15,"text":177,"type":17,"version":18},"A practical rule: use developer mode for anything transactional. URL-based and click-based event rules are fragile — they break when a route changes, when a button gets restyled, or when a single-page app renders a confirmation without a navigation. Purchase events in particular should fire from code that runs only after the order is actually confirmed by your backend.",{"children":179,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[180,182,184],{"detail":13,"format":13,"mode":14,"style":15,"text":181,"type":17,"version":18},"The base code goes in the ",{"detail":13,"format":163,"mode":14,"style":15,"text":183,"type":17,"version":18},"\u003Chead>",{"detail":13,"format":13,"mode":14,"style":15,"text":185,"type":17,"version":18}," of every page, not just the pages with conversions. TikTok needs the page-level signal across the site to build audiences and understand browsing behavior.",{"children":187,"direction":19,"format":15,"indent":13,"type":29,"version":18,"tag":30},[188],{"detail":13,"format":13,"mode":14,"style":15,"text":189,"type":17,"version":18},"Step 2: Choose events that map to your funnel, not to a checklist",{"children":191,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[192],{"detail":13,"format":13,"mode":14,"style":15,"text":193,"type":17,"version":18},"TikTok provides a set of standard events. The temptation is to implement all of them. Resist it — every event you fire is a signal you will later have to explain, and a sparse, correct event set outperforms a dense, noisy one.",{"children":195,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[196],{"detail":13,"format":13,"mode":14,"style":15,"text":197,"type":17,"version":18},"Start with three:",{"children":199,"direction":19,"format":15,"indent":13,"type":58,"version":18,"listType":246,"start":18,"tag":247},[200,210,230],{"children":201,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":18},[202,204,206,208],{"detail":13,"format":18,"mode":14,"style":15,"text":203,"type":17,"version":18},"A top-of-funnel event",{"detail":13,"format":13,"mode":14,"style":15,"text":205,"type":17,"version":18}," — ",{"detail":13,"format":163,"mode":14,"style":15,"text":207,"type":17,"version":18},"ViewContent",{"detail":13,"format":13,"mode":14,"style":15,"text":209,"type":17,"version":18}," on product or key landing pages.",{"children":211,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":50},[212,214,215,217,219,221,222,224,226,228],{"detail":13,"format":18,"mode":14,"style":15,"text":213,"type":17,"version":18},"A mid-funnel intent event",{"detail":13,"format":13,"mode":14,"style":15,"text":205,"type":17,"version":18},{"detail":13,"format":163,"mode":14,"style":15,"text":216,"type":17,"version":18},"AddToCart",{"detail":13,"format":13,"mode":14,"style":15,"text":218,"type":17,"version":18},", ",{"detail":13,"format":163,"mode":14,"style":15,"text":220,"type":17,"version":18},"InitiateCheckout",{"detail":13,"format":13,"mode":14,"style":15,"text":218,"type":17,"version":18},{"detail":13,"format":163,"mode":14,"style":15,"text":223,"type":17,"version":18},"CompleteRegistration",{"detail":13,"format":13,"mode":14,"style":15,"text":225,"type":17,"version":18},", or ",{"detail":13,"format":163,"mode":14,"style":15,"text":227,"type":17,"version":18},"SubmitForm",{"detail":13,"format":13,"mode":14,"style":15,"text":229,"type":17,"version":18},", whichever genuinely represents progress for your business.",{"children":231,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":57},[232,234,235,237,239,240,242,244],{"detail":13,"format":18,"mode":14,"style":15,"text":233,"type":17,"version":18},"Your optimization event",{"detail":13,"format":13,"mode":14,"style":15,"text":205,"type":17,"version":18},{"detail":13,"format":163,"mode":14,"style":15,"text":236,"type":17,"version":18},"CompletePayment",{"detail":13,"format":13,"mode":14,"style":15,"text":238,"type":17,"version":18}," for ecommerce, ",{"detail":13,"format":163,"mode":14,"style":15,"text":223,"type":17,"version":18},{"detail":13,"format":13,"mode":14,"style":15,"text":241,"type":17,"version":18}," or ",{"detail":13,"format":163,"mode":14,"style":15,"text":243,"type":17,"version":18},"Contact",{"detail":13,"format":13,"mode":14,"style":15,"text":245,"type":17,"version":18}," for lead generation.","bullet","ul",{"children":249,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[250,252,254,256,258],{"detail":13,"format":13,"mode":14,"style":15,"text":251,"type":17,"version":18},"The optimization event is the one your campaigns bid toward, so it carries a hard requirement: it must fire ",{"detail":13,"format":18,"mode":14,"style":15,"text":253,"type":17,"version":18},"once",{"detail":13,"format":13,"mode":14,"style":15,"text":255,"type":17,"version":18}," per conversion, and it must fire ",{"detail":13,"format":18,"mode":14,"style":15,"text":257,"type":17,"version":18},"only",{"detail":13,"format":13,"mode":14,"style":15,"text":259,"type":17,"version":18}," on real conversions. Double-firing is the most common cause of inflated conversion counts. It usually comes from one of three places: the snippet included twice on the page, a partner integration running alongside a manual implementation, or a confirmation page that users reload.",{"children":261,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[262,264,266,267,269,270,272,273,275,276,278,280,281,283,293],{"detail":13,"format":13,"mode":14,"style":15,"text":263,"type":17,"version":18},"Pass event parameters where they exist — ",{"detail":13,"format":163,"mode":14,"style":15,"text":265,"type":17,"version":18},"value",{"detail":13,"format":13,"mode":14,"style":15,"text":218,"type":17,"version":18},{"detail":13,"format":163,"mode":14,"style":15,"text":268,"type":17,"version":18},"currency",{"detail":13,"format":13,"mode":14,"style":15,"text":218,"type":17,"version":18},{"detail":13,"format":163,"mode":14,"style":15,"text":271,"type":17,"version":18},"content_id",{"detail":13,"format":13,"mode":14,"style":15,"text":218,"type":17,"version":18},{"detail":13,"format":163,"mode":14,"style":15,"text":274,"type":17,"version":18},"content_type",{"detail":13,"format":13,"mode":14,"style":15,"text":218,"type":17,"version":18},{"detail":13,"format":163,"mode":14,"style":15,"text":277,"type":17,"version":18},"quantity",{"detail":13,"format":13,"mode":14,"style":15,"text":279,"type":17,"version":18},". Value and currency are what make value-based bidding possible at all. If you are running any ROAS-based strategy without a correctly populated ",{"detail":13,"format":163,"mode":14,"style":15,"text":265,"type":17,"version":18},{"detail":13,"format":13,"mode":14,"style":15,"text":282,"type":17,"version":18},", the strategy has nothing to optimize against. Our ",{"children":284,"direction":19,"format":15,"indent":13,"type":287,"version":57,"fields":288,"id":292},[285],{"detail":13,"format":13,"mode":14,"style":15,"text":286,"type":17,"version":18},"TikTok ads cost benchmark","link",{"linkType":289,"newTab":290,"url":291},"custom",false,"https://deepclick.com/resources/blog/tiktok-ads-cost-benchmark/","6aaf55342edd7b00c8d3bf2b",{"detail":13,"format":13,"mode":14,"style":15,"text":294,"type":17,"version":18}," piece covers why a cost figure without a value denominator tells you very little.",{"children":296,"direction":19,"format":15,"indent":13,"type":29,"version":18,"tag":30},[297],{"detail":13,"format":13,"mode":14,"style":15,"text":298,"type":17,"version":18},"Step 3: Turn on Advanced Matching, and hash correctly",{"children":300,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[301],{"detail":13,"format":13,"mode":14,"style":15,"text":302,"type":17,"version":18},"Advanced Matching sends hashed customer identifiers — email, phone number, and in some configurations external ID — alongside your events. TikTok hashes these to match the event against a user who saw your ad.",{"children":304,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[305],{"detail":13,"format":13,"mode":14,"style":15,"text":306,"type":17,"version":18},"Two rules matter more than the rest:",{"children":308,"direction":19,"format":15,"indent":13,"type":58,"version":18,"listType":246,"start":18,"tag":247},[309,319],{"children":310,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":18},[311,313,315,317],{"detail":13,"format":18,"mode":14,"style":15,"text":312,"type":17,"version":18},"Normalize before hashing.",{"detail":13,"format":13,"mode":14,"style":15,"text":314,"type":17,"version":18}," Lowercase the email, strip whitespace, convert the phone to E.164 with the country code. A hash of ",{"detail":13,"format":163,"mode":14,"style":15,"text":316,"type":17,"version":18},"  Alice@Example.com ` and a hash of `alice@example.com",{"detail":13,"format":13,"mode":14,"style":15,"text":318,"type":17,"version":18}," are different strings and will not match.",{"children":320,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":50},[321,323],{"detail":13,"format":18,"mode":14,"style":15,"text":322,"type":17,"version":18},"Never send raw values.",{"detail":13,"format":13,"mode":14,"style":15,"text":324,"type":17,"version":18}," If you are using the JavaScript library's identify call, it handles hashing for you. If you are sending events server-side, you hash with SHA-256 before transmission.",{"children":326,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[327,329,336],{"detail":13,"format":13,"mode":14,"style":15,"text":328,"type":17,"version":18},"Match quality is the single biggest lever on attribution accuracy after the pixel is installed correctly, and it is the one that degrades silently. Browser privacy changes shrink cookie lifetimes continuously; hashed first-party identifiers are what survive that. The same logic applies on Meta, which is why our ",{"children":330,"direction":19,"format":15,"indent":13,"type":287,"version":57,"fields":333,"id":335},[331],{"detail":13,"format":13,"mode":14,"style":15,"text":332,"type":17,"version":18},"Meta Conversions API setup",{"linkType":289,"newTab":290,"url":334},"https://deepclick.com/resources/blog/meta-conversions-api-setup/","6aaf55342edd7b00c8d3bf2c",{"detail":13,"format":13,"mode":14,"style":15,"text":337,"type":17,"version":18}," guide treats matching parameters rather than the transport as the real subject.",{"children":339,"direction":19,"format":15,"indent":13,"type":29,"version":18,"tag":30},[340],{"detail":13,"format":13,"mode":14,"style":15,"text":341,"type":17,"version":18},"Step 4: Validate before you spend",{"children":343,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[344,346,348],{"detail":13,"format":13,"mode":14,"style":15,"text":345,"type":17,"version":18},"Do not trust the \"active\" badge in Ads Manager. It indicates the pixel has received traffic, not that it has received ",{"detail":13,"format":50,"mode":14,"style":15,"text":347,"type":17,"version":18},"correct",{"detail":13,"format":13,"mode":14,"style":15,"text":349,"type":17,"version":18}," traffic.",{"children":351,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[352],{"detail":13,"format":13,"mode":14,"style":15,"text":353,"type":17,"version":18},"Validate in this order:",{"children":355,"direction":19,"format":15,"indent":13,"type":58,"version":18,"listType":59,"start":18,"tag":60},[356,362,368,378],{"children":357,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":18},[358,360],{"detail":13,"format":18,"mode":14,"style":15,"text":359,"type":17,"version":18},"TikTok Pixel Helper",{"detail":13,"format":13,"mode":14,"style":15,"text":361,"type":17,"version":18}," — the browser extension shows which pixel IDs are present on the page, which events fired, and the parameters attached. This catches duplicate pixels immediately, because you will see two IDs where you expected one.",{"children":363,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":50},[364,366],{"detail":13,"format":18,"mode":14,"style":15,"text":365,"type":17,"version":18},"Walk the real funnel",{"detail":13,"format":13,"mode":14,"style":15,"text":367,"type":17,"version":18}," — do not test by navigating directly to the confirmation URL. Place an actual test order and watch the event sequence. Direct navigation will fire a purchase event without the preceding steps, which is exactly the pattern a broken implementation produces.",{"children":369,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":57},[370,372,374,376],{"detail":13,"format":18,"mode":14,"style":15,"text":371,"type":17,"version":18},"Check the event log in Ads Manager",{"detail":13,"format":13,"mode":14,"style":15,"text":373,"type":17,"version":18}," — confirm parameters arrived, not just events. An event with ",{"detail":13,"format":163,"mode":14,"style":15,"text":375,"type":17,"version":18},"value: undefined",{"detail":13,"format":13,"mode":14,"style":15,"text":377,"type":17,"version":18}," is a silent failure.",{"children":379,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":384},[380,382],{"detail":13,"format":18,"mode":14,"style":15,"text":381,"type":17,"version":18},"Reload the confirmation page once",{"detail":13,"format":13,"mode":14,"style":15,"text":383,"type":17,"version":18}," — if a second purchase event fires, you have a deduplication problem to fix before launch.",4,{"children":386,"direction":19,"format":15,"indent":13,"type":29,"version":18,"tag":30},[387],{"detail":13,"format":13,"mode":14,"style":15,"text":388,"type":17,"version":18},"Step 5: Add the server-side layer",{"children":390,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[391,393,395],{"detail":13,"format":13,"mode":14,"style":15,"text":392,"type":17,"version":18},"Browser-only tracking loses events to ad blockers, network failures, tracking prevention in Safari and Firefox, and users closing the tab before the snippet finishes. The ",{"detail":13,"format":18,"mode":14,"style":15,"text":394,"type":17,"version":18},"Events API",{"detail":13,"format":13,"mode":14,"style":15,"text":396,"type":17,"version":18}," sends the same events from your server, where none of those apply.",{"children":398,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[399,401,403],{"detail":13,"format":13,"mode":14,"style":15,"text":400,"type":17,"version":18},"Running both is the standard configuration, not a redundancy. The requirement is deduplication: each event sent through both paths carries a shared ",{"detail":13,"format":163,"mode":14,"style":15,"text":402,"type":17,"version":18},"event_id",{"detail":13,"format":13,"mode":14,"style":15,"text":404,"type":17,"version":18},", and TikTok uses it to collapse the pair into a single conversion. Get this wrong and your conversion counts roughly double — which looks like a great week until it corrupts the data your bidding strategy learns from.",{"children":406,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[407],{"detail":13,"format":13,"mode":14,"style":15,"text":408,"type":17,"version":18},"Server-side is also the only place you can send events that never touch a browser: an offline sale, a subscription renewal, a lead that qualifies three days later.",{"children":410,"direction":19,"format":15,"indent":13,"type":29,"version":18,"tag":30},[411],{"detail":13,"format":13,"mode":14,"style":15,"text":412,"type":17,"version":18},"Where pixel-based measurement stops working",{"children":414,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[415],{"detail":13,"format":13,"mode":14,"style":15,"text":416,"type":17,"version":18},"The pixel measures web sessions on your domain. Three cases fall outside that, and each needs a different tool:",{"children":418,"direction":19,"format":15,"indent":13,"type":58,"version":18,"listType":246,"start":18,"tag":247},[419,434,440],{"children":420,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":18},[421,423,425,432],{"detail":13,"format":18,"mode":14,"style":15,"text":422,"type":17,"version":18},"App installs and in-app events.",{"detail":13,"format":13,"mode":14,"style":15,"text":424,"type":17,"version":18}," These are measured through a mobile measurement partner, not the web pixel. See our ",{"children":426,"direction":19,"format":15,"indent":13,"type":287,"version":57,"fields":429,"id":431},[427],{"detail":13,"format":13,"mode":14,"style":15,"text":428,"type":17,"version":18},"mobile measurement partner",{"linkType":289,"newTab":290,"url":430},"https://deepclick.com/resources/blog/mobile-measurement-partner/","6aaf55342edd7b00c8d3bf2d",{"detail":13,"format":13,"mode":14,"style":15,"text":433,"type":17,"version":18}," overview for how that attribution model differs.",{"children":435,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":50},[436,438],{"detail":13,"format":18,"mode":14,"style":15,"text":437,"type":17,"version":18},"Traffic that crosses domains.",{"detail":13,"format":13,"mode":14,"style":15,"text":439,"type":17,"version":18}," If your ad points at one domain and the conversion happens on another, the first-party cookie does not travel. The click identifier has to be carried across explicitly.",{"children":441,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":57},[442,444,446,453],{"detail":13,"format":18,"mode":14,"style":15,"text":443,"type":17,"version":18},"App-to-web and web-to-app journeys.",{"detail":13,"format":13,"mode":14,"style":15,"text":445,"type":17,"version":18}," Handing a user from a browser to an app without losing attribution is a deep linking problem, covered in our ",{"children":447,"direction":19,"format":15,"indent":13,"type":287,"version":57,"fields":450,"id":452},[448],{"detail":13,"format":13,"mode":14,"style":15,"text":449,"type":17,"version":18},"deep linking guide",{"linkType":289,"newTab":290,"url":451},"https://deepclick.com/resources/blog/deep-linking-guide/","6aaf55342edd7b00c8d3bf2e",{"detail":13,"format":13,"mode":14,"style":15,"text":454,"type":17,"version":18},".",{"children":456,"direction":19,"format":15,"indent":13,"type":29,"version":18,"tag":30},[457],{"detail":13,"format":13,"mode":14,"style":15,"text":458,"type":17,"version":18},"A pre-launch checklist",{"children":460,"direction":19,"format":15,"indent":13,"type":58,"version":18,"listType":246,"start":18,"tag":247},[461,468,472,476,484,489,494,499,507],{"children":462,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":18},[463,465,466],{"detail":13,"format":13,"mode":14,"style":15,"text":464,"type":17,"version":18},"Base code in ",{"detail":13,"format":163,"mode":14,"style":15,"text":183,"type":17,"version":18},{"detail":13,"format":13,"mode":14,"style":15,"text":467,"type":17,"version":18}," on every page, exactly once",{"children":469,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":50},[470],{"detail":13,"format":13,"mode":14,"style":15,"text":471,"type":17,"version":18},"One pixel ID per site; no duplicate or legacy pixels still loading",{"children":473,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":57},[474],{"detail":13,"format":13,"mode":14,"style":15,"text":475,"type":17,"version":18},"Three to five events, each mapped to a real funnel stage",{"children":477,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":384},[478,479,481,482],{"detail":13,"format":163,"mode":14,"style":15,"text":265,"type":17,"version":18},{"detail":13,"format":13,"mode":14,"style":15,"text":480,"type":17,"version":18}," and ",{"detail":13,"format":163,"mode":14,"style":15,"text":268,"type":17,"version":18},{"detail":13,"format":13,"mode":14,"style":15,"text":483,"type":17,"version":18}," populated on the optimization event",{"children":485,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":488},[486],{"detail":13,"format":13,"mode":14,"style":15,"text":487,"type":17,"version":18},"Advanced Matching enabled, inputs normalized before hashing",5,{"children":490,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":493},[491],{"detail":13,"format":13,"mode":14,"style":15,"text":492,"type":17,"version":18},"Test purchase completed through the real funnel, verified in Pixel Helper",6,{"children":495,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":498},[496],{"detail":13,"format":13,"mode":14,"style":15,"text":497,"type":17,"version":18},"Confirmation page reload does not double-fire",7,{"children":500,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":506},[501,503,504],{"detail":13,"format":13,"mode":14,"style":15,"text":502,"type":17,"version":18},"Events API live, sharing ",{"detail":13,"format":163,"mode":14,"style":15,"text":402,"type":17,"version":18},{"detail":13,"format":13,"mode":14,"style":15,"text":505,"type":17,"version":18}," with the browser events",8,{"children":508,"direction":19,"format":15,"indent":13,"type":43,"version":18,"value":511},[509],{"detail":13,"format":13,"mode":14,"style":15,"text":510,"type":17,"version":18},"Consent handling in place for the regions you advertise in",9,{"children":513,"direction":19,"format":15,"indent":13,"type":29,"version":18,"tag":30},[514],{"detail":13,"format":13,"mode":14,"style":15,"text":515,"type":17,"version":18},"FAQ",{"children":517,"direction":19,"format":15,"indent":13,"type":29,"version":18,"tag":520},[518],{"detail":13,"format":13,"mode":14,"style":15,"text":519,"type":17,"version":18},"Where does the TikTok Pixel base code go?","h3",{"children":522,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[523,525,526],{"detail":13,"format":13,"mode":14,"style":15,"text":524,"type":17,"version":18},"In the ",{"detail":13,"format":163,"mode":14,"style":15,"text":183,"type":17,"version":18},{"detail":13,"format":13,"mode":14,"style":15,"text":527,"type":17,"version":18}," of every page on the site, not only conversion pages. TikTok uses site-wide page events for audience building and behavioral signals, so a pixel restricted to checkout pages loses most of its value.",{"children":529,"direction":19,"format":15,"indent":13,"type":29,"version":18,"tag":520},[530],{"detail":13,"format":13,"mode":14,"style":15,"text":531,"type":17,"version":18},"Can I use more than one TikTok Pixel on one website?",{"children":533,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[534],{"detail":13,"format":13,"mode":14,"style":15,"text":535,"type":17,"version":18},"You can, but it is rarely a good idea. Multiple pixels on the same page produce duplicate events and split your data across assets. Consolidate to one pixel per site and separate campaigns by naming and structure instead.",{"children":537,"direction":19,"format":15,"indent":13,"type":29,"version":18,"tag":520},[538],{"detail":13,"format":13,"mode":14,"style":15,"text":539,"type":17,"version":18},"Do I still need the Events API if the pixel works?",{"children":541,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[542,544,545],{"detail":13,"format":13,"mode":14,"style":15,"text":543,"type":17,"version":18},"Yes, in practice. Browser tracking loses events to ad blockers, tracking prevention and abandoned page loads. The Events API recovers those, and is the only way to send conversions that never happen in a browser. Run both with a shared ",{"detail":13,"format":163,"mode":14,"style":15,"text":402,"type":17,"version":18},{"detail":13,"format":13,"mode":14,"style":15,"text":546,"type":17,"version":18}," so they deduplicate.",{"children":548,"direction":19,"format":15,"indent":13,"type":29,"version":18,"tag":520},[549],{"detail":13,"format":13,"mode":14,"style":15,"text":550,"type":17,"version":18},"Why are my conversion numbers higher than my actual orders?",{"children":552,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[553,555,556],{"detail":13,"format":13,"mode":14,"style":15,"text":554,"type":17,"version":18},"Almost always double-firing. Check for the snippet installed twice, a partner integration running alongside a manual implementation, a confirmation page that fires on reload, or browser and server events without a shared ",{"detail":13,"format":163,"mode":14,"style":15,"text":402,"type":17,"version":18},{"detail":13,"format":13,"mode":14,"style":15,"text":454,"type":17,"version":18},{"children":558,"direction":19,"format":15,"indent":13,"type":29,"version":18,"tag":520},[559],{"detail":13,"format":13,"mode":14,"style":15,"text":560,"type":17,"version":18},"What is the difference between standard mode and developer mode?",{"children":562,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[563,565,566],{"detail":13,"format":13,"mode":14,"style":15,"text":564,"type":17,"version":18},"Standard mode configures events through TikTok's interface using URL rules and element selectors. Developer mode means calling ",{"detail":13,"format":163,"mode":14,"style":15,"text":164,"type":17,"version":18},{"detail":13,"format":13,"mode":14,"style":15,"text":567,"type":17,"version":18}," from your own code. Developer mode is more robust for anything transactional, because it fires on application state rather than on page structure that can change.",{"children":569,"direction":19,"format":15,"indent":13,"type":29,"version":18,"tag":520},[570],{"detail":13,"format":13,"mode":14,"style":15,"text":571,"type":17,"version":18},"Does Advanced Matching send my customers' personal data to TikTok?",{"children":573,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[574],{"detail":13,"format":13,"mode":14,"style":15,"text":575,"type":17,"version":18},"It sends hashed values, not raw ones — the hashing happens before transmission. You still need a lawful basis and appropriate consent for the regions you operate in, and your privacy policy should reflect what you send.",{"type":577,"version":18},"horizontalrule",{"children":579,"direction":19,"format":15,"indent":13,"type":20,"version":18,"textFormat":13,"textStyle":15},[580,582,589],{"detail":13,"format":13,"mode":14,"style":15,"text":581,"type":17,"version":18},"Measurement only works when the link between the ad and the landing page stays intact. ",{"children":583,"direction":19,"format":15,"indent":13,"type":287,"version":57,"fields":586,"id":588},[584],{"detail":13,"format":13,"mode":14,"style":15,"text":585,"type":17,"version":18},"DeepClick",{"linkType":289,"newTab":290,"url":587},"https://deepclick.com/","6aaf55342edd7b00c8d3bf2f",{"detail":13,"format":13,"mode":14,"style":15,"text":590,"type":17,"version":18}," builds link and routing infrastructure for cross-border advertisers, so click identifiers, redirects and destination logic survive the trip from ad to conversion.","root",{"id":593,"alt":594,"updatedAt":595,"createdAt":595,"url":596,"thumbnailURL":19,"filename":597,"mimeType":598,"filesize":599,"width":19,"height":19},1145,"Diagram of a browser window sending tracking events to a server, illustrating web analytics event setup","2026-09-20T03:38:17.522Z","https://cms-r2.deepclick.com/image_1789875488080_33345-73dee9579e50.jpg","image_1789875488080_33345-73dee9579e50.jpg","application/octet-stream",259857,{"title":601,"description":602,"image":19},"TikTok Pixel Setup (2026): Events, Matching & Events API | DeepClick","How to set up the TikTok Pixel properly: choosing an install method, picking three to five funnel events, normalizing data before hashing for Advanced Matching, validating with Pixel Helper before you spend, and deduplicating browser and server events with a shared event_id.",{"id":18,"key":604,"name":585,"prodHost":605,"testHost":606,"blogPath":607,"docPath":608,"zhPrefix":609,"deployHookTest":610,"deployHookProd":611,"brandAuthor":612,"brandKit":616,"enabled":620,"updatedAt":621,"createdAt":622},"deepclick","https://deepclick.com","https://www-test-deepclick.qiliangjia.one","/resources/blog/{slug}","/docs/{slug}","/zh-CN","https://api.cloudflare.com/client/v4/pages/webhooks/deploy_hooks/60a9adef-153b-4c89-8d07-7118e91e9522","https://api.cloudflare.com/client/v4/pages/webhooks/deploy_hooks/05323321-f694-4ce8-a5af-173c507b8bae",{"id":50,"name":585,"avatar":613,"updatedAt":614,"createdAt":615},25,"2026-04-22T08:09:35.299Z","2026-04-22T06:42:49.116Z",{"logoLight":19,"logoDark":19,"primaryColor":617,"accentColor":618,"tagline":619,"wechatName":19,"xhsHandle":19,"wechatQr":19},"#1a73e8","#ff6600","一次点击，多重价值",true,"2026-08-25T06:40:57.663Z","2026-07-14T06:26:38.962Z","published","tiktok-pixel-setup",{"id":498,"name":626,"avatar":627,"updatedAt":634,"createdAt":634},"Kenji Watanabe",{"id":628,"alt":629,"updatedAt":630,"createdAt":630,"url":631,"thumbnailURL":19,"filename":632,"mimeType":598,"filesize":633,"width":19,"height":19},925,"Kenji Watanabe — PWA & mobile tech writer","2026-07-27T07:17:29.038Z","https://cms-r2.deepclick.com/gpt_1785136568500_0-0d300e3b401a.png","gpt_1785136568500_0-0d300e3b401a.png",2032193,"2026-07-27T07:17:30.604Z",{"id":498,"site":636,"titleZh":638,"titleEn":639,"slug":640,"order":488,"updatedAt":641,"createdAt":642},{"id":18,"key":604,"name":585,"prodHost":605,"testHost":606,"blogPath":607,"docPath":608,"zhPrefix":609,"deployHookTest":610,"deployHookProd":611,"brandAuthor":50,"brandKit":637,"enabled":620,"updatedAt":621,"createdAt":622},{"logoLight":19,"logoDark":19,"primaryColor":617,"accentColor":618,"tagline":619,"wechatName":19,"xhsHandle":19,"wechatQr":19},"技术导航","Tech Guides","tech-guides","2026-04-27T08:37:10.576Z","2026-04-23T02:59:13.436Z","2026-09-20T03:38:54.155Z","2026-09-20T03:38:55.259Z","2026-09-20T03:38:30.313Z","\u003Cdiv class=\"payload-richtext\">\u003Cp>Most TikTok Pixel guides stop at &quot;paste the code and you&#39;re done.&quot; That instruction is correct and almost useless, because the part that decides whether your campaigns can optimize is what happens after the snippet loads: which events fire, what identifiers travel with them, and whether TikTok can match those events back to the people who saw your ads.\u003C/p>\u003Cp>This guide walks the TikTok Pixel setup end to end — install, events, validation, and the server-side layer — with the failure modes called out at each step, because a pixel that is installed but mis-configured looks identical to a working one in the dashboard until you try to build an audience from it.\u003C/p>\u003Ch2>What the TikTok Pixel actually does\u003C/h2>\u003Cp>The pixel is a small JavaScript snippet you place on your site. When it loads, it does three things:\u003C/p>\u003Col class=\"list-number\">\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"1\"\n        >\u003Cstrong>Fires a page-level event\u003C/strong> so TikTok knows a visit happened.\u003C/li>\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"2\"\n        >\u003Cstrong>Fires any additional events you define\u003C/strong> — a product view, a checkout start, a purchase.\u003C/li>\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"3\"\n        >\u003Cstrong>Attaches identifiers\u003C/strong> to those events: a first-party cookie, the click identifier TikTok appends to your landing page URL, and optionally hashed customer data.\u003C/li>\u003C/ol>\u003Cp>That third point is the one most setups get wrong, and it is the one that determines reporting quality. An event without usable identifiers still appears in your event log. It just cannot be attributed to an ad, which means it contributes nothing to conversion optimization.\u003C/p>\u003Ch2>Step 1: Create the pixel and decide on your install method\u003C/h2>\u003Cp>In TikTok Ads Manager, the pixel lives under \u003Cstrong>Assets → Events → Web Events\u003C/strong>. Creating one gives you a pixel ID and a choice of installation method:\u003C/p>\u003Cdiv class=\"lexical-table-container\">\n        \u003Ctable class=\"lexical-table\" style=\"border-collapse: collapse;\">\n          \u003Ctbody>\u003Ctr class=\"lexical-table-row\">\n        \u003Cth\n        class=\"lexical-table-cell lexical-table-cell-header-1\"\n        \n        \n        style=\"border: 1px solid #ccc; padding: 8px;\"\n      >\n        \u003Cp> Method \u003C/p>\n      \u003C/th>\n    \u003Cth\n        class=\"lexical-table-cell lexical-table-cell-header-1\"\n        \n        \n        style=\"border: 1px solid #ccc; padding: 8px;\"\n      >\n        \u003Cp> What it is \u003C/p>\n      \u003C/th>\n    \u003Cth\n        class=\"lexical-table-cell lexical-table-cell-header-1\"\n        \n        \n        style=\"border: 1px solid #ccc; padding: 8px;\"\n      >\n        \u003Cp> When to use it \u003C/p>\n      \u003C/th>\n    \n      \u003C/tr>\u003Ctr class=\"lexical-table-row\">\n        \u003Ctd\n        class=\"lexical-table-cell lexical-table-cell-header-0\"\n        \n        \n        style=\"border: 1px solid #ccc; padding: 8px;\"\n      >\n        \u003Cp> \u003Cstrong>Partner integration\u003C/strong> \u003C/p>\n      \u003C/td>\n    \u003Ctd\n        class=\"lexical-table-cell lexical-table-cell-header-0\"\n        \n        \n        style=\"border: 1px solid #ccc; padding: 8px;\"\n      >\n        \u003Cp> A prebuilt connector for Shopify, WooCommerce, BigCommerce, Wix, Google Tag Manager and others \u003C/p>\n      \u003C/td>\n    \u003Ctd\n        class=\"lexical-table-cell lexical-table-cell-header-0\"\n        \n        \n        style=\"border: 1px solid #ccc; padding: 8px;\"\n      >\n        \u003Cp> Your site runs on a supported platform and you want standard ecommerce events mapped for you \u003C/p>\n      \u003C/td>\n    \n      \u003C/tr>\u003Ctr class=\"lexical-table-row\">\n        \u003Ctd\n        class=\"lexical-table-cell lexical-table-cell-header-0\"\n        \n        \n        style=\"border: 1px solid #ccc; padding: 8px;\"\n      >\n        \u003Cp> \u003Cstrong>Manual — standard mode\u003C/strong> \u003C/p>\n      \u003C/td>\n    \u003Ctd\n        class=\"lexical-table-cell lexical-table-cell-header-0\"\n        \n        \n        style=\"border: 1px solid #ccc; padding: 8px;\"\n      >\n        \u003Cp> You paste the base code, then configure events through TikTok&#39;s UI by pointing at URLs or CSS selectors \u003C/p>\n      \u003C/td>\n    \u003Ctd\n        class=\"lexical-table-cell lexical-table-cell-header-0\"\n        \n        \n        style=\"border: 1px solid #ccc; padding: 8px;\"\n      >\n        \u003Cp> You control the site but do not want to write event code \u003C/p>\n      \u003C/td>\n    \n      \u003C/tr>\u003Ctr class=\"lexical-table-row\">\n        \u003Ctd\n        class=\"lexical-table-cell lexical-table-cell-header-0\"\n        \n        \n        style=\"border: 1px solid #ccc; padding: 8px;\"\n      >\n        \u003Cp> \u003Cstrong>Manual — developer mode\u003C/strong> \u003C/p>\n      \u003C/td>\n    \u003Ctd\n        class=\"lexical-table-cell lexical-table-cell-header-0\"\n        \n        \n        style=\"border: 1px solid #ccc; padding: 8px;\"\n      >\n        \u003Cp> You paste the base code and call \u003Ccode>ttq.track()\u003C/code> yourself in your application code \u003C/p>\n      \u003C/td>\n    \u003Ctd\n        class=\"lexical-table-cell lexical-table-cell-header-0\"\n        \n        \n        style=\"border: 1px solid #ccc; padding: 8px;\"\n      >\n        \u003Cp> Your events depend on application state that a URL or selector cannot express \u003C/p>\n      \u003C/td>\n    \n      \u003C/tr>\u003C/tbody>\n        \u003C/table>\n      \u003C/div>\u003Cp>A practical rule: use developer mode for anything transactional. URL-based and click-based event rules are fragile — they break when a route changes, when a button gets restyled, or when a single-page app renders a confirmation without a navigation. Purchase events in particular should fire from code that runs only after the order is actually confirmed by your backend.\u003C/p>\u003Cp>The base code goes in the \u003Ccode>&lt;head&gt;\u003C/code> of every page, not just the pages with conversions. TikTok needs the page-level signal across the site to build audiences and understand browsing behavior.\u003C/p>\u003Ch2>Step 2: Choose events that map to your funnel, not to a checklist\u003C/h2>\u003Cp>TikTok provides a set of standard events. The temptation is to implement all of them. Resist it — every event you fire is a signal you will later have to explain, and a sparse, correct event set outperforms a dense, noisy one.\u003C/p>\u003Cp>Start with three:\u003C/p>\u003Cul class=\"list-bullet\">\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"1\"\n        >\u003Cstrong>A top-of-funnel event\u003C/strong> — \u003Ccode>ViewContent\u003C/code> on product or key landing pages.\u003C/li>\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"2\"\n        >\u003Cstrong>A mid-funnel intent event\u003C/strong> — \u003Ccode>AddToCart\u003C/code>, \u003Ccode>InitiateCheckout\u003C/code>, \u003Ccode>CompleteRegistration\u003C/code>, or \u003Ccode>SubmitForm\u003C/code>, whichever genuinely represents progress for your business.\u003C/li>\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"3\"\n        >\u003Cstrong>Your optimization event\u003C/strong> — \u003Ccode>CompletePayment\u003C/code> for ecommerce, \u003Ccode>CompleteRegistration\u003C/code> or \u003Ccode>Contact\u003C/code> for lead generation.\u003C/li>\u003C/ul>\u003Cp>The optimization event is the one your campaigns bid toward, so it carries a hard requirement: it must fire \u003Cstrong>once\u003C/strong> per conversion, and it must fire \u003Cstrong>only\u003C/strong> on real conversions. Double-firing is the most common cause of inflated conversion counts. It usually comes from one of three places: the snippet included twice on the page, a partner integration running alongside a manual implementation, or a confirmation page that users reload.\u003C/p>\u003Cp>Pass event parameters where they exist — \u003Ccode>value\u003C/code>, \u003Ccode>currency\u003C/code>, \u003Ccode>content_id\u003C/code>, \u003Ccode>content_type\u003C/code>, \u003Ccode>quantity\u003C/code>. Value and currency are what make value-based bidding possible at all. If you are running any ROAS-based strategy without a correctly populated \u003Ccode>value\u003C/code>, the strategy has nothing to optimize against. Our \u003Ca href=\"https://deepclick.com/resources/blog/tiktok-ads-cost-benchmark/\">TikTok ads cost benchmark\u003C/a> piece covers why a cost figure without a value denominator tells you very little.\u003C/p>\u003Ch2>Step 3: Turn on Advanced Matching, and hash correctly\u003C/h2>\u003Cp>Advanced Matching sends hashed customer identifiers — email, phone number, and in some configurations external ID — alongside your events. TikTok hashes these to match the event against a user who saw your ad.\u003C/p>\u003Cp>Two rules matter more than the rest:\u003C/p>\u003Cul class=\"list-bullet\">\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"1\"\n        >\u003Cstrong>Normalize before hashing.\u003C/strong> Lowercase the email, strip whitespace, convert the phone to E.164 with the country code. A hash of \u003Ccode>  Alice@Example.com ` and a hash of `alice@example.com\u003C/code> are different strings and will not match.\u003C/li>\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"2\"\n        >\u003Cstrong>Never send raw values.\u003C/strong> If you are using the JavaScript library&#39;s identify call, it handles hashing for you. If you are sending events server-side, you hash with SHA-256 before transmission.\u003C/li>\u003C/ul>\u003Cp>Match quality is the single biggest lever on attribution accuracy after the pixel is installed correctly, and it is the one that degrades silently. Browser privacy changes shrink cookie lifetimes continuously; hashed first-party identifiers are what survive that. The same logic applies on Meta, which is why our \u003Ca href=\"https://deepclick.com/resources/blog/meta-conversions-api-setup/\">Meta Conversions API setup\u003C/a> guide treats matching parameters rather than the transport as the real subject.\u003C/p>\u003Ch2>Step 4: Validate before you spend\u003C/h2>\u003Cp>Do not trust the &quot;active&quot; badge in Ads Manager. It indicates the pixel has received traffic, not that it has received \u003Cem>correct\u003C/em> traffic.\u003C/p>\u003Cp>Validate in this order:\u003C/p>\u003Col class=\"list-number\">\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"1\"\n        >\u003Cstrong>TikTok Pixel Helper\u003C/strong> — the browser extension shows which pixel IDs are present on the page, which events fired, and the parameters attached. This catches duplicate pixels immediately, because you will see two IDs where you expected one.\u003C/li>\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"2\"\n        >\u003Cstrong>Walk the real funnel\u003C/strong> — do not test by navigating directly to the confirmation URL. Place an actual test order and watch the event sequence. Direct navigation will fire a purchase event without the preceding steps, which is exactly the pattern a broken implementation produces.\u003C/li>\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"3\"\n        >\u003Cstrong>Check the event log in Ads Manager\u003C/strong> — confirm parameters arrived, not just events. An event with \u003Ccode>value: undefined\u003C/code> is a silent failure.\u003C/li>\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"4\"\n        >\u003Cstrong>Reload the confirmation page once\u003C/strong> — if a second purchase event fires, you have a deduplication problem to fix before launch.\u003C/li>\u003C/ol>\u003Ch2>Step 5: Add the server-side layer\u003C/h2>\u003Cp>Browser-only tracking loses events to ad blockers, network failures, tracking prevention in Safari and Firefox, and users closing the tab before the snippet finishes. The \u003Cstrong>Events API\u003C/strong> sends the same events from your server, where none of those apply.\u003C/p>\u003Cp>Running both is the standard configuration, not a redundancy. The requirement is deduplication: each event sent through both paths carries a shared \u003Ccode>event_id\u003C/code>, and TikTok uses it to collapse the pair into a single conversion. Get this wrong and your conversion counts roughly double — which looks like a great week until it corrupts the data your bidding strategy learns from.\u003C/p>\u003Cp>Server-side is also the only place you can send events that never touch a browser: an offline sale, a subscription renewal, a lead that qualifies three days later.\u003C/p>\u003Ch2>Where pixel-based measurement stops working\u003C/h2>\u003Cp>The pixel measures web sessions on your domain. Three cases fall outside that, and each needs a different tool:\u003C/p>\u003Cul class=\"list-bullet\">\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"1\"\n        >\u003Cstrong>App installs and in-app events.\u003C/strong> These are measured through a mobile measurement partner, not the web pixel. See our \u003Ca href=\"https://deepclick.com/resources/blog/mobile-measurement-partner/\">mobile measurement partner\u003C/a> overview for how that attribution model differs.\u003C/li>\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"2\"\n        >\u003Cstrong>Traffic that crosses domains.\u003C/strong> If your ad points at one domain and the conversion happens on another, the first-party cookie does not travel. The click identifier has to be carried across explicitly.\u003C/li>\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"3\"\n        >\u003Cstrong>App-to-web and web-to-app journeys.\u003C/strong> Handing a user from a browser to an app without losing attribution is a deep linking problem, covered in our \u003Ca href=\"https://deepclick.com/resources/blog/deep-linking-guide/\">deep linking guide\u003C/a>.\u003C/li>\u003C/ul>\u003Ch2>A pre-launch checklist\u003C/h2>\u003Cul class=\"list-bullet\">\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"1\"\n        >Base code in \u003Ccode>&lt;head&gt;\u003C/code> on every page, exactly once\u003C/li>\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"2\"\n        >One pixel ID per site; no duplicate or legacy pixels still loading\u003C/li>\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"3\"\n        >Three to five events, each mapped to a real funnel stage\u003C/li>\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"4\"\n        >\u003Ccode>value\u003C/code> and \u003Ccode>currency\u003C/code> populated on the optimization event\u003C/li>\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"5\"\n        >Advanced Matching enabled, inputs normalized before hashing\u003C/li>\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"6\"\n        >Test purchase completed through the real funnel, verified in Pixel Helper\u003C/li>\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"7\"\n        >Confirmation page reload does not double-fire\u003C/li>\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"8\"\n        >Events API live, sharing \u003Ccode>event_id\u003C/code> with the browser events\u003C/li>\u003Cli\n          class=\"\"\n          style=\"\"\n          value=\"9\"\n        >Consent handling in place for the regions you advertise in\u003C/li>\u003C/ul>\u003Ch2>FAQ\u003C/h2>\u003Ch3>Where does the TikTok Pixel base code go?\u003C/h3>\u003Cp>In the \u003Ccode>&lt;head&gt;\u003C/code> of every page on the site, not only conversion pages. TikTok uses site-wide page events for audience building and behavioral signals, so a pixel restricted to checkout pages loses most of its value.\u003C/p>\u003Ch3>Can I use more than one TikTok Pixel on one website?\u003C/h3>\u003Cp>You can, but it is rarely a good idea. Multiple pixels on the same page produce duplicate events and split your data across assets. Consolidate to one pixel per site and separate campaigns by naming and structure instead.\u003C/p>\u003Ch3>Do I still need the Events API if the pixel works?\u003C/h3>\u003Cp>Yes, in practice. Browser tracking loses events to ad blockers, tracking prevention and abandoned page loads. The Events API recovers those, and is the only way to send conversions that never happen in a browser. Run both with a shared \u003Ccode>event_id\u003C/code> so they deduplicate.\u003C/p>\u003Ch3>Why are my conversion numbers higher than my actual orders?\u003C/h3>\u003Cp>Almost always double-firing. Check for the snippet installed twice, a partner integration running alongside a manual implementation, a confirmation page that fires on reload, or browser and server events without a shared \u003Ccode>event_id\u003C/code>.\u003C/p>\u003Ch3>What is the difference between standard mode and developer mode?\u003C/h3>\u003Cp>Standard mode configures events through TikTok&#39;s interface using URL rules and element selectors. Developer mode means calling \u003Ccode>ttq.track()\u003C/code> from your own code. Developer mode is more robust for anything transactional, because it fires on application state rather than on page structure that can change.\u003C/p>\u003Ch3>Does Advanced Matching send my customers&#39; personal data to TikTok?\u003C/h3>\u003Cp>It sends hashed values, not raw ones — the hashing happens before transmission. You still need a lawful basis and appropriate consent for the regions you operate in, and your privacy policy should reflect what you send.\u003C/p>\u003Chr />\u003Cp>Measurement only works when the link between the ad and the landing page stays intact. \u003Ca href=\"https://deepclick.com/\">DeepClick\u003C/a> builds link and routing infrastructure for cross-border advertisers, so click identifiers, redirects and destination logic survive the trip from ad to conversion.\u003C/p>\u003C/div>","https://deepclick.com/resources/blog/tiktok-pixel-setup",{"zh-CN":624,"en":624},[650],{"id":57,"title":651,"site":652,"image":654,"mobileImage":664,"targetUrl":672,"enabled":620,"postDateFrom":673,"postDateTo":674,"updatedAt":675,"createdAt":676},"2026.10.20 Jakarta summit (deepclick)",{"id":18,"key":604,"name":585,"prodHost":605,"testHost":606,"blogPath":607,"docPath":608,"zhPrefix":609,"deployHookTest":610,"deployHookProd":611,"brandAuthor":50,"brandKit":653,"enabled":620,"updatedAt":621,"createdAt":622},{"logoLight":19,"logoDark":19,"primaryColor":617,"accentColor":618,"tagline":619,"wechatName":19,"xhsHandle":19,"wechatQr":19},{"id":655,"alt":656,"updatedAt":657,"createdAt":657,"url":658,"thumbnailURL":19,"filename":659,"mimeType":660,"filesize":661,"width":662,"height":663},1068,"TrafficTalking Jakarta summit 2026.10.20 (en)","2026-09-04T10:44:12.868Z","https://cms-r2.deepclick.com/traffictalking-jakarta-banner-en-9f7ee22f6562.png","traffictalking-jakarta-banner-en-9f7ee22f6562.png","image/png",1565832,2000,400,{"id":665,"alt":666,"updatedAt":667,"createdAt":667,"url":668,"thumbnailURL":19,"filename":669,"mimeType":660,"filesize":670,"width":671,"height":663},1070,"TrafficTalking Jakarta summit 2026.10.20 (mobile-en)","2026-09-04T10:44:23.791Z","https://cms-r2.deepclick.com/traffictalking-jakarta-banner-mobile-en-3ef8e652bbac.png","traffictalking-jakarta-banner-mobile-en-3ef8e652bbac.png",580158,1200,"https://t.me/rrrun_r","2026-09-03T00:00:00.000Z","2026-10-04T00:00:00.000Z","2026-09-04T10:45:05.578Z","2026-09-04T10:45:03.031Z",1789875686713]