Pulse setup guide
Everything you need to connect your marketing platforms to Pulse. Most steps happen in two places: granting Pulse access on the platform side, and entering the details in your Pulse Settings.
1. Getting started in Pulse
Your Pulse account has already been created for you. Once you log in:
- Go to Settings in the top navigation.
- First, set your Business type at the top (Webshop, B2B, B2C or SaaS). This tailors the rest of the setup to how you convert.
- Then connect each marketing platform below.
TipSet your Reporting timezone under the GA4 section to match your Google/Meta accounts (default is Europe/Amsterdam). This keeps daily numbers aligned with what you see in those platforms.
Consent: what Pulse forwards
Pulse forwards a conversion to Google Ads, Meta, LinkedIn, Microsoft or ChatGPT only when the visitor gave explicit consent. The consent signal comes from your cookie banner (Consent Mode v2, or a supported CMP such as Cookiebot or iubenda); the connector reads it, and Pulse checks it again server-side. No signal, a declined banner or an unknown value all mean no consent.
- Conversions without consent are still stored in Pulse, so your own numbers stay complete — they are just never sent to an ad platform.
- Your Pulse GA4 property receives them only as anonymous counts: no visitor ID, no session, no hashed data. Total purchases stay visible there; attribution needs consent.
- If the connector sees no consent signal at all for a day, it shows a notice in its settings page — usually the banner is not wired to Consent Mode.
Test both pathsSubmit one test conversion with the banner accepted and one with it declined. The first should reach your ad platforms; the second should appear in Pulse only. If both reach the platforms, the banner is not signalling consent correctly.
Install on your platform
Open the section that matches your website. One of them is enough.
WordPress / WooCommerce plugin + API key
- Upload and activate the Pulse connector plugin — listed as “S2S Platform Connector” in WordPress (Plugins → Add New → Upload).
- Copy your API key from Pulse → Settings (the monospace block “Use this API key in the Pulse connector plugin”) and paste it in the plugin settings in WordPress.
- Leave Auto-update on: the connector receives its updates through the Pulse update channel, so you never have to re-upload it.
- Verify: place a test order or submit a form — the event should appear in Pulse within a minute. Without this step nothing else in this guide has data to work with.
Shopify app + web pixel
Shopify shops install Pulse as an app: open the installation link you received from your Pulse contact, approve the app, and the web pixel activates automatically — no key to paste. Consent is read from Shopify’s customer privacy settings; make sure your banner is configured there. Verify with a test order.
Lightspeed thank-you page + order webhook
Lightspeed shops connect through a thank-you-page script and an order webhook that your Pulse contact sets up together with you; you receive the exact snippet and settings for your shop. Orders are matched to the visitor’s consent given on your site. Verify with a test order.
Google Tag Manager container the browser layer — all platforms
The connector measures and forwards server-side. The GTM container adds the browser layer: the same conversions fired as regular browser tags, deduplicated against the server through the shared event ID (Meta) and transaction ID (Google Ads). This layer is what the server is measured against in the ad platforms: your browser action (the mirror) next to the Pulse action, and the weekly S2S-vs-browser check. Pulse’s own uplift figure (server conversions without a browser twin) will need a separate Pulse browser tag with its own browser key; that tag is not available yet, so treat the uplift figure as not available until then.
- Download the Pulse GTM template (log in to Pulse first; the file is
pulse-gtm-standaard.json). In Google Tag Manager: Admin → Import Container → choose the file → existing workspace → Merge (never Overwrite).
- The import adds two triggers (
s2s_purchase, s2s_lead — pushed to the dataLayer by the connector) and sixteen tags for GA4, Google Ads, Meta, LinkedIn, Microsoft Ads and ChatGPT Ads.
- Fill the constant variables under Variables: GA4 Web Measurement ID (G-…), Google Ads Conversion ID (AW-…), Google Ads Purchase Label and Lead Label, Meta Pixel ID, the LinkedIn IDs, and the Microsoft UET Tag ID and ChatGPT Pixel ID. Variables for channels you don’t use can stay empty or on their placeholder — the tags then simply do nothing.
- Preview: fire a test conversion and check that the tags fire on the
s2s_purchase event. Then Publish.
Your API key never goes in GTMNone of the steps above asks for your Pulse API key, and no tag should carry it: the connector sends to Pulse from your server. If any tag in your container sends to a Pulse address (such as /api/webhook/receive.php) or contains your API key, pause it and ask your Pulse representative to rotate the key — anyone who opened your site could read it. When the Pulse browser tag is available, it uses the separate browser key from Settings (it starts with s2sb_), never the API key.
Two Google Ads actions per conversionPulse keeps two separate Google Ads actions per conversion: your browser action (the mirror, e.g. “Purchase”) and the Pulse action from section 3. The constants above take the labels of the browser action. Then add, per event, a second Google Ads conversion tag: in GTM, copy the imported tag (so trigger and consent settings stay identical) and change only the conversion label to that of the Pulse action; it keeps the same Transaction ID ({{s2s_event_id}} on the lead tag, the order number on the purchase tag); the imported container does not contain that second tag. Pulse’s server upload goes to the Pulse action only, so the Pulse action counts browser plus server, deduplicated, and should never fall below the mirror; the weekly check compares the two, and the mirror action on a conversion step (section 6) points at the browser action. The second tag sends straight from the visitor’s browser to the Pulse action in your own Google Ads account: TJDA does not receive the individual tag hits, so the tag itself is not part of the processing agreement. For the weekly check Pulse reads only the daily totals per conversion action (number and value of conversions, no personal data) from your account, as it does for every other action.
Optional refinements view-through, per-form and per-service tags
Optional — maximum view-through: the Microsoft UET - Base and ChatGPT - Base pixel tags fire on the two conversion triggers by default, which is enough for click-through measurement and dedup. Microsoft audiences and ChatGPT view-through attribution both need the pixel on every page: for that, change the firing trigger of those two base tags to All Pages. The conversion tags and their event-ID dedup stay untouched.
Optional — per-form browser mirrors: with connector 1.2.19+ the s2s_lead push carries a form_id token (cf7-…, wpf-…, elt-…) identical to the server event. Add a Data Layer Variable for form_id, duplicate the lead tag per form with a trigger condition on that token and the browser label of that form’s mirror action — and pause the generic lead tag (or set its action to secondary) so nothing counts twice.
Optional — per-service triggers: with connector 1.2.21+ and the Form segment plugin setting on, the same push also carries form_segment — the value of the choice field with field ID type (“Roof”, “Facade”). Add a Data Layer Variable for it and use it as a second trigger condition to fire a separate browser tag per service — the browser-side counterpart of segment-matched conversion steps.
Onboarding checklist who does what, in order
You = your team or agency Pulse = done by TJDA
- Pulse Your account is created with the right business type (Webshop, B2B, B2C or SaaS) and your login.
- You Install the connector, app or Lightspeed script with the API key from Settings; verify the first event.
- You Import and publish the GTM container; fill the variables.
- You Double-counting check: does the site already run its own Microsoft UET tag or ChatGPT pixel outside this container? Either remove it, or give it the same event ID the container tags use — otherwise that platform counts browser and server as two conversions. Pulse itself always deduplicates correctly.
- You Give Pulse access to GA4 (section 2) and Search Console (section 9); Pulse enters the property details.
- Pulse Loads your history once (Search Console, GA4 landing pages and the ad platforms): twelve months back by default. Need a longer comparison? Ask before the first load — the limit is set per account, up to sixteen months, which is all Search Console itself keeps. A request further back is refused rather than silently shortened.
- You Grant Google Ads access (section 3) and set the account-level Final URL suffix so campaigns are attributable from day one; Pulse creates its own conversion actions (always named “Pulse | …”; your existing actions are never changed or removed) and enables the daily click validation.
- You Attribution pre-flight: open the site with
?gclid=TEST123 appended, accept the consent banner, and confirm a _gcl_aw cookie appears (DevTools → Application → Cookies). No cookie means Consent Mode is not wired to the banner — click attribution will fail however perfect the rest is. While you are in Google Ads, confirm auto-tagging is on.
- You Strict consent banners (CookieScript and friends) actively delete first-party cookies they don’t recognise before the visitor decides. Whitelist the Pulse cookie set —
gclid, wbraid, gbraid, _fbc, li_fat_id, msclkid, oppref, _pulse_ids, _pulse_ch — as a hardening step; the vendor-cookie fallback via Consent Mode keeps attribution alive either way.
- Pulse Conversion steps (section 6): the purchase step with its mirror action, and one step per form — a contact form and a quote form are different conversions and deserve separate Google Ads actions.
- You Grant Meta (section 4) and LinkedIn (section 5) access where applicable.
- Pulse Shares the data processing agreement from the Legal page.
- Pulse Works through the Audit until every check is green or explained — it verifies exactly the steps above.
- You Do test conversions on duplicated test pages (e.g.
/offerte-2/), never on the real ones. Test events stay stored, but Pulse sets your measurement start to the go-live date, so everything before it is excluded from the cards and the trend automatically.
- You After 24 hours: check the first conversions on the Overview and the Google click validation line in the Audit.
2. Google Analytics 4
Pulse reads your GA4 data to show analyses and to compare server-side vs web tracking. It needs read-only (Viewer) access to your GA4 property.
The three-part GA4 recipe (Pulse property)
- Duplicate the config/pageview tag to the Pulse GA4 property. This is the stitching foundation: it sets the property’s own
_ga_… session cookie, so the server events Pulse sends attach to the right visitor and session.
- No lead-event duplicates. The server already delivers every lead (as
generate_lead): consented leads with full detail and session stitching, leads without consent as anonymous counts. A browser copy would double-count, because GA4 has no deduplication for lead events. Different layers, different event names — nothing collides.
- Do duplicate the purchase event (webshops), keeping its
transaction_id. GA4 natively deduplicates purchases on the order number, so browser and server melt into the union — count right, attribution from the session-linked browser hit.
Sites often run two GA4 properties side by side — check which _ga_… cookie belongs to the Pulse property before assuming the pageview tag still needs adding.
On the platform Give Pulse access to your GA4 property
- Open Google Analytics → Admin (bottom-left gear).
- Under the relevant property, click Property Access Management.
- Click the + (top-right) → Add users.
- Enter this email address:
pulse-ga4-reader@tjda-s2s-conversions.iam.gserviceaccount.com
- Set the role to Viewer and save.
ImportantAdd this to every GA4 property you want in Pulse. If you have a separate server-side (S2S) property later, it must be added there too.
In Pulse Enter your property details
- Send your Property ID (a number like
123456789, found in GA4 Admin → Property Settings) to TJDA support, and a Web Property ID if you have a separate property for uplift comparison. TJDA connects the property, because Pulse reads it with TJDA’s own service account.
- Settings → Google Analytics 4: set your Reporting timezone.
- Save. Data appears after the next sync (within a day).
Recommended: create Custom Definitions in GA4
To break your server-side events down by source, consent and form in GA4, register these as custom dimensions:
- Go to your S2S GA4 property → Admin → Data display → Custom definitions.
- Click Create custom dimension and add each of the following:
| Dimension name |
Scope |
Event parameter |
csc_source | Event | csc_source |
csc_consent | Event | csc_consent |
form_name | Event | form_name |
form_id | Event | form_id |
Conversions without marketing consent arrive as anonymous pings that carry none of these parameters, so they show as (not set) in these dimensions.
You do not need to build Explorations — Pulse handles the analysis for you. These dimensions simply let you segment the data inside GA4 if you want to.
3. Google Ads
Pulse sends conversions to Google Ads (server-side gtag) and reads campaign performance for reporting.
In Pulse Conversion tracking (gtag)
- In Google Ads, create a "Website (Google Tag)" conversion action.
- In Pulse Settings → Google Ads, enter the Conversion ID (
AW-XXXXXXXXXX) and the conversion labels.
The AW- prefix is literalThe Conversion ID must start with AW-. Bare digits fail the internal validation and Pulse silently falls back to the legacy API route — conversions seem to flow, but the server-side Google tag never fires.
Dedup fields on the browser tagsGive both browser Google Ads tags (browser action and Pulse action) the same Transaction ID: the s2s_event_id dataLayer variable on lead tags, the order number on purchase tags. The server sends the same key to the Pulse action, so within that action Google keeps exactly one conversion whether the browser hit, the server hit, or both arrive. Counting type per role: leads One per click, purchases Every — the transaction ID does the dedup there.
In Pulse Reporting (campaign performance)
- In Pulse Settings → Google Ads → Reporting, enter your Customer ID (format
123-456-7890).
- If your account is managed through a manager account (MCC), also enter the Login Customer ID (the MCC number).
- Complete the connection when prompted.
Common pitfall: USER_PERMISSION_DENIEDIf reporting fails with a permission error, it's almost always because the Login Customer ID (MCC) was left empty while the account is accessed via a manager account. Fill it in and reconnect.
Campaign tagging (recommended)
Google’s auto-tagging only adds a gclid; it does not tell Pulse which campaign a click belongs to. Add a Final URL suffix at account level (Google Ads → Settings → Tracking) so every click carries its campaign ID — Pulse resolves IDs to campaign names automatically:
utm_source=google&utm_medium=cpc&utm_campaign={campaignid}&utm_content={creative}
Without it, the Missed ad conversions by campaign card cannot attribute half of your conversions to a campaign.
The “Pulse click check” conversion action
When click validation is enabled for your account, Pulse creates a small helper conversion action in Google Ads named Pulse click check (type: upload clicks, secondary). Pulse uses it only for validate-only requests: every day it asks Google whether the stored click of each consented conversion is still recognised and within the attribution window. Nothing is ever uploaded to it and it never counts conversions — please leave it in place. The result appears in the Audit as Google click validation.
Steps matter for reportingServer-side forwarding works from the labels above, but Pulse only knows which Google Ads action is your conversion when a conversion step maps it (section 6). That mapping powers claimed conversions per campaign, the missed-conversion figures and the weekly S2S-vs-browser check.
Pulse sends conversions to Meta (Conversions API) and reads ad performance. This is the most involved setup because Meta separates app access, pixel access, and ad-account access.
Before you start: Business VerificationYour Meta Business must be verified before you can grant app access. Check under Business Settings → Security Center. If it says "not verified," start verification first — it can take up to 2 business days.
On the platform Step 1 — Add the Pulse app (the right way)
- Open Meta Business Settings → Apps (under Accounts).
- Click Add → choose "Request access to an app".
- Enter the TJDA Pulse App ID (your Pulse contact will provide it) and send the request.
Critical — don't use the wrong optionDo not use "Add an app" / the option that says "if your business needs to advertise for it." That flow tries to make your business the owner of the app and fails with an "unexpected technical issue." Always use "Request access to an app." This single mistake is what causes people to get stuck for weeks.
On the platform Step 2 — Assign the app + ad account to your System User
- Business Settings → Users → System Users → select your Conversions API System User.
- Under Assigned assets, make sure all of these are added:
- App: TJDA Pulse (with
ads_read)
- Pixel / Dataset: your pixel (View / Use events)
- Ad account: your ad account (at least View account)
Common pitfall: "Ad account owner has NOT granted ads_read"If the sync fails with this message, the ad account is missing from your System User's assets. Adding the app and pixel is not enough — the ad account itself must be assigned, because that's where campaign insights live.
On the platform Step 3 — Generate the token
- In the same System User, click Generate token.
- Select the TJDA Pulse app.
- Tick ads_read and generate.
- Copy the token (you'll only see it once).
Good to knowIf you change the ad-account permission after generating the token, the existing token usually inherits it automatically — no need to regenerate.
In Pulse Enter the token
- Settings → Meta.
- Enter your Pixel ID and Access token for conversion sending.
- For reporting, paste the Insights token and your Ad account ID (format
act_XXXXXXXXX).
- Save.
On the platform Event ID in Google Tag Manager (deduplication)
Meta only deduplicates your browser Pixel event against Pulse’s server event when both carry the same event name and the same event ID, and use the same Pixel ID. Pulse sends Meta exactly the event ID your connector or integration provides — in both Event modes (Pulse Settings → Meta):
- Event ID: the Meta purchase and lead tags send
{{s2s_event_id}} as eventID, as in the Pulse container. That is the same value the connector sends server-side; Pulse no longer replaces it with the order number. Shopify and Lightspeed shops with their own Meta browser tag: ask your Pulse representative for the matching event ID format.
- Event name, Custom events (default): Pulse sends
purchase and lead (also when the step’s Meta event name is on auto), unless your conversion step sets a Meta event name (section 6) — to deduplicate against browser Purchase and Lead events, set the step to Purchase or Lead.
- Event name, Standard events: Pulse sends
Purchase and Lead.
Using your own Meta tag with the order number?Earlier setup notes suggested sending the order number as eventID for purchases. Pulse now always sends the event ID of your connector or app, so with the WooCommerce connector change such a tag to {{s2s_event_id}} (on Shopify or Lightspeed, ask your Pulse representative for the matching format); otherwise Meta cannot deduplicate and purchases can count twice. Switching the Event mode only changes the event name, not the event ID.
5. LinkedIn
One LinkedIn token for two usesPulse uses LinkedIn for reporting (read-only: campaign, creative and demographic analytics, plus your conversion rules and their results) and for conversion tracking (sending conversions server-side). Both use the same access token in Pulse Settings → LinkedIn. Connecting with the Connect button, and the automatic token refresh, replace that token. Before you connect or reconnect, check with your Pulse representative that the token covers both reporting and conversion access, so conversion tracking keeps working.
In Pulse Conversion tracking
- In LinkedIn Campaign Manager, create a conversion (Account Assets → Conversions) and note its Conversion ID.
- Generate an access token with conversion-tracking access for your ad account.
- In Pulse Settings → LinkedIn, enter the Access token and the Conversion IDs for Purchase and Lead.
Setup supportLinkedIn's exact steps vary by account type. If you're setting up LinkedIn, contact your Pulse representative — we'll walk you through it for your specific account.
6. Conversion steps & funnels
Why steps matterSteps do more than route forwarding: the Google Ads action you select on a step is what Pulse reads back as claimed conversions (per campaign, by conversion date), what the missed-conversion figures are measured against, and what the weekly S2S-vs-browser check monitors. An account without steps still forwards via the Settings labels, but reports without claim data — the Audit flags this.
Pulse measures your conversions as steps. There are two kinds:
- Funnel steps — ordered stages that form your conversion funnel (webshop: add to cart → begin checkout → add shipping info → purchase; SaaS: registration → trial → completed).
- Standalone conversions — one-off conversions that aren't part of a funnel, like a contact form or demo booking.
Quick start with a template
- Settings → make sure your Business type is set.
- Click "Load [type] template" — this fills in a starting set of steps that fit your business.
- Adjust each step: set how it's matched (a Form ID for forms, or an Event type for custom integrations) and enter the per-platform conversion IDs.
Custom integrationsIf your events come from a custom platform (not WordPress forms), your developers will receive a tailored implementation guide from us with the exact webhook details and event names.
7. Microsoft Ads
Microsoft follows the same browser-plus-server model, with one pleasant simplification: one goal can receive both sides. The UET browser tag and Pulse’s Conversions API share the event ID, and Microsoft deduplicates on it — no separate browser-mirror goal needed.
- In Microsoft Ads, create Custom event goals. The match is on the event name condition inside the goal, never on the goal’s display name: a goal with action-equals
lead receives everything Pulse sends as lead, whatever the goal is called.
- On a conversion step, fill Microsoft event name (lowercase, underscores — e.g.
lead, or lead_roof per segment). Empty means the step’s event type is used.
- Per-segment goals are optional: give each segment step its own event name and create a matching goal per service. Keep one generic
lead goal as the collector — but never set collector and specifics to primary together, or the conversion column counts both.
- Counting: Unique for leads. Start every Pulse goal as secondary while the client’s existing measurement stays primary; promote after the transition.
Scope note: Microsoft’s API requires at least one identifier (click ID or hash) per event, and those are consent-gated — the Pulse goal therefore counts the consented union. A test lead without consent is skipped by design.
8. ChatGPT Ads
ChatGPT Ads follows the familiar two-layer model: the container’s browser pixel and Pulse’s server-side Conversions API, deduplicated through the shared event ID that the container tags already pass in the pixel options.
- In Pulse Settings → ChatGPT Ads, enter the Pixel ID and the Conversions API key. The Overview channel card appears once both are set.
- Fill the CONST - ChatGPT Pixel ID container variable (section 1) so the browser tags go live. For view-through attribution, move the base pixel to All Pages — the click side works either way.
- Attribution is native:
oppref is the click reference, obref the view reference — the connector captures both, and the channel card splits click vs view on them.
- On conversion steps, enable ChatGPT and set the event type where it should differ from the step’s own.
Amounts are in minor unitsThe ChatGPT pixel and API expect cents, not euros — a €150 order is 15000. The container’s value variable converts automatically; only custom implementations need to multiply by 100 themselves.
Availability note: ChatGPT Ads rolls out per market — confirm the client’s account has campaign access before promising numbers. Server events are accepted regardless; claims follow once campaigns run.
9. Google Search Console
Pulse reads your Search Console data to connect search queries and landing pages to the conversions it measures (the SEO analyses). It needs read-only access to your Search Console property.
On the platform Give Pulse access to Search Console
- Open Search Console and select your property (a domain property looks like
sc-domain:example.nl, a URL-prefix property like https://example.nl/).
- Go to Settings → Users and permissions → Add user.
- Enter this email address (the same service account as for GA4):
pulse-ga4-reader@tjda-s2s-conversions.iam.gserviceaccount.com
- Set the permission to Restricted — that is all Pulse needs — and save.
Only an owner can add usersAccess to GA4 does not carry over to Search Console: they manage users separately, and only a verified owner of the property can add one. If the option is missing, ask whoever verified the domain.
In Pulse Enter the property
- Send the property to TJDA support exactly as Search Console shows it (e.g.
sc-domain:example.nl). TJDA connects it under Settings → Google Analytics 4 → Search Console property.
- Search data appears after the next sync; Search Console itself lags two to three days. Pulse loads the history once, twelve months back by default (up to sixteen on request; see the onboarding checklist).
10. Reading your dashboard
The Overview: claimed, missed and real ROAS
- Claimed — what the ad platform reports for your mapped conversion action, by conversion date. Google’s figure includes its modeled and engaged-view conversions; Meta’s includes view-through.
- Missed — conversions Pulse counted with a stored ad click that the platform does not claim, split into purchases and leads. This is a lower bound: the platform’s claim may contain view-based conversions Pulse cannot see as clicks.
- Total — claimed + missed, overlap-free by construction.
- Claimed ROAS vs Real ROAS — claimed revenue / cost versus total revenue / cost. The ROAS adjustment (×) is their ratio: how much higher your true return is than what the platform reports, so you can set platform ROAS targets accordingly lower.
The trend card: what server-side tracking adds
- Grey line — Google’s own weekly count for your conversion actions (all sources, browser and server together).
- Green line — the consented conversions with a Google click signal that Pulse delivered server-side: what Pulse feeds into that count.
- Dashed vertical line — your delivery start: the week Pulse began feeding Google. The comparison is “before” versus “since”.
- Headline percentage — conversions per euro since delivery started versus the baseline before it; a second figure shows the raw volume change. The baseline can be switched between pre-delivery and same weeks last year (seasonality-free) where a year of history exists.
- Dotted tail on the right — the current, unfinished week. It moves as conversions land but never counts in the percentages, which only judge completed weeks.
- “Insufficient data” or “Building the trend” — the card waits for enough baseline weeks and at least two full weeks of delivery before it shows a verdict. Negative results are shown just as honestly as positive ones.
11. Account & billing
- Password — change it under Account in the top navigation.
- Billing — if you subscribe to Pulse directly, the Account page shows Manage billing: invoices, payment method and billing details, all in one place. Invoices are also sent by email each month.
- Via an agency — if your agency manages Pulse for you, billing runs through them; the Account page tells you so, and there is nothing to set up.
Stuck on any step? Contact your Pulse representative — some platform approvals (especially Meta verification) can take a couple of days, and we're happy to help you through them.