Fix guide · Framer · advanced · about 60 min

TikTok Pixel event_id missing on Framer: how to add it

For the finding “TikTok events have no event ID”. Also for: Any website, Shopify, WordPress, Webflow.

What this means

Each event the TikTok Pixel sends can carry an event ID (event_id): a unique label for that one action. Your Framer site’s events arrive with an empty event_id. The pixel does not fill in an ID by itself (that is the empty event_id field you see in the Network tab): TikTok asks advertisers to choose a unique ID for each event, and if your code does not pass one, the field stays empty.

Whether this costs you money depends on one question: does your site also send these events to TikTok from a server, through the TikTok Events API? TikTok does not list Framer among its partner integrations, so on a Framer site server events usually come from a plugin, from server-side Google Tag Manager (GTM), or from your own backend.

  • Yes, or you are not sure: TikTok deduplicates a browser event and a server event when they share the pixel code, the event name and the event_id. When the server event has no event_id either, TikTok can fall back to the _ttp cookie, but only within 5 minutes, only if first-party cookies are on and your server sends ttp, and only by dropping the server copy. Otherwise both copies can count.
  • No, browser pixel only: there is nothing to deduplicate yet. It matters the day you add the Events API.

We cannot see server-to-server traffic from a browser, so we cannot tell whether your Events API works. We only check whether the browser events carry an ID.

How to confirm it yourself

  1. Open your published Framer site in a private (incognito) window (Framer does not run custom code in the canvas preview). Open developer tools (F12), go to Network and filter by analytics.tiktok.com/api/v2/pixel.
  2. Accept cookies, then trigger your key events, for example submit a test lead through your own form.
  3. In each request’s payload, event is the event name and event_id is the ID. "event_id": "" means the event has no ID.
  4. Find where the event is sent: a ttq.track call in Site Settings > Code or in a page’s own Custom Code section, a TikTok tag in GTM, or a plugin. In code, TikTok documents the ID in the third argument of ttq.track; use it.

In TikTok Events Manager, the pixel’s detail page shows “Browser”, “Server” and “Server & Browser” figures. TikTok says that if the “Server & Browser” numbers are too low, you should check your deduplication setup.

How to fix

TikTok keeps the first copy of an event and discards later copies with the same pixel code, event name and event_id that arrive within 48 hours. So the browser event and the server event need one shared ID, generated once. On Framer there are three realistic routes.

Route 1: a plugin that sends browser and server events together. Some third-party tracking plugins for Framer send the TikTok Pixel and the TikTok Events API from one setup. PixelFlow, for example, says it pairs browser and server events automatically and generates and matches event IDs, so TikTok counts a conversion once. Check the documentation of whichever tool you use. If you choose this route:

  1. Remove any TikTok base code from Site Settings > Code (older Framer articles call it Project Settings > Custom Code), from pages’ own Custom Code sections and from GTM, so the plugin’s pixel is the only one. A leftover manual pixel keeps sending events without IDs, and usually also shows up as “Duplicate TikTok events”.
  2. Turn on the plugin’s server-side option and check how it handles consent with your cookie banner.

Route 2: GTM with server-side GTM. If your TikTok Pixel runs in GTM (often in the container that Framer’s Cookie Banner loads; in our tests, the banner loaded GTM by itself):

  1. If you set up GTM through TikTok’s interactive flow in Events Manager, TikTok says an event_id variable is configured for you. Check that your event tags use it.
  2. Otherwise, create a variable that produces a new value per event, for example Stape’s Unique Event ID variable from the Community Template Gallery, and put it in De-duplication Configurations > Event ID in each TikTok Pixel tag.
  3. Pass the same value to your server container and send it as event_id with the TikTok Events API (Official) tag, with the same event name and pixel code.

Route 3: your own code. If you send events from custom code, for example from a “thank you” page that a Framer form redirects to, pass the ID as the third argument:

ttq.track('Lead', {
  value: 10,
  currency: 'EUR'
}, { event_id: 'lead-8f3a2c' });

Put event code like this in custom code that runs only on that page (the page’s own Custom Code section, or an entry in Site Settings > Code limited to that page under Pages), with Run set to On Every Page Visit, which Framer describes as suited to tracking events. Then send exactly the same value as event_id in the Events API event, with the same event name and the pixel code as event_source_id.

If your server events come from a Framer form webhook, note that Framer sends your handler the form’s input names and values (plus its own submission ID in a header). The browser and the handler only share an ID if that ID travels with the submission, and Framer’s documentation does not describe a way to add a generated ID to a native form. Plan this with a developer, or use route 1 or 2. Two IDs generated separately in the browser and on the server will never match.

In every route: use a unique value per action (TikTok suggests order numbers or transaction IDs), never a fixed value, and keep first-party cookies on in Events Manager (Tools > Events > Data sources > your pixel > Settings) so the _ttp fallback still works. Publish the Framer site and the GTM containers after changes.

Common causes

  • The pixel was pasted into Framer’s custom code using TikTok’s standard base code and event snippets, which do not include event_id.
  • A plugin or server-side GTM was added for the Events API later, but an older pasted pixel still sends the browser events.
  • In GTM, the Event ID field is empty or uses a value the server never receives.
  • The browser and the server each generate their own ID.

How to verify the fix

  1. In the Network tab, every analytics.tiktok.com/api/v2/pixel request for your key events carries a non-empty event_id, and it changes between actions.
  2. For one test conversion, the server sends the same event_id and event name.
  3. In Events Manager, the “Server & Browser” figures for that event grow (data is not shown in real time).
  4. Re-run the check on IsPixelWorking. The issue should be gone.

Sources

More TikTok guides