Pulse by TJDA ← Back to site

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.

On this page 1. Getting started in Pulse 2. Google Analytics 4 3. Google Ads 4. Meta (Facebook & Instagram) 5. LinkedIn 6. Conversion steps & funnels

On the platform = done in Google/Meta/LinkedIn   In Pulse = done in your Pulse Settings

1. Getting started in Pulse

Your Pulse account has already been created for you. Once you log in:

  1. Go to Settings in the top navigation.
  2. First, set your Business type at the top (Webshop, B2B, or SaaS). This tailors the rest of the setup to how you convert.
  3. 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.

Install the connector — WordPress

  1. Upload and activate the Pulse connector plugin — listed as “S2S Platform Connector” in WordPress (Plugins → Add New → Upload).
  2. 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.
  3. 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.

Install the app — Shopify

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. Verify with a test order, same as above.

Import the Google Tag Manager container

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 powers the weekly S2S-vs-browser comparison and the uplift measurement — without it, Pulse cannot show what server-side tracking adds.

  1. Download pulse-gtm-container.json. In Google Tag Manager: Admin → Import Container → choose the file → existing workspace → Merge (never Overwrite).
  2. 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.
  3. 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.
  4. Preview: fire a test conversion and check that the tags fire on the s2s_purchase event. Then Publish.
Which Google Ads labels?Use the labels of your browser conversion actions here (e.g. “Purchase”), not the labels of the S2S actions from section 3. Pulse deliberately keeps them as separate actions: the S2S action is what Pulse feeds server-side, the browser action is its mirror — the weekly check compares the two, and the mirror action on a conversion step (section 6) points at the browser action.

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.

New client checklist

  1. Create the client in Pulse (choose the type: Webshop, B2B, B2C or SaaS) and create the client’s user account.
  2. Install the connector (WordPress) or the app (Shopify) with the API key from Settings; verify the first event.
  3. Import and publish the GTM container; fill the variables.
  4. 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.
  5. Connect GA4 (section 2).
  6. Connect Google Ads (section 3): Conversion ID and labels, the reporting Customer ID, and the account-level Final URL suffix so campaigns are attributable from day one. Pulse enables the daily click validation once the connection is live.
  7. 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.
  8. 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.
  9. Create 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.
  10. Connect Meta (section 4) and LinkedIn (section 5) where applicable.
  11. Share the data processing agreement from the Legal page.
  12. Open the Audit and work through it until every check is green or explained — it verifies exactly the steps above.
  13. Do test conversions on duplicated test pages (e.g. /offerte-2/), never on the real ones — and make cleaning them up the closing step of onboarding: back the rows up, delete them, and let the cards start counting honestly.
  14. After 24 hours: check the first conversions on the Overview and the Google click validation line in the Audit.

Reading the Overview: claimed, missed and real ROAS

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)

  1. 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.
  2. No lead-event duplicates. The server already delivers 100% of leads (as generate_lead); a browser copy would double-count, because GA4 has no deduplication for lead events. Different layers, different event names — nothing collides.
  3. 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

  1. Open Google AnalyticsAdmin (bottom-left gear).
  2. Under the relevant property, click Property Access Management.
  3. Click the + (top-right) → Add users.
  4. Enter this email address:
    pulse-ga4-reader@tjda-s2s-conversions.iam.gserviceaccount.com
  5. 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

  1. Settings → Google Analytics 4.
  2. Enter your Property ID (a number like 123456789, found in GA4 Admin → Property Settings).
  3. Optionally enter a Web Property ID if you have a separate property for uplift comparison.
  4. Set your Reporting timezone.
  5. 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:

  1. Go to your S2S GA4 property → AdminData displayCustom definitions.
  2. Click Create custom dimension and add each of the following:
Dimension name Scope Event parameter
csc_sourceEventcsc_source
csc_consentEventcsc_consent
form_nameEventform_name
form_idEventform_id

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.

Pulse sends conversions to Google Ads (server-side gtag) and reads campaign performance for reporting.

In Pulse Conversion tracking (gtag)

  1. In Google Ads, create a "Website (Google Tag)" conversion action.
  2. 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 mirrorsGive every browser Google Ads tag its Transaction ID: the s2s_event_id dataLayer variable on lead tags, the order number on purchase tags. The server sends the same key, so 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)

  1. In Pulse Settings → Google Ads → Reporting, enter your Customer ID (format 123-456-7890).
  2. If your account is managed through a manager account (MCC), also enter the Login Customer ID (the MCC number).
  3. 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.

4. Meta (Facebook & Instagram)

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)

  1. Open Meta Business SettingsApps (under Accounts).
  2. Click Add → choose "Request access to an app".
  3. 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

  1. Business Settings → UsersSystem Users → select your Conversions API System User.
  2. 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

  1. In the same System User, click Generate token.
  2. Select the TJDA Pulse app.
  3. Tick ads_read and generate.
  4. 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

  1. Settings → Meta.
  2. Enter your Pixel ID and Access token for conversion sending.
  3. For reporting, paste the Insights token and your Ad account ID (format act_XXXXXXXXX).
  4. Save.

5. LinkedIn

NoteLinkedIn supports sending conversions (server-side), but does not offer read-only reporting access the way Google Ads and Meta do. So LinkedIn appears for conversion tracking, not for campaign analysis inside Pulse.

In Pulse Conversion tracking

  1. In LinkedIn Campaign Manager, create a conversion (Account Assets → Conversions) and note its Conversion ID.
  2. Generate an access token with conversion-tracking access for your ad account.
  3. In Pulse Settings → LinkedIn, enter the Access token and Conversion ID.
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:

Quick start with a template

  1. Settings → make sure your Business type is set.
  2. Click "Load [type] template" — this fills in a starting set of steps that fit your business.
  3. 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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.

  1. In Pulse Settings → ChatGPT Ads, enter the Pixel ID and the Conversions API key. The Overview channel card appears once both are set.
  2. 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.
  3. 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.
  4. 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 €49 order is 4900. 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.

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.