Two weeks ago I audited a home-decor DTC brand spending EUR 8,000 a month on Pinterest Ads. Their agency had installed the Pinterest tag eight months prior. The base code was on every page. Pinterest Ads Manager showed PageVisit events ticking along fine. But purchase events had dropped by 44 percent over the preceding six weeks, even though Shopify recorded a steady 280 orders a month with Pinterest-attributed UTMs. The agency blamed "algorithm fluctuations." It was not an algorithm issue. A Shopify theme update had broken the data layer push on the thank-you page, the checkout redirect cleared the _pin_unauth cookie, and nobody had the Pinterest Tag Helper open in months. Three failures, all silent, all fixable in an afternoon.
If you run Pinterest campaigns and rely solely on the browser-side Pinterest tag, you are almost certainly under-counting conversions. This guide covers how the tag works, how to layer the Pinterest Conversions API on top, how to deduplicate the two, and how to verify the whole setup.
How the Pinterest tag works (and where it breaks)
The Pinterest tag is not one snippet. It is two distinct pieces of code that work together.
The base code loads on every page. It initializes the pintrk function, sets your tag ID, and fires a PageVisit event. You get it from Pinterest Ads Manager under Conversions > Tag Manager:
<script>
!function(e){...}(window);
pintrk('load', 'YOUR_TAG_ID');
pintrk('page');
</script>
The event codes go only on action pages -- add-to-cart, checkout, signup, lead form. They must fire after the base code loads. Pinterest supports 20 standard event types, from AddToCart and Checkout to Lead, Signup, and Search.
Confuse the two and your data is silently wrong. I have seen setups where Checkout fired on the cart page instead of order confirmation. Ads Manager happily showed conversions -- just the wrong ones.
Where browser-side pinterest tracking fails
Even if the tag is installed correctly, three forces work against it:
- Safari ITP. Apple's Intelligent Tracking Prevention caps client-side cookies at seven days of Safari use without interaction. If a user clicks your Pinterest ad but does not return within seven days, the cookie is gone and the conversion is unattributable.
- Ad blockers. Any extension that blocks requests to
ct.pinterest.comsilently kills the tag. The event never reaches Pinterest. - Checkout redirects. If your checkout flow redirects through a payment processor on a different domain, the Pinterest cookie can break. This is the same pattern I see on cross-domain tracking setups in GA4, and it is just as destructive for Pinterest.
The result: under-reported conversions, deflated ROAS, and a bidding algorithm starving for signal. The fix is the Pinterest Conversions API.
What the Pinterest Conversions API adds
The Pinterest Conversions API is a server-to-server integration. Your server sends conversion events directly to Pinterest's endpoint, bypassing the browser entirely.
Pinterest recommends running both the tag and the Conversions API in parallel. The tag captures real-time browser signals and click IDs. The API provides a server-side fallback immune to ad blockers, ITP, and redirect breaks. The architecture matches what Meta, Snapchat, LinkedIn, and TikTok all require now. I covered the concept in What Is the Conversions API?.
Prerequisites
Before you configure anything, gather these:
| Requirement | Where to find it |
|---|---|
| Pinterest tag installed on your site | Ads Manager > Conversions > Tag Manager |
| Pinterest tag ID | Ads Manager > Conversions > Tag details |
| Conversions API access token | Business Settings > Conversions > Generate token |
| Ad account ID | Ads Manager URL or Find IDs in Ads Manager |
| Server environment or sGTM container | Your hosting stack or a provider like Stape |
The access token requires Business Admin permissions. If you do not have that role, sort it out before you start. I have seen pinterest tag setup projects stall for weeks over a missing token.
Setting up the Conversions API step by step
There are two main routes: a direct API integration or a server-side GTM (sGTM) approach. I will cover both.
Route 1: Direct API integration
1. Build the event payload. Every CAPI request is a POST to https://api.pinterest.com/v5/ad_accounts/{ad_account_id}/events with the access token as a Bearer token. The required fields include:
event_name-- the conversion event type (e.g.,checkout,add_to_cart,lead,signup)event_time-- epoch timestamp in secondsaction_source--web,offline, orapp_android/app_iosevent_source_url-- the full page URL where the event occurredevent_id-- a unique identifier used for deduplication (more on this below)
2. Attach user identifiers. The user_data object must include at least one valid identifier. The most impactful are hashed email (em), hashed phone (ph), click ID, client IP, and user agent. Email and phone must be SHA-256 hashed after normalizing -- lowercase, trimmed.
3. Include event data. For purchases, attach value, currency, order_id, and product arrays inside custom_data.
4. Send in real time. Pinterest's best practices recommend events within one hour. Batch up to 1,000 per request.
Route 2: Server-side GTM
If you already run a server-side Google Tag Manager container, this is the faster path:
- In your sGTM container, go to Tags > New and import the Pinterest Conversions API tag template from the Community Template Gallery.
- Enter your Pinterest tag ID and access token.
- Map event parameters: event name, value, currency,
event_id, and user data fields. - Set triggers for the server-side events you want to forward (purchase, add-to-cart, lead, etc.).
- Use sGTM Preview mode to verify events are sent, then check Pinterest Ads Manager's event history.
If you do not have an sGTM container yet, my server-side tracking guide walks through the full setup, including the choice between Stape and Google Cloud Run.
Deduplication: the step most setups skip
When you run both the tag and the Conversions API, every conversion can be reported twice. Without deduplication, your ROAS looks inflated and your bidding targets are wrong.
Pinterest deduplicates using the event_id field:
- Generate a unique
event_idon the client side when the conversion happens (a UUID or timestamp-based string works fine). - Pass that
event_idto the Pinterest tag viapintrk('track', 'checkout', { event_id: 'evt_abc123', ... }). - Pass the same
event_idto your server-side Conversions API call. - Pinterest matches the two events by
event_idandevent_nameand counts them as one.
Skip this and Pinterest sees two conversions for every one purchase. I have audited accounts where Ads Manager showed double the actual Shopify orders because nobody implemented event_id.
You can verify your deduplication in Ads Manager under the Conversions tab > Deduplication. Pinterest shows event_id coverage for each event type and flags when it is below the resilient threshold.
Enhanced match: improving signal quality
Enhanced match sends hashed email addresses alongside conversion events. When no Pinterest cookie is present -- the Safari ITP scenario -- Pinterest can still attribute the conversion by matching the hashed email to a Pinterest account.
Two versions exist. Automatic enhanced match lets Pinterest's tag detect email fields on your page and hash them before sending -- no code changes, but it only works if the email is in a visible form field when the tag fires. Manual enhanced match passes the email in the pintrk('load') call: pintrk('load', 'YOUR_TAG_ID', { em: 'user@example.com' }). Pinterest hashes unhashed values in the browser using SHA-256 before transmission.
For the Conversions API, enhanced match is built in -- you are already sending hashed email in user_data. More identifiers means a higher Event Quality Score, more attributed conversions, and better optimization.
Verifying your pinterest tag setup with the Pinterest Tag Helper
The Pinterest Tag Helper is a Chrome extension that inspects tag activity on any page you visit. Install it from the Chrome Web Store, navigate to your site, and look for the red icon. The number in the badge indicates how many events fired on that page.
Use it to check:
- Whether the base code loaded and
PageVisitfired. - Whether your conversion events (AddToCart, Checkout, Lead) fire on the correct pages with the correct parameters.
- Whether the
event_idis present (you will need this for deduplication to work). - Whether enhanced match data is attached.
The pinterest tag helper is a client-side tool. It cannot tell you whether your Conversions API events are reaching Pinterest. For that, go to Ads Manager > Conversions > Event History and filter by source. You should see events tagged as "Conversions API" alongside those from "Pinterest Tag." If only one source appears, your setup is incomplete.
The verification checklist I use
After every pinterest tag setup I do for a client, I run through this:
| Check | Tool | Pass criteria |
|---|---|---|
| Base code on all pages | Pinterest Tag Helper | PageVisit fires on every page load |
| Conversion events on correct pages | Pinterest Tag Helper | Checkout only on order confirmation |
| event_id present on tag events | Browser console | Non-empty, unique per event |
| CAPI events in Ads Manager | Event History | "Conversions API" source visible |
| Deduplication active | Deduplication tab | event_id coverage at threshold |
| Event Quality Score | Event Quality tab | "Good" for key events |
If any of these fail, your pinterest analytics will be unreliable. If you are not sure where the breakdown is, I can audit it for you.
The attribution window change you need to know about
On April 1, 2025, Pinterest removed the "Engagement" component from attribution windows, leaving only click-through and view-through attribution. The default is 30-day click / 1-day view, configurable per campaign. Conversion counts after April 2025 are not directly comparable to historical data. If your year-over-year ROAS looks off, check the attribution window before blaming the tracking -- though I usually find both are broken.
Common pinterest pixel mistakes I fix repeatedly
The same patterns appear on nearly every account I audit:
- Checkout event on the wrong page. Usually the cart page instead of the order confirmation.
- No event_id on tag events. The Conversions API is set up, but deduplication is broken because the browser-side tag never sends an
event_id. - Enhanced match not enabled. Without email data, Pinterest cannot match conversions for cookieless users -- a major blind spot on Safari.
- Stale access token. The CAPI token expired or was regenerated. Server-side events silently stop. Nobody notices for weeks.
- Multiple pinterest tags from different ad accounts. Agency transitions leave orphaned tags firing PageVisit, inflating counts and confusing reporting.
If you have not audited your Pinterest tracking in the last six months, at least one of these is probably live on your site right now.
FAQ
What is the Pinterest tag?
The Pinterest tag is a JavaScript snippet you install on your website to track visitor actions like page views, add-to-cart events, and purchases. It consists of a base code that loads on every page and event codes that fire on specific action pages. Pinterest uses this data for conversion attribution, audience building, and ad optimization.
Do I need the Conversions API if my Pinterest tag is already working?
Yes. The browser-side tag alone misses conversions blocked by ad blockers, lost to Safari ITP cookie expiration, or broken by checkout redirects. The Conversions API sends events server-side, bypassing all of these limitations. Pinterest recommends running both in parallel with deduplication enabled for the most complete conversion data.
How does Pinterest deduplicate tag and Conversions API events?
Pinterest matches events using the event_id field. You generate a unique event_id on the client side and pass it to both the Pinterest tag and the Conversions API call. When Pinterest receives two events with the same event_id and event_name, it counts them as one conversion. Without this, every conversion is double-counted.
What is the Pinterest Tag Helper?
The Pinterest Tag Helper is a free Chrome extension that inspects Pinterest tag activity on any page you visit. It shows which events fired, what parameters were attached, and whether enhanced match data is present. It is a client-side debugging tool and cannot verify whether Conversions API events reached Pinterest.
What is the Event Quality Score in Pinterest Ads Manager?
The Event Quality Score rates your conversion event health as Good, Fair, or Needs Improvement. It evaluates three areas: customer information quality such as hashed email, event metadata completeness, and deduplication coverage. A higher score means Pinterest can attribute more conversions and optimize your campaigns more effectively.
Not sure your Pinterest tracking is actually working? Let me audit it -- I will tell you exactly where events are leaking, duplicating, or missing, and give you a clear plan to fix it.