Tag: Lead Tracking

  • HubSpot Attribution: What It Tracks, Where It Falls Short, and How to Fill the Gaps

    HubSpot includes attribution reporting as part of its marketing hub — tools for tracing contacts back to their original source, reporting on which campaigns and channels drove leads, and connecting marketing activity to sales pipeline and closed revenue.

    If you use HubSpot as your CRM, understanding what it tracks accurately, where its attribution data comes from, and where its limitations are will help you make better decisions about your marketing data. This post covers HubSpot’s attribution capabilities, how they integrate with WordPress, and where they fall short in ways that first-party attribution tools can fill.

    What HubSpot Attribution Actually Tracks

    HubSpot’s attribution data flows from three main sources: HubSpot-native forms, the HubSpot tracking code on your website, and UTM parameters in URLs.

    Original Source and Latest Source

    Every contact in HubSpot has two built-in source properties: Original Source (the channel that drove their first recorded interaction) and Original Source Drill-down 1 and 2 (more specific data about the source, like the exact search term or social network).

    Original Source is automatically set when a contact is created and never changes. HubSpot captures it from:

    • The URL they visited when they first submitted a HubSpot form (if a UTM was present, HubSpot reads it)
    • The referring URL (if they arrived from a search engine, HubSpot records Organic Search; from social, Social Media; from a direct visit, Direct Traffic)
    • For email clicks from HubSpot emails: Email Marketing
    • For conversions through HubSpot’s paid integrations (Google Ads, Facebook Ads connected to HubSpot): Paid Search or Paid Social

    HubSpot also records “Latest Source” properties that update with each new session — useful for seeing the last touchpoint before a deal closes, not just the first one.

    Multi-Touch Attribution Reports

    HubSpot Marketing Hub Professional and Enterprise include Attribution Reports that show which content and interactions influenced contacts throughout their journey — not just the first and last touch. Models available include First Touch, Last Touch, Linear (equal credit to all), and Time Decay (more credit to recent touches).

    These reports are built from HubSpot’s own session data (from the tracking code on your site) and require contacts to be cookied by HubSpot before their interactions are recorded in the attribution path. Contacts who were anonymous across multiple sessions before converting may have incomplete attribution paths.

    HubSpot and WordPress: How the Integration Works

    HubSpot’s WordPress integration is one of the more comprehensive in the ecosystem:

    The HubSpot WordPress Plugin

    HubSpot’s official WordPress plugin (available free in the plugin directory) does several things simultaneously:

    • Installs the HubSpot tracking code on all WordPress pages, enabling contact tracking and session recording
    • Embeds HubSpot forms on WordPress pages via a Gutenberg block or shortcode
    • Connects WordPress visitor data to the HubSpot contact record
    • Enables live chat (HubSpot’s chat widget) on WordPress

    When a visitor submits a HubSpot form on your WordPress site, HubSpot creates or updates a contact record, logs the page they submitted from, reads the UTM parameters from the URL (if present), and sets the Original Source accordingly. This is the cleanest path to source attribution in HubSpot — form submissions through HubSpot’s own forms, on a page with the HubSpot tracking code.

    Non-HubSpot Forms: Where Attribution Breaks

    Many WordPress sites use form plugins (Gravity Forms, WPForms, Contact Form 7, Elementor Forms) rather than HubSpot’s native form embed. When a visitor submits a non-HubSpot form, HubSpot doesn’t automatically receive the submission — you need to connect them through Zapier, Make, or a native integration.

    The attribution gap: when a contact is created in HubSpot via Zapier from a non-HubSpot form, HubSpot typically records the source as “Offline Sources” or “Other.” It does not read UTM parameters from the form submission data unless you explicitly map UTM fields from your form to HubSpot contact properties through the Zapier action.

    This means that if your WordPress site uses Gravity Forms connected to HubSpot via Zapier, and a visitor comes from a Google ad with UTM parameters, HubSpot may record them as “Offline Sources” rather than “Paid Search” — losing the attribution entirely.

    The fix: add hidden UTM fields to your non-HubSpot forms, capture UTM parameters in those fields, and map them explicitly to HubSpot’s Original Source properties via your Zapier action or native integration. This preserves the attribution chain even when the form is not a HubSpot native form.

    HubSpot Attribution Limitations

    Requires the HubSpot Cookie to Track Sessions

    HubSpot’s session and attribution tracking requires the HubSpot tracking code to be on the page AND the visitor to accept cookies (where consent is required by GDPR, CCPA, or similar). Visitors who block third-party cookies, use browser extensions that block tracking, or decline cookie consent are invisible to HubSpot’s attribution system.

    This isn’t unique to HubSpot — it affects all cookie-based analytics and CRM tracking. But it means HubSpot’s attribution data represents the fraction of traffic that’s fully cookied and tracked, not all traffic.

    Cross-Domain Attribution

    If your WordPress site and your actual product or scheduling system are on different domains, HubSpot’s tracking cookie doesn’t cross the domain boundary. A visitor who arrives at your WordPress site from a LinkedIn ad, browses content, and then clicks through to a booking page on a different domain is tracked on the WordPress side but not on the booking page side — the attribution path ends at the domain boundary.

    HubSpot doesn’t have a native cross-domain attribution solution equivalent to GA4’s cross-domain tracking configuration. You’d need to pass the HubSpot contact information (via a URL parameter or cookie workaround) to the second domain and merge the records manually — a non-trivial implementation.

    Multi-Session Customer Journeys

    HubSpot’s Original Source is set at first contact creation and doesn’t update. But a contact’s journey often spans multiple sessions over weeks or months. If a contact was originally from Organic Search but has since interacted with email campaigns, paid retargeting, and direct visits — all of which influenced the eventual closed deal — the Original Source attribution to Organic Search may understate the role of other channels.

    HubSpot’s multi-touch attribution reports (Professional/Enterprise) address this by crediting multiple touchpoints, but those reports are based on HubSpot-tracked sessions only and require Marketing Hub access at a higher tier than most small and mid-size businesses use.

    Extending HubSpot Attribution With First-Party Data

    First-party attribution tools like Sales Provenance complement HubSpot’s attribution by capturing lead source data at the WordPress level — independent of the HubSpot cookie — and writing it to the contact record when a form is submitted.

    How this works in practice: when a visitor arrives at your WordPress site, Sales Provenance captures their UTM parameters and referring source and stores this data server-side (first-party, not dependent on third-party cookies or HubSpot’s tracking code). When the visitor converts via any form (HubSpot native or WordPress plugin), the lead source data is included in the submission and passed to the HubSpot contact record as custom properties.

    This fills the gaps where HubSpot’s native attribution falls short: non-HubSpot form submissions, cookie-blocked visitors, and multi-session journeys where the first-touch source needs to be captured before the HubSpot cookie is even set.

    The result: HubSpot contact records with accurate first-touch lead source data regardless of which form the visitor used or whether they accepted cookies at the session level.

    HubSpot Attribution Reporting in Practice

    Using HubSpot attribution data effectively requires knowing which reports to look at and what they mean:

    • Original Source report (Contacts > Reports > Contacts by Original Source): what channel brought in your contacts. This is the cleanest single-view of acquisition-channel contribution to contact creation.
    • Attribution Reports (Marketing Hub Pro+): multi-touch credit across the buyer journey for contacts, deals, and revenue. More nuanced than Original Source but requires more data volume to be meaningful.
    • Campaign ROI: if you run campaigns in HubSpot (paid ad connections, email campaigns, landing page campaigns), HubSpot tracks contacts created, deals influenced, and revenue attributed per campaign.
    • Revenue Attribution (Marketing Hub Enterprise): connects marketing activity to closed revenue in the CRM. Requires a well-maintained sales pipeline with consistent deal stage progression.

    For smaller HubSpot users on Starter or Free, the Original Source contact property is the primary attribution signal. Make sure it’s being set correctly by verifying that HubSpot forms and tracking code are installed on all key conversion pages, and that UTM parameters from your campaigns are present in the URLs you use.

    If you want help extending HubSpot attribution with first-party lead source capture on your WordPress site, Sales Provenance is built for this.

  • WordPress Heatmap: How to Install, Read the Data, and Improve Lead Conversions

    Heatmaps show you where visitors click, scroll, and spend time on your WordPress pages. Unlike traffic analytics (which tell you how many people visited a page), heatmaps tell you what they actually did while they were there — which parts of the page they engaged with, where they dropped off, and whether they even reached your call to action before leaving.

    For a WordPress site focused on lead generation, heatmaps are diagnostic tools. They answer the questions that traffic data can’t: Why is this landing page getting traffic but few form submissions? Why are people leaving before they reach the CTA? Is anyone actually reading the form fields or are they bouncing before they get there?

    This post covers how to add heatmap tracking to WordPress, which tools to use, what to look for in the data, and how heatmap insights connect to lead source attribution.

    Heatmap Types: What Each One Shows

    There are three primary heatmap types, each answering a different question:

    Click Heatmaps

    Click heatmaps show where visitors click on the page — not just buttons and links, but anywhere on the page. “Dead click” data (clicks on non-interactive elements) reveals where visitors expect to click but can’t, which often means they expect something to be a link or CTA when it isn’t. Click heatmaps also show which CTAs, buttons, and links are getting the most engagement and which are being ignored.

    Scroll Heatmaps

    Scroll heatmaps show how far down the page visitors scroll before leaving. For lead generation pages, this is often the most diagnostic data: if your form is below the fold and 70% of visitors aren’t scrolling past the midpoint of the page, your form is effectively invisible to 70% of your traffic. Scroll data determines whether content needs to be moved up, whether the page is too long, or whether a sticky CTA would help.

    Move Heatmaps (Cursor Tracking)

    Move heatmaps track cursor movement, which on desktop correlates loosely with where a visitor’s eyes are going. Areas of high cursor concentration often indicate where visitors are reading most carefully. This is useful for understanding whether key value propositions and proof elements (testimonials, stats, trust badges) are actually being noticed.

    Best Heatmap Tools for WordPress

    Hotjar

    Hotjar is the most widely used heatmap tool and the easiest to get started with on WordPress. Adding it requires pasting a single JavaScript snippet (or using the official Hotjar WordPress plugin that does this for you). Once added, Hotjar automatically collects heatmap data on any page you enable it for.

    Hotjar also includes session recordings (video replays of individual user sessions) and feedback widgets (on-page surveys asking visitors why they’re leaving). The heatmaps and recordings together give you both the pattern (click heatmap shows where most people click) and the individual story (session recording shows exactly what a frustrated user did on the page before leaving).

    Free plan: 35 daily sessions for heatmaps, recordings. Paid plans start at $32/month for more sessions and additional features. For most WordPress sites, the free plan is enough to gather meaningful diagnostic data.

    Microsoft Clarity

    Microsoft Clarity is completely free with no session limits. It provides click heatmaps, scroll heatmaps, and session recordings. Clarity also has built-in AI-powered “Copilot” summaries that explain what the heatmap data means in plain language — useful if you’re new to interpreting this kind of data.

    Adding Clarity to WordPress: install the Official Microsoft Clarity plugin from the WordPress plugin directory, authenticate with your Microsoft account, and select your Clarity project. Data collection starts immediately after installation.

    For businesses that don’t want to pay for Hotjar, Clarity is an excellent alternative. The main trade-off: Clarity’s UI is less polished than Hotjar’s, and it doesn’t have feedback/survey widgets. For pure heatmap and session recording purposes, it’s comparable.

    Lucky Orange

    Lucky Orange ($19/month) combines heatmaps, session recordings, conversion funnels, and live chat — a broader toolkit than Hotjar or Clarity at a mid-range price. Its dynamic heatmaps can show data filtered by traffic source (only show clicks from paid search visitors), which directly connects heatmap data to your marketing channels. For teams that want to understand how different acquisition channels behave differently on the same pages, this filtering capability is particularly useful.

    Crazy Egg

    Crazy Egg ($49/month) invented the heatmap category and has more visualization options than most tools: traditional heatmaps, confetti maps (showing individual clicks color-coded by traffic source), scroll maps, and overlay reports (showing click percentages on specific elements). Its A/B testing feature allows you to test design variants directly within Crazy Egg without needing a separate testing tool.

    Adding a Heatmap Tool to WordPress

    General installation process (applies to Hotjar, Clarity, Lucky Orange, Crazy Egg):

    1. Create an account with your chosen heatmap tool.
    2. Add your WordPress site URL to the tool’s project settings.
    3. Retrieve the tracking script (a JavaScript snippet with your site ID).
    4. Add the script to WordPress. Options:
      • Use the tool’s official WordPress plugin if available (Hotjar, Clarity, Lucky Orange each have one).
      • Or use Google Tag Manager to add the script — paste it as a Custom HTML tag that fires on All Pages. This is the recommended approach if you already use GTM, since it keeps all tracking in one place.
      • Or use a plugin like “Insert Headers and Footers” to add the script to the <head> without modifying theme files.
    5. Verify installation by visiting your site and checking the heatmap tool’s dashboard for an “active” status.

    Important: heatmap tools require some session volume before the data is meaningful. A page needs at least 100-200 sessions before click and scroll patterns are reliable. Don’t make layout changes based on 20 sessions — let data accumulate before drawing conclusions.

    What to Look For in Heatmap Data for Lead Generation Pages

    The specific diagnostic questions heatmap data can answer for a lead generation page:

    Are visitors reaching the form?

    Scroll map: what percentage of visitors see the fold where the form starts? If your form starts 60% down the page and only 40% of visitors scroll that far, the form is only being seen by a fraction of your traffic. Possible fixes: move the form up, add a sticky CTA that appears in the header as users scroll, or add a “jump to form” button above the fold.

    Are they clicking the CTA?

    Click heatmap on your primary CTA button. High traffic + low CTA clicks = the button either isn’t visible, isn’t compelling, or the surrounding content hasn’t built enough trust to motivate action. Session recordings will show you which of these is the cause.

    What are they clicking instead?

    Dead clicks on non-link text or images near your CTA can mean visitors are clicking where they expect a button to be. Rage clicks (rapid repeated clicking in the same area) indicate frustration — something they expect to be clickable or functional isn’t working. Both signal UX fixes that are blocking conversions.

    Where do they drop off in a long page?

    If your page has a large drop-off in scroll depth at a specific point, something at that point is causing visitors to leave or lose interest. Boring content, a confusing section, a CTA that didn’t convert them (so they gave up), or simply too much text before the value proposition is clear. Identify the drop-off point and revise the content at that section.

    Heatmaps and Lead Source Attribution

    A sophisticated use of heatmap data: filtering heatmaps by traffic source to understand whether visitors from different channels behave differently on the same page.

    A visitor from a Google ad has already been pre-qualified by the ad copy — they know what the page is about before they arrive. A visitor from organic search may have different expectations. A visitor from social media may be less intent-driven and more discovery-driven. If your heatmap tool allows traffic source filtering (Lucky Orange does this natively; Hotjar allows segment filtering on paid plans), you can see whether paid traffic engages more with the CTA, whether organic visitors scroll further before converting, whether social traffic bounces quickly.

    This connection between heatmap behavior and traffic source closes a loop: you know from attribution data which channels drive leads (from a tool like Sales Provenance or GA4), and you know from heatmaps how visitors from each channel behave on your pages. If paid traffic drives leads but has poor scroll depth, you may be paying for traffic that bounces before seeing your offer — a page design problem, not an ad targeting problem. Attribution data tells you the what; heatmaps tell you the why.

    If you want help adding proper lead source tracking to your WordPress site alongside your heatmap data, Sales Provenance is built for this.

  • Typeform WordPress: How to Embed, Connect to Your CRM, and Track Lead Source

    Typeform is a form builder known for its conversational, one-question-at-a-time interface. Where standard HTML forms present all fields at once, Typeform presents questions sequentially — which typically produces higher completion rates for longer forms, surveys, and quiz-style lead qualification flows.

    If you run a WordPress site and want to embed Typeform forms, connect submissions to your CRM or email platform, and track which marketing channel brought in each respondent, this guide covers all three.

    Embedding Typeform in WordPress

    Typeform provides a few embed methods, all of which work in WordPress:

    Standard Embed (Inline or Popup)

    From your Typeform dashboard, go to Share > Embed > Get the code. Typeform generates an embed code snippet. In WordPress, you paste this snippet into a Custom HTML block (in Gutenberg) or into a “Text” widget/HTML module in whatever page builder you use (Elementor, Divi, Beaver Builder).

    Options: Standard (inline, takes up space on the page), Popup (opens in a centered modal on button click), Slider (slides in from the side), Popover (small button in corner). Each has its own embed code from the Typeform share panel.

    Typeform Block for Gutenberg

    Typeform maintains an official WordPress plugin that adds a Gutenberg block. Install “Typeform Block” from the WordPress plugin directory, and you’ll have a block that lets you paste your Typeform URL and choose embed style (standard, popup, slider) without touching HTML. This is the cleanest option if you’re using the Gutenberg editor.

    URL Redirect

    For some use cases (like linking to a form from a button without embedding it on the page), simply linking to the Typeform URL directly works. Typeform’s hosted forms are mobile-responsive and load on their own domain. You lose the branded URL and site experience, but it’s the fastest implementation.

    Connecting Typeform Submissions to Your CRM and Email Platform

    Typeform’s integrations ecosystem is extensive. From your Typeform dashboard under Connect > Integrations, you can find native connections to:

    • HubSpot — creates or updates contacts from each Typeform submission
    • Mailchimp — adds subscribers with tags based on Typeform answers
    • ActiveCampaign — creates contacts and can trigger automations
    • Salesforce — creates leads
    • Google Sheets — appends each submission as a new row
    • Slack — posts submission notifications to a channel
    • Notion — creates database entries from submissions

    For platforms not natively supported, Typeform connects to Zapier, Make (formerly Integromat), and n8n — all of which can route submissions to thousands of additional tools.

    Setup for a native integration:

    1. In your Typeform form, go to Connect > Add an integration.
    2. Authenticate with the destination platform (HubSpot, Mailchimp, etc.).
    3. Map each Typeform question to the corresponding field in the destination (email -> email, first name -> first name, etc.).
    4. Test with a submission to verify the mapping works.

    The mapping step is where attention matters: Typeform’s field names are your question text, while your CRM expects specific property names. Take care to map the email field correctly — a mismatch means contacts are created without email addresses, which makes them functionally useless.

    Using Typeform as a Lead Qualification Tool

    Typeform’s conversational interface makes it particularly effective for lead qualification flows where you want to ask multiple questions and route leads based on their answers. A simple contact form asks name and email; a Typeform flow can also ask budget, timeline, company size, specific needs, and their biggest challenge — all in a way that feels less like a form and more like a conversation.

    Typeform’s Logic Jumps feature routes respondents to different questions based on previous answers. A service business might use this to qualify leads: if budget is under a threshold, the form routes to a different CTA than if budget is above it. This pre-qualification means sales conversations start with better context about the lead.

    With native CRM integration, you can map qualification answer fields to CRM lead properties, so your sales team sees budget, timeline, and use case data before making contact — without any manual data entry.

    Tracking Lead Source for Typeform Submissions

    Here’s the attribution gap that most Typeform + WordPress setups don’t close: when a submission arrives in your CRM, you know who submitted, what they said, and what email to contact — but not what marketing channel brought them to your WordPress site in the first place.

    Someone who clicked a Facebook ad, landed on your WordPress page, and filled out your Typeform leaves no automatic trace of that path. The CRM contact looks the same as a contact who found you through organic search or an email campaign.

    The solution is to capture UTM parameters on your WordPress site and pass them into the Typeform submission as hidden fields.

    Hidden Fields in Typeform

    Typeform supports hidden fields — values that are passed to the form via URL parameters but not shown to the respondent. You set them up in Typeform under your form settings > Variables > Hidden fields. For UTM tracking, you’d add hidden fields: utm_source, utm_medium, utm_campaign, utm_content, utm_term.

    Once the hidden fields exist in Typeform, you populate them by appending parameters to the Typeform embed URL when the form is loaded. The embed URL accepts these as query parameters, and Typeform passes them as hidden field values on submit.

    The full implementation requires JavaScript on your WordPress page that:

    1. Reads UTM parameters from the current URL (or from session/cookie storage, to capture the first-touch source even if the visitor is on a different page from when they arrived).
    2. Modifies the embedded Typeform URL (or calls Typeform’s tf.load() function with the params) to include those UTM values as hidden field parameters.

    Once implemented, every Typeform submission includes the UTM parameters from the WordPress session. These flow through your native integration (or Zapier) to your CRM as contact properties. Your CRM now shows lead source alongside every Typeform-generated contact.

    Using a First-Party Attribution Tool

    If maintaining custom JavaScript for UTM capture and Typeform hidden field population sounds like ongoing maintenance overhead, dedicated attribution tools like Sales Provenance handle this automatically for WordPress. The tool captures UTM parameters on the visitor’s first session, persists them across pages and sessions, and populates the hidden fields in embedded forms (including Typeform) when a conversion happens.

    The advantage of first-party attribution over session-scoped UTM capture: it handles cases where the visitor’s original source was from a previous session. A lead who clicked a Google ad last week, came back directly today, and submitted your Typeform carries their original Google ad source through to the CRM — not “direct” (which is what session-level capture would record).

    Typeform vs. Native WordPress Forms for Lead Capture

    Should you use Typeform or a WordPress-native form plugin? Both have legitimate use cases:

    Use Typeform when: The form is long or involves qualification logic (multiple questions, conditional routing). The conversational format will improve completion rates. You want the visual polish of Typeform’s design system without styling a native form to match. You’re building a quiz or survey, not just a contact form.

    Use a native WordPress form plugin (Gravity Forms, WPForms) when: The form is short (3-5 fields) and inline. You need the form to match your site’s design exactly. You want all submissions stored in your WordPress database as a backup. You need complex server-side logic (conditional fields based on other WordPress data, file uploads, payment integration via WooCommerce).

    Many sites use both: native forms for quick contact forms and newsletter sign-ups, Typeform for longer qualification or survey flows. Attribution tracking should be implemented on both for consistent lead source data.

    If you want help connecting Typeform to your WordPress site with full lead source attribution included, Sales Provenance is built for this integration.

  • Zapier WordPress: How to Connect Forms, WooCommerce, and Lead Source Tracking

    Zapier is an automation platform that connects the apps in your marketing and operations stack without requiring custom code. In the WordPress context, it serves as the connector between your website (where leads, form submissions, and user actions happen) and everything downstream: your CRM, email platform, Slack, Google Sheets, project management tools, and more.

    This post covers the practical ways to integrate WordPress and Zapier — what triggers are available, how to connect your WordPress data to the tools that need it, and where attribution fits in the picture.

    How WordPress and Zapier Connect

    Zapier connects to WordPress through two main paths:

    The Official WordPress Plugin

    Zapier’s official WordPress app (available at zapier.com, under Apps > WordPress) connects to your WordPress site via the WordPress.com REST API — but importantly, this works for self-hosted WordPress.org sites through the Jetpack plugin, which bridges the two. If you have Jetpack installed, Zapier can trigger on new posts, new comments, and a few other core WordPress events.

    Limitations of the native Zapier WordPress connection: it’s primarily built around post publishing events (useful for content automation) rather than form submissions, lead capture, or WooCommerce events. For most marketing automation use cases, you’ll use a different path.

    Form Plugins With Direct Zapier Integration

    This is where Zapier becomes powerful for WordPress marketing. Most major WordPress form plugins have built-in Zapier integrations that trigger on new form submissions:

    • Gravity Forms — Gravity Forms’ Zapier add-on (part of the developer license) triggers on any form submission and passes all form field data to Zapier. This is the most flexible option for complex forms.
    • WPForms — WPForms Elite includes a Zapier integration that triggers on form submission and passes field data. Works with any WPForms form type.
    • Elementor Forms — Elementor’s form widget includes a Zapier action that fires on submission.
    • Contact Form 7 — CF7 does not have a native Zapier integration, but the CF7-to-Zapier plugin adds one. For CF7 users, this is the most common connection method.
    • Formidable Forms — includes a Zapier integration in its Business plan.

    When a form submits in WordPress, Zapier receives the submission data (all the fields the user filled in) and can pass it to any app in Zapier’s catalog.

    WooCommerce via Zapier

    WooCommerce has multiple Zapier integrations. The most reliable is through Uncanny Automator (a WordPress plugin that provides triggers for WooCommerce events and pushes them to Zapier) or through the WooCommerce Zapier official plugin. Events available include: new order placed, order status changed, new customer, product purchased, subscription created, and more.

    With WooCommerce connected to Zapier, you can pass order data to any downstream app: create a row in Google Sheets for every order, add the customer to a CRM, send a Slack notification to your team for high-value orders, or trigger a post-purchase email sequence in a platform not natively integrated with WooCommerce.

    High-Value WordPress-to-Zapier Automations

    Form Submission to CRM

    The most common WordPress + Zapier automation: a form submission on your WordPress site creates a new lead or contact in your CRM. This applies to contact forms, quote requests, demo requests, consultation bookings, and any other form where you want the data in your CRM immediately without manual entry.

    Trigger: New form submission in Gravity Forms (or WPForms, Elementor Forms, etc.)
    Action: Create contact in HubSpot / Pipedrive / Zoho CRM / Salesforce / whatever CRM you use

    For this zap to be truly useful, the form should capture the fields your CRM needs: first name, last name, email, phone, and any relevant qualification fields (budget, company size, project type). Fields that go through Zapier are mapped one-to-one to CRM properties.

    Form Submission to Email Marketing Platform

    Form submitters who opt in to email marketing should be added to your email platform’s list immediately. While most major email platforms (Mailchimp, ActiveCampaign, Klaviyo, etc.) have native WordPress plugins, Zapier is often more flexible — you can pass any field, tag the subscriber based on which form they submitted, and trigger different list additions or automations based on the form’s source.

    Trigger: New form submission in WPForms
    Action: Add subscriber to ActiveCampaign with tag = “Lead Magnet A”

    Lead Notification to Slack

    For teams that need to respond to leads quickly, a Zapier zap that posts a message to a Slack channel for every new form submission means your team sees new leads the moment they come in — without logging into your CRM or email platform to check.

    Trigger: New form submission
    Action: Send message to #leads Slack channel with the submitter’s name, email, and the message they sent

    New WooCommerce Order to Google Sheets

    For stores that want order data in a spreadsheet for analysis, reporting, or sharing with a team that doesn’t have WooCommerce access, a zap that appends a new row to Google Sheets for every order keeps your data in a format anyone can work with.

    New Blog Post Published to Social or Email

    Zapier’s WordPress trigger for “new post published” can automatically post to social platforms or trigger an email notification to subscribers when new content goes live. This works through the Jetpack connection and is a lightweight alternative to dedicated social scheduling tools for teams that publish infrequently.

    Where Attribution Gets Complicated With Zapier

    Here’s the attribution gap that Zapier doesn’t solve on its own: Zapier passes the form submission data to your CRM, but it doesn’t pass the lead source (what marketing channel brought that person to your site) unless you explicitly capture it and include it in the form submission.

    A lead arrives at your WordPress site from a Google ad, fills out your contact form, and the Zapier zap creates a contact in your CRM. The CRM contact has their name, email, and message — but not the fact that they came from a Google ad. When you look at your CRM, all leads look the same regardless of whether they came from organic search, paid ads, email campaigns, or referrals.

    The fix: capture lead source on WordPress and include it in the form submission data before Zapier picks it up.

    Hidden Fields for UTM Pass-Through

    The standard approach: add hidden fields to your WordPress forms that capture UTM parameters from the visitor’s session. When the form is submitted, these hidden fields are included in the submission data that Zapier receives and passes to your CRM.

    Implementation requires two pieces:

    1. JavaScript that captures UTM parameters on page load and stores them (in session storage or a cookie).
    2. A mechanism to populate the hidden form fields from that stored data before the form submits. Many form plugins (Gravity Forms, WPForms) support dynamic field population from query string parameters; others require a JavaScript snippet that fills the hidden fields from stored values.

    Once implemented, every form submission includes utm_source, utm_medium, utm_campaign, and any other UTM fields you captured. Zapier passes these to your CRM as contact properties, and your CRM gains lead source data for every contact.

    First-Party Attribution Tools

    A more robust approach is to use a dedicated first-party attribution tool like Sales Provenance that handles the UTM capture, session persistence, and form field population automatically — without requiring you to build and maintain the custom JavaScript implementation. The tool also handles the case where a visitor’s original source (from a different session or after clicking through multiple pages) needs to be tied to their eventual conversion, rather than just capturing whatever UTM is in the URL at the moment of form submit.

    The Zapier integration continues to work as the transport layer (form submission to CRM), while the attribution tool ensures the lead source data is accurate and complete in the form fields that Zapier picks up.

    Zapier vs. Native Integrations for WordPress

    Many WordPress plugins have native integrations with major tools (Gravity Forms connects directly to HubSpot, WPForms connects to Mailchimp, WooCommerce connects to Klaviyo) without needing Zapier in the middle. When should you use Zapier instead of a native integration?

    • When no native integration exists for the specific tool combination you need. Zapier’s catalog covers thousands of apps; if your CRM or email platform isn’t natively supported by your form plugin, Zapier bridges the gap.
    • When you need logic and filtering — Zapier’s “Paths” feature lets you route different form submissions to different destinations based on field values. If a form has a “budget” field and you want small-budget leads to go to one CRM pipeline and large-budget leads to another, Zapier handles that routing where native integrations typically don’t.
    • When you need to trigger multiple actions from one event — a single form submission can trigger a CRM contact creation, a Slack notification, and a Google Sheets row append simultaneously through one Zapier zap (or multi-step zap).
    • When you need a lightweight solution without plugin overhead — adding yet another plugin for each native integration versus one Zapier connection that handles multiple destinations.

    For most WordPress marketing stacks, Zapier and native integrations coexist: native for the most critical paths (form-to-CRM, WooCommerce-to-email) where reliability is paramount, Zapier for secondary routing, notification, and edge cases.

    If you want help setting up WordPress-to-Zapier automation with proper lead source attribution included from the start, Sales Provenance is built for this.

  • Omnisend WordPress: How to Connect, Set Up WooCommerce Automations, and Track Lead Source

    Omnisend is an email and SMS marketing platform built primarily for ecommerce — it connects to Shopify and WooCommerce, fires automated messages based on purchase behavior, and handles cart abandonment sequences, post-purchase flows, and promotional campaigns in one place.

    If your business runs on WordPress with WooCommerce, connecting Omnisend is straightforward and unlocks significant automation capability. But there’s a gap that most integrations don’t address: knowing which marketing brought in the subscriber or customer in the first place.

    This post covers how to connect Omnisend to WordPress, how the WooCommerce integration works, and how to add lead source tracking so you know which channels are driving the subscribers — and customers — that Omnisend then engages.

    Connecting Omnisend to WordPress and WooCommerce

    Omnisend maintains an official WooCommerce plugin that handles the core integration. Installation is straightforward:

    1. Install and activate the Omnisend Email Marketing & SMS plugin from the WordPress plugin repository (search “Omnisend” in Plugins > Add New).
    2. Connect the plugin to your Omnisend account using your API key (found in Omnisend under Account > API Keys).
    3. The plugin automatically syncs your existing WooCommerce customers and contact data to Omnisend.
    4. Going forward, new customers and subscribers are synced in real time.

    Once connected, Omnisend receives:

    • New contact/subscriber events from WordPress opt-in forms connected to Omnisend
    • WooCommerce order events (placed order, fulfilled, refunded, cancelled)
    • Cart abandonment events (Omnisend’s tracking script detects abandoned carts)
    • Product browse and category view events (for browse abandonment automations)

    This event stream is what powers Omnisend’s automations. The plugin fires these events automatically once connected — you don’t need to write custom code for the standard WooCommerce events.

    Omnisend Sign-Up Forms on WordPress

    Omnisend includes a form builder for creating opt-in forms (popups, embedded forms, landing pages) that capture subscribers directly into your Omnisend audience. These forms are separate from your WordPress theme or any page builder you use, and they sync subscribers to Omnisend automatically.

    If you prefer to use a WordPress-native form solution (Gravity Forms, WPForms, Elementor forms, Contact Form 7), you can connect those to Omnisend through Zapier or a direct integration plugin. Zapier’s WordPress trigger (new form submission) can pass the subscriber’s email and any custom fields directly to Omnisend as a new contact.

    The advantage of Omnisend’s native forms: built-in exit-intent detection, scroll-based triggers, and display rules. The advantage of WordPress-native forms: they blend into your theme and allow full design control. Both approaches work; the choice depends on how much you want the form experience to match your site design.

    Core Automations to Set Up First

    With the WooCommerce connection live, the highest-ROI automations to configure immediately:

    Welcome Series

    Triggered when a new subscriber opts in (not necessarily after a purchase). A 2-3 email welcome series introduces your brand, establishes what subscribers can expect from your emails, and typically includes a first-purchase discount to convert subscribers who haven’t yet bought. Welcome series consistently show the highest open and click rates of any email type.

    Abandoned Cart Recovery

    Triggered when a known contact (subscriber or previous customer) adds items to the WooCommerce cart but doesn’t complete checkout. A sequence of 2-3 emails — immediate reminder, 24-hour follow-up with social proof, final follow-up with an incentive — recovers a meaningful percentage of carts that would otherwise be lost. Omnisend tracks WooCommerce cart state automatically once the plugin is installed; no additional configuration is needed beyond building the automation.

    Post-Purchase Sequence

    Triggered by a completed WooCommerce order. Common structure: immediate order confirmation (transactional), shipment notification (if applicable), product review request 7-14 days after delivery, and a repeat purchase prompt 30+ days later offering a complementary product or replenishment reminder. Post-purchase sequences build customer lifetime value by keeping buyers engaged after the initial purchase.

    Win-Back for Lapsed Customers

    Triggered when a customer has not purchased in a defined window (typically 90-180 days). A 2-part sequence: a re-engagement offer, followed by a final “we’ll miss you” with a stronger incentive. Customers who respond to win-back campaigns have already demonstrated purchase intent — they’re lower cost to convert than cold prospects.

    The Attribution Gap: Knowing What Brought Your Subscribers In

    Omnisend tells you what happens after someone is in your list: how they engage with emails, whether they click through to purchase, what their lifetime value looks like. What Omnisend does not tell you natively is what marketing channel brought that subscriber to your WordPress site in the first place.

    This matters because your marketing mix produces subscribers with very different characteristics. A subscriber who came in through a Facebook ad might be highly engaged with your email but have a lower purchase rate than a subscriber who found you through organic blog content. A subscriber from a paid influencer campaign might have a high first-purchase conversion but low repeat purchase rate. Without lead source data tied to each subscriber, you can’t see these patterns.

    The standard approach for adding lead source to Omnisend subscribers:

    Pass UTM Data to Omnisend as Custom Fields

    When a subscriber opts in through an Omnisend form, you can capture any data that’s in their browser session at the time of opt-in — including UTM parameters stored in session storage or a cookie. Omnisend’s form builder allows custom hidden fields; you can pass UTM values (source, medium, campaign) into those fields at form submit time via JavaScript.

    Once those values are passed as custom fields on the contact record, Omnisend stores them permanently. You can then segment your subscriber list by lead source — filtering contacts where “utm_source = facebook” to see how Facebook-acquired subscribers engage and convert compared to email or organic segments.

    Use a First-Party Attribution Tool

    A cleaner approach is to use a dedicated attribution tool like Sales Provenance that captures lead source on the visitor’s first WordPress session and writes it to every subsequent conversion event — including WooCommerce orders. When a subscriber later purchases, the order in WooCommerce carries the original lead source as order metadata. You can then cross-reference order data with Omnisend’s revenue data to see which acquisition channels are generating the highest-value customers.

    The advantage over form-level UTM capture: it persists across sessions. A visitor who arrived from a Google ad, subscribed two weeks later via a direct visit, and purchased a month after that — the Google ad source is captured at the WooCommerce order level even though the subscription event happened later via direct traffic. This is the difference between session-level attribution (what brought them in for this visit) and customer-level attribution (what originally brought them in at all).

    Omnisend and SMS in WooCommerce

    Omnisend includes SMS alongside email — one of the reasons ecommerce brands prefer it over pure-email tools. The WooCommerce integration supports SMS in automations: cart abandonment SMS (often higher open rates than email abandonment), order confirmation SMS, shipping notification SMS.

    To use SMS in Omnisend, you need to collect phone numbers from subscribers. Omnisend’s opt-in forms support phone number fields with SMS consent language. The same form that captures an email can capture a phone number with an optional SMS consent checkbox — subscribers who provide both become reachable via both channels, which Omnisend can use in split-channel automations (send email first, SMS if no click).

    SMS rates for WooCommerce merchants vary by country (US, Canada, UK, Australia all have specific regulations around commercial SMS). Omnisend handles the compliance layer if you’re sending domestically; always check TCPA requirements for US SMS marketing if you’re targeting US subscribers.

    Omnisend Pricing Relative to Alternatives

    Omnisend’s pricing scales with contact list size. At the time of writing, plans start with a free tier (500 emails/month, 60 SMS credits) and scale to paid tiers based on contact count and channel usage. For WooCommerce stores with smaller lists, Omnisend is competitive with Klaviyo and often less expensive at the same contact tier — one reason it’s a common recommendation for growing ecommerce brands that don’t yet have the contact volume that justifies Klaviyo’s premium.

    The comparison worth making: Omnisend vs. Klaviyo vs. Mailchimp for a WooCommerce store. Omnisend and Klaviyo are built natively for ecommerce with deep purchase-event awareness; Mailchimp is general-purpose with WooCommerce integration added on. If ecommerce automation (cart abandonment, post-purchase flows, browse abandonment) is the priority, Omnisend or Klaviyo will be better fits than Mailchimp.

    Getting Started With Omnisend on WordPress

    The practical setup sequence:

    1. Install the official Omnisend WooCommerce plugin and connect it to your Omnisend account.
    2. Verify the sync by checking that existing WooCommerce customers appear as contacts in Omnisend.
    3. Set up your opt-in form (Omnisend native or WordPress-native via Zapier) and test a subscription to confirm the contact appears in Omnisend.
    4. Build and activate the welcome series, abandoned cart, and post-purchase automations.
    5. Add UTM capture to Omnisend form submissions (custom hidden fields) or implement a first-party attribution tool at the WooCommerce level.
    6. Monitor campaign performance and automation revenue in Omnisend’s reports; cross-reference with GA4 for channel-level attribution.

    If you want help connecting Omnisend to your WordPress store in a way that includes full lead source attribution — so you know not just what emails are converting but what originally brought each subscriber in — Sales Provenance is built for this integration.

  • WooCommerce Attribution: How to Track Which Marketing Drives Your Sales

    WooCommerce is the most widely used ecommerce platform built on WordPress — which means millions of businesses are running a store and a content site on the same installation, sharing the same domain, and theoretically in a good position to connect their marketing to their sales data.

    In practice, most WooCommerce store owners know their revenue. What they don’t know is which marketing channel produced it. A customer who came in through a Google search, received an email, and eventually bought through a paid Facebook ad — which channel gets credit? How do you know what’s actually working?

    This is the WooCommerce attribution problem. It’s solvable, and because WooCommerce runs on WordPress, you have more options for solving it than most ecommerce platforms give you. Here’s how.

    What WooCommerce Tracks By Default

    Out of the box, WooCommerce records order details: the products purchased, amounts, customer information, and the order status. What WooCommerce’s native reporting does not tell you is where that customer came from before they purchased.

    WooCommerce has no built-in lead source capture. It records the transaction, not the acquisition channel. To answer “which marketing produced this sale,” you need to add something on top of the core WooCommerce installation.

    Google Analytics 4: The Baseline Attribution Layer

    GA4 is the starting point for most WooCommerce attribution setups. Properly configured, GA4 can track:

    • Which channel (organic search, paid search, email, social, direct) each session originated from
    • Which sessions resulted in a purchase (through the purchase event)
    • Revenue by channel using ecommerce tracking
    • Multi-touch paths to purchase (which channels a customer interacted with before converting)

    To implement GA4 ecommerce tracking in WooCommerce, you need a plugin that connects WooCommerce’s purchase events to GA4’s ecommerce schema. The most reliable options are the official Google Site Kit plugin or dedicated plugins like WooCommerce Google Analytics Integration or Duracelltomi Google Tag Manager for WordPress (which pushes WooCommerce events to a GA4 stream via GTM).

    Once configured, you can see revenue broken down by source and medium in GA4’s Acquisition reports — organic search, paid search, email, social, direct. This is real attribution data tied to actual purchase events, not just session counts.

    UTM Tracking: The Manual but Reliable Method

    For marketing channels you control — email campaigns, paid ads, social posts, affiliate links — UTM parameters are how you tell GA4 (and anything else listening) exactly where traffic is coming from.

    UTMs are query string parameters added to URLs: utm_source, utm_medium, utm_campaign, utm_content, utm_term. When a visitor arrives at your WooCommerce store from a link with these parameters, GA4 reads them and records the session with that source.

    The discipline is tagging every link you place anywhere: every email link, every paid ad destination URL, every link in a social post. Untagged links show up as direct traffic in GA4 and pollute your attribution data. A simple UTM builder spreadsheet or a tool like Google’s own UTM builder makes this manageable.

    For email campaigns in particular, every link in every email should carry UTM tags. An email-driven customer who arrives untagged looks like direct traffic in your attribution report.

    Storing Lead Source in WooCommerce Order Metadata

    GA4 is a reporting tool, not a CRM. It can tell you that organic search drove X in revenue over 30 days, but it cannot tell you that a specific order — order #4857 — came from organic search. For that customer-level attribution, you need to capture the lead source and attach it directly to the WooCommerce order record.

    Here’s how this works in practice: when a visitor arrives at your site, you capture their UTM parameters (and the referrer for non-UTM-tagged sessions) and store them in a cookie or session variable. When they complete a WooCommerce purchase, you write that source data to the order as custom order metadata.

    Plugins that do this automatically include:

    • WooCommerce UTM Tracker — a straightforward plugin that captures UTMs on arrival and saves them to each order.
    • Conversios — a GA4 + WooCommerce integration that handles ecommerce tracking and can include UTM data in order records.
    • Sales Provenance — captures lead source on first touch, persists it across sessions, and writes it to each WooCommerce order so you can filter your order reports by the original channel that brought in the customer.

    With order-level lead source data, you can export your WooCommerce orders and filter by source: how much revenue came from Google Ads, how much from email, how much from Instagram, how much from organic blog traffic. This is real, customer-level attribution that belongs to you — not aggregate reporting in a third-party platform.

    Multi-Touch Attribution in WooCommerce

    Most WooCommerce attribution setups capture the last touch before purchase (what channel sent the final session that converted) or the first touch (what originally brought the customer in). Both have their uses and their limits.

    First-touch attribution credits the channel that brought the customer in originally. If a customer first found you through an organic blog post, organic search gets credit even if they later bought through a retargeted ad. First-touch is good for understanding what channels are generating new customer relationships.

    Last-touch attribution credits whatever channel drove the final session before purchase. If a repeat visitor to your store makes a purchase after seeing a Google Shopping ad, the ad gets credit even if organic search originally brought them in. Last-touch is good for understanding what’s closing purchases.

    Multi-touch attribution distributes credit across all channels in the path to purchase — linear (equal credit to each), time-decay (more credit to recent touches), or data-driven (based on statistical modeling of actual conversion paths). GA4’s multi-touch path reports show you which combination of channels is working together to produce conversions, rather than giving all credit to one touchpoint.

    For most WooCommerce stores, starting with first-touch capture stored in order metadata is the right first step. It gives you clean data on what’s generating customers without requiring a complex multi-touch implementation.

    Connecting WooCommerce to Your CRM

    If you use a CRM (HubSpot, ActiveCampaign, Klaviyo, Drip, Mailchimp with e-commerce features), integrating WooCommerce data with your CRM adds another layer of attribution insight: you can see the full customer lifecycle from first marketing touch through purchase history, lifetime value, and marketing channel.

    WooCommerce integrates natively with most major CRMs through their official plugins. Once connected, purchase events create or update contacts in your CRM with the purchase data. If your CRM is also capturing lead source from web forms and opt-ins, you now have a single customer record that shows both how they came in and what they’ve bought.

    This is where the attribution picture becomes genuinely useful: you can segment customers by their acquisition channel and compare lifetime value across segments. Customers who came in through organic blog content have a different LTV than customers from paid social. Customers from email referrals convert to repeat buyers at a different rate than customers from direct traffic. These patterns inform where you should invest marketing budget going forward.

    Google Ads and Meta Conversion Tracking for WooCommerce

    If you run paid ads sending traffic to your WooCommerce store, both Google Ads and Meta require pixel/conversion tag implementation to report back which ad clicks resulted in purchases.

    Google Ads conversion tracking in WooCommerce is most reliably implemented through Google Tag Manager — a GTM container fires a purchase conversion event with order value when WooCommerce’s thank-you page loads. This data feeds back into Google Ads to show you cost per conversion and revenue by campaign. Without this, Google Ads has no visibility into which clicks actually converted to sales.

    Meta Pixel and Conversions API similarly need to receive purchase events from WooCommerce. The PixelYourSite plugin and WooCommerce’s own Meta integration handle pixel events; the Conversions API (server-side) adds resilience against browser-based ad blockers and iOS tracking restrictions. Using both (browser pixel plus server-side CAPI) is the current standard for accurate Meta attribution.

    A Practical WooCommerce Attribution Stack

    For most WooCommerce stores, the practical attribution stack looks like this:

    1. GA4 with ecommerce tracking — revenue by channel, funnel analysis, multi-touch paths. Baseline for all reporting.
    2. UTM parameters on every controlled link — email, ads, social. Discipline to tag everything outbound so your data isn’t polluted by untagged sessions looking like direct traffic.
    3. Lead source capture stored in WooCommerce order metadata — customer-level attribution that you own and can query from your own database, not just aggregate reports in GA4.
    4. Google Ads and Meta conversion tracking — so paid channels can optimize toward actual purchases rather than just clicks.
    5. CRM integration — to close the loop between acquisition channel, contact record, and lifetime value.

    The goal is not a perfect attribution model — no such thing exists. The goal is enough signal to make better budget decisions: knowing that your blog content generates customers with higher lifetime value than your paid social campaigns is actionable, even if you can’t attribute every dollar to a precise channel.

    If you want help setting up WooCommerce attribution that stores lead source at the order level and gives you clean, queryable data on what’s driving revenue, Sales Provenance is built for this.

  • Shopify and WordPress: How to Run Both and Track Every Sale Back to Its Source

    A lot of businesses end up running both Shopify and WordPress at the same time — not because it’s the obvious choice, but because each platform is genuinely better at something the other isn’t.

    WordPress dominates for content, SEO, and lead generation. Shopify dominates for ecommerce: checkout reliability, payment processing, inventory, shipping integrations. Businesses that want both a high-performing content engine and a polished online store often find they need both.

    The problem that doesn’t get addressed clearly is attribution: when someone reads a WordPress blog post, subscribes to an email list, and eventually buys in Shopify, how do you know which content actually drove that sale?

    This post covers how to set up and connect WordPress and Shopify, and then — the part most guides skip — how to track lead source attribution across both platforms so you know what marketing is actually working.

    Why Businesses Run WordPress and Shopify Together

    Shopify is purpose-built for ecommerce. Its checkout, payment processing, inventory management, and shipping integrations are best-in-class. Shopify Payments handles 3D Secure, fraud protection, and international currencies without custom development. Setting up a store with 50 SKUs takes hours, not weeks.

    But Shopify is mediocre at content. Its blogging tools are basic. Its URL structure is rigid. The SEO flexibility that WordPress gives you through plugins like Yoast or Rank Math simply doesn’t exist in the same form in Shopify. Brands that need a robust content strategy — blog posts, landing pages, guides, lead magnets — quickly run into Shopify’s ceiling.

    WordPress is the opposite. It’s exceptional at content architecture, SEO optimization, lead capture, and CMS flexibility. WooCommerce can make it work as an ecommerce platform, but WooCommerce is meaningfully more complex to run and maintain than Shopify, especially for stores with significant transaction volume.

    The practical solution many businesses land on: WordPress for the content site (blog, SEO landing pages, lead capture) and Shopify for the store. The WordPress site drives organic traffic and captures leads. Shopify handles the actual transactions.

    Integration Options: How to Connect WordPress and Shopify

    There are several ways to structure the relationship between the two platforms, depending on how much overlap you want.

    Separate Domains, Cross-Linked

    The simplest setup: your WordPress site lives at yourdomain.com and your Shopify store lives at store.yourdomain.com (or shop.yourdomain.com, or a subdomain of your choice). You link between them, but they’re distinct environments with separate logins, analytics, and tracking.

    This works fine operationally but creates an attribution gap: customers who arrive via WordPress and convert in Shopify cross a domain boundary that breaks standard cookie-based tracking.

    WordPress With a Shopify Buy Button Embed

    Shopify’s Buy Button feature lets you generate embeddable product cards or cart widgets that you paste into WordPress pages. The customer browses on WordPress but the checkout is served by Shopify. This keeps customers on a single domain for browsing while still using Shopify’s checkout infrastructure.

    The Shopify Buy Button is straightforward for simple product setups but has limits: it’s best for single products or small collections, not a full browseable catalog. If you need customers to shop across many products, the Buy Button approach gets clunky.

    WordPress as the Front-End, Shopify as Headless

    A more sophisticated setup: use Shopify’s Storefront API in headless mode, with WordPress serving the front-end experience. Shopify handles inventory, payments, and order management in the background while WordPress controls what the customer sees. This gives you full WordPress content flexibility with full Shopify commerce infrastructure.

    Headless commerce is a real technical investment — it requires a developer to build and maintain the integration. For most small and mid-size businesses, the Buy Button approach or separate-domain setup is the practical choice. Headless is worth the investment when you need both at scale.

    The Attribution Gap Between WordPress and Shopify

    Here’s where things get messy for businesses running both platforms separately.

    When a visitor arrives at your WordPress site from a Google ad, organic search, or email campaign, their source is captured in the URL as UTM parameters. WordPress can read those parameters and, if you have the right tracking in place, store them against that visitor’s cookie. If they convert via a contact form or lead magnet on WordPress, you have their lead source.

    But if they leave WordPress and complete a purchase in Shopify, a few things can happen:

    • The cookie with their WordPress lead source doesn’t transfer to the Shopify domain (cookies are domain-scoped).
    • The UTM parameters in their original WordPress URL aren’t automatically passed along to Shopify.
    • Shopify’s own analytics records the sale but attributes it to direct traffic or to whichever channel last touched the customer on the Shopify domain — not the original WordPress referral.

    The result: you spend money driving traffic to your WordPress content, some of that traffic converts to Shopify sales, but you can’t connect the sale back to what drove it. You’re running content marketing and paid ads on WordPress with no way to measure their contribution to Shopify revenue.

    How to Track Lead Source Across WordPress and Shopify

    Option 1: UTM Pass-Through via URL Parameters

    The simplest cross-domain attribution method: capture UTM parameters when a visitor lands on WordPress, and append them to any links that go to your Shopify store.

    The implementation requires two pieces:

    Step 1: Capture UTMs on WordPress. Add a small JavaScript snippet (or use a plugin like Attributer, Marketing Attribution by Leadsbridge, or a similar tool) that reads UTM parameters from the URL on page load and stores them in sessionStorage or a cookie.

    Step 2: Append UTMs to Shopify links. Another snippet rewrites any link on your WordPress pages that points to your Shopify store, appending the stored UTM values as query parameters to those links. When a visitor clicks to the store, they arrive with the same UTM parameters they came in on, and Shopify’s analytics records the correct source.

    // Capture UTMs from current URL
    const urlParams = new URLSearchParams(window.location.search);
    const utmKeys = ['utm_source','utm_medium','utm_campaign','utm_content','utm_term'];
    const utms = {};
    utmKeys.forEach(k => { if (urlParams.get(k)) utms[k] = urlParams.get(k); });
    if (Object.keys(utms).length) sessionStorage.setItem('wp_utms', JSON.stringify(utms));
    
    // On page load, rewrite Shopify store links to include stored UTMs
    const stored = sessionStorage.getItem('wp_utms');
    if (stored) {
      const params = JSON.parse(stored);
      document.querySelectorAll('a[href*="yourstore.myshopify.com"], a[href*="store.yourdomain.com"]').forEach(link => {
        const url = new URL(link.href);
        Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));
        link.href = url.toString();
      });
    }
    

    This gives Shopify’s analytics (and any Google Analytics 4 property connected to Shopify) the UTM data needed to attribute the sale back to the original WordPress traffic source.

    Option 2: First-Party Attribution Tools That Span Both Platforms

    Tools like Sales Provenance are designed specifically for this cross-platform attribution problem. When a visitor arrives at your WordPress site, the tool captures their lead source (UTM, referrer, channel). If that same visitor later converts in Shopify, the attribution data is connected at the customer level — not just the session level — so you have accurate first-party source data regardless of when or where the conversion happened.

    This is more robust than session-level UTM pass-through for a few reasons:

    • It handles multi-session journeys (someone visits from an ad, comes back organically a week later, then buys).
    • It doesn’t break if the visitor’s browser blocks third-party cookies or limits session storage.
    • It connects lead source data to actual customer records, so you can see not just “this sale came from organic search” but “this customer from organic search spent $X and has been a customer for Y months.”

    Option 3: GA4 Cross-Domain Tracking

    If you have Google Analytics 4 on both WordPress and Shopify (Shopify has a GA4 integration through Google & YouTube channel), you can configure GA4 cross-domain tracking to follow users across both domains within the same session.

    GA4 cross-domain tracking works by adding a linker parameter to URLs when a user clicks from one domain to another. It stitches sessions together so that a user who arrives on WordPress and clicks to Shopify is tracked as one continuous session with the original source preserved.

    To configure this in GA4: go to Admin > Data Streams > Configure Tag Settings > Configure your domains. Add both your WordPress domain and your Shopify store domain. GA4 will automatically handle the cross-domain linker.

    GA4 cross-domain tracking solves the session continuity problem but has one limit: it only works for users who click directly from WordPress to Shopify within the same session. Users who visit WordPress, leave, and return to Shopify later via a different path won’t have their journeys connected.

    Shopify Analytics and What You Can See Natively

    Shopify’s built-in analytics tracks sessions and sales by referring source on the Shopify domain — the last touchpoint before the purchase on Shopify. If a customer arrives at Shopify directly from a Google organic search result, Shopify records that as the source. If they arrive from your Shopify product link on your WordPress site, Shopify records the referring domain (your WordPress site) as the source.

    What Shopify can’t tell you natively: what drove them to your WordPress site in the first place. That first-touch data lives on the WordPress side and has to be explicitly passed to Shopify through one of the methods above for it to appear in Shopify’s attribution reporting.

    A Practical Setup for Most Businesses

    For a business running both platforms without dedicated development resources:

    1. Run WordPress on your main domain for blog, SEO landing pages, and lead capture. Run Shopify on a subdomain (store.yourdomain.com) for the actual store.
    2. Install Google Analytics 4 on both and configure cross-domain tracking in GA4’s tag settings.
    3. Add the UTM capture-and-rewrite script (or a plugin that does it) to WordPress so links to Shopify carry original UTM data.
    4. If you need customer-level attribution that persists across sessions and connects to actual revenue, add a first-party attribution tool that integrates with both WordPress and Shopify.
    5. Connect Shopify’s Google and YouTube channel integration for GA4 purchase event tracking.

    The goal is a setup where every Shopify sale you can trace back to the original channel that brought the customer in — not just the last click before they hit the Shopify checkout. That’s what lets you make real decisions about where to spend your marketing budget.

    If you want help setting up cross-platform attribution between WordPress and Shopify, Sales Provenance is built for exactly this problem.

  • ClickFunnels and WordPress: How to Track Lead Source Through to Your Funnel

    ClickFunnels and WordPress: When Your Funnel Doesn’t Know Where Its Leads Came From

    ClickFunnels is a funnel-building platform used by course creators, coaches, consultants, and ecommerce businesses. Many ClickFunnels users also run a WordPress site — for their blog, their main brand presence, their SEO content, or their general web identity. ClickFunnels handles the funnel pages, opt-ins, and checkout; WordPress handles the rest.

    The attribution problem: someone reads your WordPress blog post, clicks to your ClickFunnels opt-in page, signs up, and goes into your funnel. The traffic source that brought them to your WordPress blog in the first place — whether that was a Google search, a Facebook ad, a podcast mention, or an email campaign — typically disappears before they ever reach the ClickFunnels page.

    You know the lead exists. You don’t know what caused them to seek you out. This guide covers how to bridge that gap by capturing UTM source data on WordPress and carrying it through to ClickFunnels contacts.

    Two Different Attribution Scenarios

    There are two common ways that WordPress and ClickFunnels connect, and the tracking setup differs for each.

    Scenario A: Traffic lands on WordPress first, then goes to ClickFunnels. A visitor finds your WordPress blog post through organic search or a paid ad, reads it, and clicks a call-to-action that links to a ClickFunnels opt-in page or landing page. The UTM parameters (or referrer data) from the original traffic source exist on the WordPress side of the journey but need to be carried through the click to the ClickFunnels page.

    Scenario B: Traffic lands directly on a ClickFunnels page. Your paid ads, email campaigns, or social posts link directly to a ClickFunnels funnel page, bypassing WordPress entirely. In this case, UTM parameters are in the URL of the ClickFunnels page itself, and the tracking setup is entirely within ClickFunnels.

    This guide focuses primarily on Scenario A (the WordPress-first journey) because that’s where the tracking gap is hardest to close.

    The WordPress-First Journey: How to Pass UTMs Through the Click

    When a visitor arrives on WordPress via a tagged URL and then clicks through to ClickFunnels, the standard approach is to pass the UTM parameters through as URL parameters on the ClickFunnels link. Here’s the flow:

    1. Visitor arrives on WordPress with UTMs: yourblog.com/post/?utm_source=google&utm_medium=cpc&utm_campaign=summer-offer
    2. A WordPress script captures those UTMs and stores them in a first-party cookie
    3. When the page renders your ClickFunnels link (a button or CTA), a script appends the stored UTM values to the link URL: yourfunnel.com/opt-in?utm_source=google&utm_medium=cpc&utm_campaign=summer-offer
    4. The visitor arrives on your ClickFunnels page with the UTMs in the URL
    5. ClickFunnels captures the URL parameters and maps them to contact fields

    This approach avoids the cross-domain cookie problem (cookies from WordPress don’t transfer to ClickFunnels, which is on a different domain). Instead, the data travels in the URL itself.

    Step 1: Capture UTMs on WordPress

    Add a JavaScript snippet that reads UTM parameters from the URL on landing and stores them in cookies:

    document.addEventListener('DOMContentLoaded', function() {
      const params = new URLSearchParams(window.location.search);
      const utmParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term'];
      
      utmParams.forEach(function(param) {
        const val = params.get(param);
        if (val) {
          document.cookie = param + '=' + encodeURIComponent(val)
            + '; path=/; max-age=7776000; SameSite=Lax';
        }
      });
    });
    
    function readCookie(name) {
      const m = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
      return m ? decodeURIComponent(m[2]) : '';
    }
    

    Install via WPCode or your theme. This runs on every WordPress page and stores any UTM values present in the URL in 90-day cookies.

    Step 2: Append UTMs to Your ClickFunnels Links

    Add a script that modifies any links pointing to your ClickFunnels domain by appending the stored UTM cookie values as URL parameters:

    document.addEventListener('DOMContentLoaded', function() {
      const utmParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term'];
      
      // Replace with your ClickFunnels domain(s)
      const cfDomains = ['yourfunnel.com', 'go.yourbrand.com'];
      
      document.querySelectorAll('a[href]').forEach(function(link) {
        const href = link.href;
        const isCfLink = cfDomains.some(d => href.includes(d));
        if (!isCfLink) return;
        
        const url = new URL(href);
        utmParams.forEach(function(param) {
          const val = readCookie(param);
          if (val && !url.searchParams.has(param)) {
            url.searchParams.set(param, val);
          }
        });
        link.href = url.toString();
      });
    });
    

    Replace the cfDomains array with the actual domains your ClickFunnels pages are on. This script scans every link on the page and appends UTM parameters to any that point to your ClickFunnels domain.

    Step 3: Capture UTMs in ClickFunnels

    ClickFunnels can capture URL parameters and store them in contact fields. In your ClickFunnels form settings:

    1. Add hidden fields to your opt-in or order form for each UTM parameter you want to capture
    2. Set each hidden field’s “Default Value” to pull from the URL parameter with the same name: in ClickFunnels 2.0, use the input’s external ID or a URL parameter binding to map utm_source to a hidden field, and so on for each parameter
    3. When a contact submits the form, the UTM values from the URL populate the hidden fields and are stored on the ClickFunnels contact record

    In ClickFunnels 2.0, you can also use custom contact attributes (under Contacts > Attributes) to store the source data persistently on the contact record rather than on a single form submission.

    Step 4: Test the Pipeline

    1. Open an incognito window and visit your WordPress site with UTMs: yourblog.com/post/?utm_source=test&utm_medium=organic&utm_campaign=tracking-check
    2. Click the CTA link that goes to your ClickFunnels page — verify the URL now contains the UTM parameters (check the address bar)
    3. Submit the opt-in form with a test email address
    4. Check the contact in ClickFunnels — the source fields should reflect the test UTM values

    For Scenario B: Traffic Landing Directly on ClickFunnels

    If your ads and campaigns link directly to ClickFunnels pages (bypassing WordPress), you don’t need the WordPress-to-ClickFunnels UTM pass-through. Instead:

    • Tag all your ad and campaign links with UTM parameters going to the ClickFunnels URL directly
    • Capture those UTM parameters in ClickFunnels using the same hidden field approach described in Step 3
    • ClickFunnels reads the UTMs from its own URL and stores them on the contact record

    This is simpler because there’s no cross-domain handoff to engineer.

    What to Do With Source Data in ClickFunnels

    Once source data is on ClickFunnels contact records:

    Segment contacts by source. In ClickFunnels 2.0, filter contacts by attribute values. This shows you which channels are building your list and which are producing buyers rather than just subscribers.

    Tag contacts for source-specific follow-up. Apply tags based on UTM values (a “google-paid” tag for utm_medium = cpc, a “facebook” tag for utm_source = facebook). Use those tags to enroll contacts in different email sequences in your connected email platform.

    Revenue attribution. If you track purchases in ClickFunnels, filter purchasers by source attribute to calculate revenue by channel. Which campaign produced paying customers? This is the fundamental attribution question that changes budget decisions.

    The Ongoing Maintenance Problem

    The URL-appending approach works but has limits. Every new page on your WordPress site with a ClickFunnels CTA needs the link-appending script to be working. If someone shares a blog post link without UTMs (common in organic social), the visitor arrives without source data and there’s nothing to pass through. The script approach also doesn’t handle cases where a visitor bookmarks a WordPress page and returns later from a different device.

    A dedicated WordPress attribution plugin handles UTM capture automatically across your site and passes source data to connected platforms — including ClickFunnels via integration — without per-page configuration. If getting reliable source data from WordPress into ClickFunnels contact records is something you want working consistently, Sales Provenance is the faster path.

  • GetResponse and WordPress: How to Track Lead Source for Every Subscriber

    GetResponse and WordPress: The Source Data Gap

    GetResponse is a well-established email marketing and automation platform used by small businesses, ecommerce operators, and digital marketers. It handles email campaigns, autoresponders, landing pages, webinars, and marketing automation. Many GetResponse users also have a WordPress site as their primary web presence, using it for blog content, lead capture forms, and general brand marketing.

    The attribution gap shows up when a subscriber who originally found you through a paid ad or an organic blog post ends up in your GetResponse account without any record of where they came from. You know you have 3,000 subscribers. You may not know whether 2,000 of them came from organic search or 500 of them came from the Facebook campaign you ran last quarter.

    This guide covers how to capture UTM source data on your WordPress site and pass it to GetResponse subscriber records, so your email list carries the channel and campaign data you need to understand what’s actually working.

    What You Can Do With Source Data in GetResponse

    GetResponse supports custom contact fields, which is where UTM data lives once it’s captured. With source data on subscriber records, you can:

    • Segment by acquisition channel. Create a list segment for subscribers from Google Ads, a different one for organic search, and another for Facebook campaigns. Send targeted content to each segment or compare their engagement metrics to understand which channels produce your most active subscribers.
    • Build source-specific automation workflows. GetResponse’s marketing automation supports conditions on custom contact fields. A workflow can branch on “lead source equals facebook” to send a different sequence than the one sent to subscribers who found you through organic search. Someone who clicked an ad is in a different context than someone who found your content by searching.
    • Report on campaign performance beyond clicks. If you tagged a specific email campaign that drove traffic to your opt-in page, filter subscribers by that campaign’s UTM to see how many subscribers it produced. This connects ad spend and send volume to actual list growth.
    • Understand list quality over time. Engagement rate by source often reveals that organic subscribers open at higher rates and unsubscribe at lower rates than paid traffic subscribers. Knowing this changes how you evaluate the cost of list acquisition.

    Step 1: Tag Your Marketing Links With UTMs

    Source tracking only works if your traffic comes from tagged links. A UTM-tagged URL looks like:

    https://yoursite.com/blog-post/?utm_source=facebook&utm_medium=paid_social&utm_campaign=q3-awareness&utm_content=carousel-ad

    Add UTM parameters to:

    • Every paid ad (Facebook, Instagram, Google, YouTube)
    • Every email campaign link that sends traffic to your WordPress site
    • Partner and affiliate links where you control the URL
    • Social posts during tracked campaigns

    Organic search traffic doesn’t need manual UTM tags — it appears in your data with empty UTM fields, which is useful context in itself (a subscriber whose fields are empty either came from organic search or direct traffic). The important thing is that every channel you pay for or actively promote gets tagged.

    Step 2: Capture UTMs in a Cookie on WordPress

    UTM parameters in a URL only exist on the first pageview. A JavaScript snippet that fires on page load reads those parameters and stores them in a cookie before the visitor navigates away:

    document.addEventListener('DOMContentLoaded', function() {
      const params = new URLSearchParams(window.location.search);
      const utmParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term'];
      
      utmParams.forEach(function(param) {
        const val = params.get(param);
        if (val) {
          document.cookie = param + '=' + encodeURIComponent(val)
            + '; path=/; max-age=7776000; SameSite=Lax';
        }
      });
      
      if (!readCookie('landing_page')) {
        document.cookie = 'landing_page=' + encodeURIComponent(window.location.href)
          + '; path=/; max-age=7776000; SameSite=Lax';
      }
    });
    
    function readCookie(name) {
      const m = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
      return m ? decodeURIComponent(m[2]) : '';
    }
    

    The 90-day expiry (max-age 7776000 seconds) means the source data persists even if the visitor returns days later before subscribing. Install this script using WPCode, your theme’s functions.php via wp_enqueue_scripts, or another WordPress custom code method.

    Step 3: Create Custom Fields in GetResponse

    GetResponse lets you create custom contact fields to store additional data beyond the default fields. In your GetResponse account, go to Contacts > Custom Fields and create text fields for:

    • lead_source (from utm_source)
    • lead_medium (from utm_medium)
    • lead_campaign (from utm_campaign)
    • lead_content (from utm_content)
    • lead_keyword (from utm_term)
    • landing_page (the first URL the visitor hit)

    Note the field IDs that GetResponse assigns — you’ll need them when configuring the API or integration.

    Step 4: Connect Your WordPress Forms to GetResponse With Hidden UTM Fields

    The connection method depends on your form setup:

    Option A: GetResponse’s WordPress plugin with native forms. GetResponse has an official WordPress plugin that lets you embed subscription forms directly on your WordPress pages. Add hidden fields to the form for each UTM custom field, and use JavaScript to populate those hidden fields from cookies when the page loads:

    document.addEventListener('DOMContentLoaded', function() {
      const fieldMap = {
        'lead_source': 'utm_source',
        'lead_medium': 'utm_medium',
        'lead_campaign': 'utm_campaign',
        'lead_content': 'utm_content',
        'lead_keyword': 'utm_term',
        'landing_page': 'landing_page'
      };
      
      Object.entries(fieldMap).forEach(function([fieldName, cookieName]) {
        const val = readCookie(cookieName);
        if (val) {
          const input = document.querySelector('[name="' + fieldName + '"]');
          if (input) input.value = val;
        }
      });
    });
    

    Replace the field names in the map with the actual input names from your GetResponse form’s HTML.

    Option B: WordPress form plugins with GetResponse integration. WPForms, Gravity Forms, and Fluent Forms all have GetResponse add-ons or can connect via Zapier. Add hidden UTM fields to your form, populate them from cookies with the same JavaScript, and map those fields to GetResponse custom fields in the integration settings.

    Option C: GetResponse API directly. GetResponse’s REST API allows you to add contacts with custom field values programmatically. If you have a developer, a form submission webhook can call the GetResponse API directly with the UTM data from hidden fields, giving you the most reliable integration without depending on a third-party connection layer.

    Step 5: Verify the Full Pipeline

    Test before you trust the data:

    1. Open an incognito window and visit: yoursite.com/?utm_source=test&utm_medium=email&utm_campaign=tracking-check
    2. Navigate to another page (confirm UTM cookies are written via DevTools > Application > Cookies)
    3. Submit your subscription form with a test email address
    4. Find the contact in GetResponse and check their custom fields — lead_source should show “test”, lead_medium should show “email”, lead_campaign should show “tracking-check”

    If the fields are empty, isolate each step: Are the cookies being written? Are the hidden fields being populated by JavaScript? Is the integration mapping the fields to the correct GetResponse custom field IDs?

    Using Source Data in GetResponse

    Once source data is on contact records:

    Segment your list by source. In GetResponse, create segments based on custom field values. “Subscribers from Google Ads” (lead_source = google, lead_medium = cpc), “Organic subscribers” (lead_source empty or lead_medium = organic), “Facebook campaign subscribers” (lead_campaign contains your campaign name). Segments let you analyze engagement by channel and send targeted campaigns to specific groups.

    Automation workflow conditions. In GetResponse’s marketing automation, add conditions that check custom field values. “If lead_source equals facebook” can route a contact into a different workflow branch — a sequence calibrated for paid-traffic subscribers who may need more nurturing before they trust you enough to buy.

    Campaign performance tracking. If you run a specific campaign (a product launch, a free training) and tag all traffic from it with a unique utm_campaign value, you can filter GetResponse contacts by that campaign value to count how many subscribers the campaign produced. Combine with revenue data to calculate list-growth cost per subscriber by campaign.

    The Per-Form Maintenance Problem

    This setup works well but has a maintenance cost. Every new opt-in form you add to your WordPress site needs the hidden UTM fields and the JavaScript to populate them. Every time you change your GetResponse form layout or add a new custom field, the integration needs to be updated to match. For sites with multiple opt-in forms and evolving campaigns, this becomes a recurring development task.

    A WordPress attribution plugin handles the capture-and-pass pipeline automatically across all forms without per-form configuration. Source data flows to GetResponse (and other connected platforms) from every new form you add without additional setup.

    If you want UTM source data flowing from your WordPress site into GetResponse subscriber records without maintaining the setup form by form, Sales Provenance is the faster path.

  • Kajabi and WordPress: How to Track Lead Source Through to Paid Members

    Kajabi and WordPress: Two Platforms, One Attribution Problem

    Kajabi is a popular all-in-one platform for course creators, coaches, and membership site operators. It handles courses, community, email marketing, checkout, and sometimes landing pages — all under one roof. Many Kajabi users also maintain a WordPress site as their main web presence, using WordPress for their blog, their primary content marketing, and their general brand site, while Kajabi handles the product and member experience behind the paywall.

    The attribution gap happens in between. Someone finds your WordPress blog post through organic search. They read it, sign up for your lead magnet, and eventually buy your Kajabi course. You know they bought. You know they came from somewhere. But by the time they clicked “buy,” the traffic source that originally brought them to you has typically been lost.

    This guide covers how to capture that source data on the WordPress side and make it available in Kajabi, so you can understand which channels are actually building your paying membership base.

    Why This Matters for Course and Membership Businesses

    Attribution matters differently for course creators and membership business operators than it does for service businesses. The typical journey is longer: a prospect might follow you for months before buying. They might come through organic search, subscribe to an email list, receive a launch sequence, and then buy. That whole chain started somewhere, and understanding where changes how you invest your time and money.

    With source data, you can answer questions like:

    • Which content pieces produce buyers, not just subscribers? A blog post that generates organic traffic is valuable. A blog post that generates organic traffic that converts into paid members is especially valuable — and you can only identify it if source data follows the subscriber through to purchase.
    • Do paid traffic buyers have different lifetime value than organic buyers? Someone who found you through a Google Ad and bought during your launch is different from someone who followed you for six months through organic search before buying. Understanding this difference shapes whether paid acquisition is worth its cost.
    • Which launch or campaign channels produced the most revenue? If you ran a launch with Facebook Ads, email campaigns to your list, and organic social, UTM tracking lets you attribute revenue to each by tracing purchases back to their original entry source.

    How the Tracking Setup Works

    The core flow:

    1. A visitor arrives on your WordPress site from a tagged URL (one with UTM parameters from a paid ad, an email campaign, a social post, or a partner link)
    2. A script captures those UTM values and stores them in a first-party cookie that persists as the visitor moves between pages
    3. When the visitor subscribes to your list (via a WordPress opt-in form or a Kajabi landing page), hidden fields in the form capture the UTM data and pass it to your email list or CRM as custom field data
    4. That source data travels with the subscriber through your email sequences and into Kajabi’s contact record
    5. When the subscriber purchases, Kajabi’s contact record includes the original source information

    Step 1: Tag Your Marketing Links

    UTM tracking only works if your traffic sources carry UTM parameters. A tagged link to a WordPress blog post looks like:

    https://yourblog.com/the-post/?utm_source=newsletter&utm_medium=email&utm_campaign=launch-week-3

    Tag links in:

    • Every email you send to your list (links back to your WordPress blog, landing pages, or Kajabi checkout)
    • Every paid ad (Facebook, Instagram, Google, Pinterest, YouTube)
    • Every partner or affiliate link where you control the URL
    • Social posts when you’re running a specific campaign you want to track

    Organic search, direct traffic, and untagged referral traffic won’t carry UTMs, but they’ll still appear in your data as “organic” or “direct” through Google Analytics. The UTM fields you’ll pass to Kajabi will simply be empty for untagged traffic — which is useful information (someone who found you organically rather than through a campaign).

    Step 2: Capture UTMs in Cookies on WordPress

    UTM parameters exist in the URL only on the first pageview. The visitor loses them the moment they click to another page. A JavaScript snippet on your WordPress site reads them immediately and writes them to a cookie that persists for the session (and optionally for 90 days):

    document.addEventListener('DOMContentLoaded', function() {
      const params = new URLSearchParams(window.location.search);
      const utmParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term'];
      
      utmParams.forEach(function(param) {
        const val = params.get(param);
        if (val) {
          document.cookie = param + '=' + encodeURIComponent(val)
            + '; path=/; max-age=7776000; SameSite=Lax';
        }
      });
      
      if (!readCookie('landing_page')) {
        document.cookie = 'landing_page=' + encodeURIComponent(window.location.href)
          + '; path=/; max-age=7776000; SameSite=Lax';
      }
    });
    
    function readCookie(name) {
      const m = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
      return m ? decodeURIComponent(m[2]) : '';
    }
    

    Install this via WPCode (the simplest option), your theme’s header.php, or a custom plugin. It runs on every WordPress page load and captures UTMs before the visitor navigates away from the landing page.

    Step 3: Pass UTMs When a Visitor Subscribes

    The capture point for source data is the moment a visitor becomes a subscriber. This happens through an opt-in form — either on WordPress or on a Kajabi landing page. The method varies:

    WordPress opt-in forms with Kajabi integration. If you use a WordPress form plugin (WPForms, Gravity Forms, Fluent Forms) with a Kajabi connection via Zapier or Make.com, add hidden UTM fields to the form, populate them from cookies via JavaScript, and configure the Zapier step to pass the UTM field values to Kajabi’s contact custom fields.

    Kajabi landing pages. If the opt-in happens on a Kajabi page (not WordPress), the WordPress cookie won’t transfer automatically — the visitor has moved to a different domain. Options: (1) use Zapier with a custom webhook that captures UTMs from URL parameters on the Kajabi page (you’d need to include UTMs in the Kajabi landing page URL when linking to it), or (2) use Kajabi’s built-in tracking features to capture click-source context.

    Email service provider as the bridge. If you use a separate email platform (ConvertKit, MailerLite, ActiveCampaign) as your email list before Kajabi handles purchases, pass UTMs to that platform first using the same hidden-field approach, then sync the source data to Kajabi via automation when a subscriber purchases.

    Step 4: Store Source Data in Kajabi Contact Fields

    Kajabi supports custom contact fields that you can populate via API or integrations. Go to Settings > Custom Fields and create text fields for:

    • Lead Source (from utm_source)
    • Lead Medium (from utm_medium)
    • Lead Campaign (from utm_campaign)
    • Landing Page (the first WordPress URL the visitor hit)

    Configure your Zapier steps to write the UTM values from the form submission into these fields on the Kajabi contact record. When the contact later purchases, the custom fields carry over to the purchase record.

    Step 5: Verify the Pipeline

    1. Open an incognito window and visit your WordPress site with UTM parameters: yourblog.com/?utm_source=test&utm_medium=email&utm_campaign=tracking-check
    2. Navigate to another page (confirm UTM cookies persist in DevTools)
    3. Submit your opt-in form with a test email address
    4. Check the contact record in Kajabi — the Lead Source field should show “test”, Lead Medium should show “email”, Lead Campaign should show “tracking-check”

    What to Do With Source Data in Kajabi

    Once source data is on Kajabi contact records, you can filter and analyze your membership by acquisition source:

    Filter purchasers by source. In Kajabi’s People section, filter contacts by the Lead Source custom field. This shows you which sources have produced paying members, not just subscribers.

    Revenue by campaign. If you tag launch email campaigns consistently, you can calculate revenue from each campaign by filtering purchases by the Lead Campaign field value for that launch. This is the basic campaign attribution report that most course creators can’t produce.

    Content performance beyond pageviews. A WordPress blog post that drives organic traffic is easy to measure in Google Analytics. But does that organic traffic buy? Filter Kajabi purchasers by Lead Source = “google” and Lead Medium = “organic” to estimate how many organic readers eventually became customers.

    The Simpler Path

    The setup above works but requires per-form configuration of hidden fields and JavaScript, plus Zapier wiring between WordPress and Kajabi. Every new opt-in form or landing page needs to be added to the setup individually.

    Sales Provenance installs as a WordPress plugin and handles UTM capture automatically across all forms on your site. Source data passes to connected platforms — including Kajabi via integrations — without per-form configuration. If understanding which channels produce paying Kajabi members is something you want working without a development project, Sales Provenance is the faster path.