Tag: Offline Conversions

  • Meta Ads Conversion Tracking on WordPress: Pixel, CAPI, and Offline Conversions

    Meta Ads conversion tracking on WordPress works differently from Google Ads, and the difference matters for how you optimize your campaigns. This guide covers the full setup: the Facebook pixel for website events, the Conversions API for server-side reliability, and the offline conversion approach that tells Meta which leads actually became paying clients — not just which ones filled out your form.

    The pixel versus the Conversions API

    Meta offers two ways to track conversions: the browser-based pixel and the Conversions API (CAPI). They are not alternatives — they are complements, and running both is the right approach for a WordPress business.

    • The Facebook pixel is a JavaScript snippet that loads in the visitor’s browser and fires events as they navigate your site. It captures form submissions, thank-you page views, and button clicks. The limitation is that it depends on the browser: ad blockers suppress it, iOS 14+ privacy changes reduce its reach, and browser crashes or navigations that happen before the script fully executes cause missed events. On a well-implemented WordPress site with GTM, the pixel typically captures 60 to 80 percent of actual conversions.
    • The Conversions API sends event data directly from your server to Meta’s servers, bypassing the browser entirely. It does not get blocked by ad blockers or affected by browser privacy settings. CAPI does not replace the pixel — it supplements it by capturing the conversions the pixel misses. The combination of pixel plus CAPI, with deduplication enabled, consistently outperforms pixel-only tracking on both match rate and event volume.

    Running both with event deduplication (using a shared event ID) is the current Meta best practice and the setup that gives your campaigns the most accurate conversion signal.

    Step 1: Install the pixel and configure standard events

    The pixel installs via Google Tag Manager or a Meta-provided WordPress plugin. GTM gives you more control and is preferred for most setups:

    1. In Meta Events Manager, create a pixel and copy the base code.
    2. In GTM, create a Custom HTML tag with the pixel base code, firing on All Pages.
    3. Create a separate tag for the Lead event, firing on your thank-you page (the same trigger you use for Google Ads conversion tracking). The Lead event is the right standard event for contact form completions — it is more specific than PageView and is what Meta’s ad delivery algorithm optimizes toward when you run Lead Generation campaigns.
    4. Publish the GTM container and verify in Meta Events Manager’s Test Events tool by submitting a test form and confirming the Lead event fires.

    If you are running contact forms on WordPress with WPForms, Gravity Forms, or Contact Form 7, the thank-you page redirect approach (the same one recommended for Google Ads) is the most reliable trigger for the Lead event. Form submission JavaScript triggers vary in reliability across plugins; the redirect does not.

    Step 2: Add the Conversions API for server-side reliability

    The Conversions API requires sending event data to Meta’s API endpoint from your server. On WordPress, there are a few implementation paths:

    • The Meta Business Extension / WordPress plugin provides a built-in CAPI integration. It connects your WordPress site to Meta’s server and sends pixel events server-side automatically. This is the easiest path if you do not need deep customization — install, connect your Meta account, enable CAPI, and the plugin handles deduplication.
    • Custom server-side implementation via a webhook or server function gives you more control over which events send, what customer data is included, and how deduplication is handled. This is the right approach if you are capturing lead source data (UTMs, gclids) and want to pass that data alongside the conversion event for richer attribution.
    • GTM Server-Side container can route pixel events through a server-side GTM container before sending to Meta, providing some of the benefits of CAPI with a GTM-familiar interface. More infrastructure to maintain but good for organizations already using server-side GTM.

    Whichever path you choose, enable event deduplication by passing a consistent event_id that matches between your pixel and CAPI implementations. Without deduplication, Meta counts the same conversion twice — once from the browser and once from the server — inflating your reported conversion numbers.

    Step 3: Pass customer data for better match rates

    Meta matches your conversion events to Meta user accounts using customer data: email address, phone number, name, and location. The more data you pass, the higher the match rate — and match rate directly affects how many of your conversions Meta can attribute to your ads.

    On a contact form submission, you typically have the lead’s email address and phone number. Include these in your CAPI event payload, hashed with SHA-256 (Meta requires hashing for privacy compliance). The pixel can also pass this data client-side via the fbq('track', 'Lead', {em: hashedEmail}) call, though server-side via CAPI is more reliable because it does not depend on the user’s browser.

    Passing hashed email and phone consistently is the single highest-leverage improvement most WordPress businesses can make to their Meta conversion tracking match rates. Match rates of 40 to 60 percent are common without customer data; 70 to 90 percent are achievable with it.

    Step 4: Offline conversions — the step that actually optimizes toward revenue

    Website and CAPI conversion tracking tells Meta who submitted a form. Offline conversion tracking tells Meta who became a paying client. The difference is the same as with Google Ads: if your business closes 1 in 8 leads, Meta’s “optimize for conversions” bidding will try to get you more form fills, not more clients, unless you tell it which form fills converted.

    Meta’s offline conversions API accepts customer records from your closed deals — matched against the lead’s email, phone, or name — and attributes each won customer to the original ad click that generated the lead. Your campaigns can then optimize toward a Purchase or CustomEvent that represents a closed client, rather than a Lead event that represents a form submission.

    The implementation requires:

    • A way to track which leads become clients (a CRM, a spreadsheet with a “closed” field, or a lead management interface in your WordPress backend).
    • A process for uploading closed deals to Meta periodically — weekly manual uploads via Meta Events Manager, or automated via the offline conversions API when a deal is marked won.
    • Customer data from the original lead (email or phone) for Meta to match the offline event to the original ad interaction.

    Businesses that implement offline conversion feedback to Meta consistently report that their campaigns shift toward higher-quality leads over time, even at the same budget. The algorithm is optimizing toward a stronger signal.

    How this compares to Google Ads conversion tracking

    The workflow is similar: capture UTM parameters and source data at the point of form submission, track the lead through to a closed sale, and feed the won outcome back to the ad platform. The technical implementation differs (gclid for Google, fbclid or customer data matching for Meta), but the attribution strategy is the same. If you have already implemented Google Ads offline conversion tracking on WordPress, most of the infrastructure you built — UTM capture, lead management, closed-deal tracking — applies directly to Meta with relatively minor additions.

    For a detailed walkthrough of the Google Ads side of this, see Google Ads conversion tracking on WordPress. For the broader picture of how closed-loop attribution works across channels, closed-loop reporting on WordPress covers the full workflow.

    How Sales Provenance fits

    Sales Provenance handles the data infrastructure that both Google Ads and Meta Ads offline conversion tracking require: capturing source data (UTMs, fbclid, gclid) at form submission, storing it with each lead in your WordPress database, providing a lead management interface to track which leads close, and syncing the won outcomes back to both platforms as offline conversions. The pixel and CAPI setup is separate (Meta-side configuration), but the lead-to-client matching and offline conversion sync is what SP is built to handle.

    If you are running both Google and Meta ads and want a single system that closes the attribution loop for both, revenue attribution on WordPress explains how the pieces fit together.

  • How to Set Up Google Ads Conversion Tracking on WordPress (The Right Way)

    Setting up Google Ads conversion tracking on WordPress sounds straightforward until you realize that “conversion tracking” actually refers to two different things — and most WordPress businesses are only doing one of them. This guide covers both: the website conversion tracking that most people set up, and the offline conversion tracking that actually tells Google which clicks turned into paying clients. The second one is harder to implement, but it is where most of the optimization value lives.

    Two ways to track Google Ads conversions on WordPress

    The distinction matters because Google uses conversion data to optimize your campaigns. What you feed it determines what it optimizes toward.

    • Website conversions track actions that happen on your site: form submissions, thank-you page visits, button clicks, phone call clicks. These are easy to set up and give Google a signal for every lead that comes in. The problem is that leads are not revenue. If 100 people fill out your form and 8 become paying clients, Google’s “maximize conversions” bidding does not know which 8 — it just tries to get you more form fills, regardless of quality.
    • Offline conversions close the loop. You capture the Google click ID (gclid) when the lead arrives, match it to the customer after they close, and send that won outcome back to Google as a conversion. Now Google knows: these specific clicks, these specific keywords, this specific audience segment produced paying clients. Its bidding algorithm can optimize toward that signal instead of toward raw lead volume.

    Most WordPress businesses do the first. The ones that do the second get meaningfully better results from the same ad spend.

    Step 1: Set up website conversion tracking

    Start here if you have not already. You need Google Tag Manager installed on your WordPress site and a Google Ads account linked to it.

    The most reliable method for form submission tracking on WordPress is the thank-you page approach:

    1. Create a dedicated thank-you page (e.g., /thank-you/) that contact form submitters are redirected to after submitting.
    2. In Google Tag Manager, create a trigger: Page View firing on URL contains /thank-you/.
    3. Create a tag: Google Ads Conversion Tracking, using your conversion action ID and label from Google Ads. Set it to fire on the thank-you page trigger.
    4. Publish the GTM container and verify in GTM’s Preview mode by submitting a test form and confirming the tag fires.

    The alternative — using form submission events directly — requires custom dataLayer pushes that vary by form plugin (Contact Form 7, WPForms, Gravity Forms each work differently). The thank-you page redirect is more reliable and plugin-agnostic.

    For phone calls, use Google’s forwarding number in your Google Ads call extension. This gives you call tracking without any tag setup, though it only captures clicks from your ads, not organic or direct calls.

    Step 2: Capture the gclid at form submission

    This is the step that makes offline conversion tracking possible. When someone clicks a Google ad and lands on your site, Google appends a gclid parameter to the URL. You need to capture that parameter and store it alongside the lead’s form submission data.

    The implementation has three parts:

    • Read the gclid from the URL on page load. A small JavaScript snippet reads gclid from the URL query string and stores it in a first-party cookie with a 90-day expiration. This handles the case where someone clicks your ad, bounces, and returns days later — the cookie persists across sessions.
    • Add a hidden field to your contact form. A hidden form field named gclid reads from the cookie on page load and populates automatically. When the form submits, the gclid travels with the lead data to wherever your form stores submissions.
    • Store the gclid with the lead record. Your form plugin or CRM needs to save the gclid value alongside the lead’s name, email, phone, and other contact fields. If you are not storing it, you cannot match it to a sale later.

    The same approach applies to UTM parameters (utm_source, utm_campaign, utm_term): capture them from the URL on landing, store in cookies, pass via hidden fields, save with the lead. This gives you full source attribution even when Google Ads is not involved.

    Step 3: Match leads to clients and upload offline conversions

    When a lead becomes a paying client, you match the gclid stored on their lead record to a Google Ads offline conversion upload. Google matches that gclid to the original click and counts it as a conversion — a won customer, not just a form fill.

    There are two ways to send offline conversions to Google:

    • Manual CSV upload — in Google Ads, go to Tools > Conversions > Upload. Prepare a CSV with three columns: Google Click ID, Conversion Name, Conversion Time (and optionally Conversion Value). Upload it. Google processes the file and attributes the conversions to the original clicks. This works for businesses that close a manageable number of deals per month and are willing to run the upload on a regular schedule (weekly is common).
    • API upload (automated) — using Google’s Ads API or a platform that integrates with it, you can send offline conversions automatically as soon as a deal is marked won in your system. This eliminates the manual step and keeps Google’s data current without a weekly reminder. It requires either custom development or a tool that handles the API connection for you.

    Either way, the conversion data feeds Google’s smart bidding algorithms: Target CPA and Target ROAS bidding can now optimize toward clients, not leads. The improvement in campaign efficiency is typically significant — you are giving the algorithm a fundamentally better signal to work with.

    The WordPress-specific challenge

    WordPress does not have native lead-to-sale tracking. It accepts form submissions, but it does not natively store UTM parameters or gclid values, does not have a built-in CRM to mark deals won, and does not connect to Google Ads for offline conversion uploads. Each of those steps requires either custom development, a plugin, or a third-party integration.

    The most common failure mode is partial implementation: a business sets up form tracking in GTM, captures some UTM parameters, but never builds the gclid capture-and-store step or the offline conversion upload. The result is website conversion data flowing to Google, but no closed-loop signal. Google optimizes toward form fills and the business wonders why lead quality is inconsistent.

    The full stack — gclid capture, UTM storage, lead records with source data, closed-deal matching, offline conversion upload — requires deliberate implementation. Once it is in place, it runs automatically and compounds over time as Google’s algorithm accumulates more closed-customer signal.

    How Sales Provenance handles this on WordPress

    Sales Provenance is built to implement this entire workflow natively on WordPress, without custom development. It installs as a WordPress plugin, captures gclid and UTM parameters automatically on every landing page visit, stores them with every form submission, provides a lead management interface where you mark deals won, and handles the offline conversion upload to Google Ads automatically.

    The result is the full closed-loop attribution stack — from ad click through to closed client and back to Google — running inside your WordPress site without a separate CRM, a data warehouse, or a developer on retainer. For a more detailed look at how the offline conversion piece works, see offline conversion tracking on WordPress. For the broader picture of what closed-loop attribution looks like in practice, closed-loop reporting walks through the full workflow.

    Summary: the implementation checklist

    • Install Google Tag Manager on WordPress
    • Create thank-you page + GTM trigger for website conversion tracking
    • Add gclid capture script (reads URL, stores in first-party cookie)
    • Add hidden gclid field to all contact forms
    • Confirm gclid is stored with every lead record
    • Do the same for UTM parameters (source, campaign, term, content)
    • Establish process for marking leads as won clients
    • Upload offline conversions to Google Ads (manually weekly or via API)

    Each step builds on the previous one. You can stop at website conversions and have better-than-nothing tracking. But the full stack — with offline conversion upload — is where the optimization value actually lives.

  • Report Move-Ins, Not Leads: How Offline Conversion Tracking Fixes WordPress Marketing

    Most WordPress businesses optimize their marketing toward the wrong finish line. They count form fills, phone calls, and quote requests, and then pour budget into whatever produces the most of them. The problem is that leads are not customers. The campaign that generates the most leads is very often not the campaign that generates the most revenue, and if you cannot tell the two apart, you are spending money to attract the wrong people.

    Offline conversion tracking is how you fix that. It closes the loop between a click and a closed sale, and it is the single highest-leverage upgrade most WordPress businesses can make to their marketing measurement.

    The gap: your ad platform stops watching at the form

    Here is what happens today on a typical WordPress site. Someone clicks your Google or Meta ad, lands on your site, and fills out a form. The ad platform records a "conversion" and pats itself on the back. From that moment on, it is blind.

    It does not know:

    • Whether that lead ever answered the phone
    • Whether they were a real prospect or a tire-kicker
    • Whether they signed, bought, moved in, or booked the job
    • How much that sale was actually worth

    So when Google or Meta optimizes your campaigns, it is optimizing toward form fills, because that is the last thing it can see. It will happily find you more of whatever kind of person tends to fill out forms, even if those people rarely become customers. You get a dashboard full of cheap leads and a sales team that quietly complains the leads are junk.

    The fix: send the real outcome back to the platform

    Offline conversion tracking feeds the truth back into the system. When a lead actually becomes a customer, you send that event, and ideally its real dollar value, back to Google and Meta. Now the platforms can optimize toward the outcome that matters: customers and revenue, not raw leads.

    The change in behavior is dramatic. Instead of chasing the cheapest form fill, the ad platform starts hunting for people who look like your actual buyers. Campaigns that produced lots of low-quality leads get throttled. Campaigns that produced fewer leads but better customers get scaled. You are finally paying for revenue instead of activity.

    How it works, step by step

    You do not need to rebuild your website. The mechanism is straightforward once the pieces are connected:

    1. Tag the click. When a visitor arrives from an ad, the platform attaches a click identifier (Google calls it GCLID, Meta has its own). You capture and store that identifier with the lead on your own domain, as first-party data.

    2. Carry it through to the lead record. When that visitor submits a form or calls, the click ID rides along into your CRM, attached to the actual person.

    3. Wait for the real outcome. Days or weeks later, that lead closes, buys, books the job, or moves in. Your team marks the deal won, usually with a dollar value.

    4. Send the conversion back. That won deal, paired with its original click ID and value, gets uploaded back to Google Ads and Meta as an offline conversion. The platform matches it to the original click and updates what it knows.

    5. Let the algorithm relearn. With real outcomes flowing in, smart bidding stops chasing cheap leads and starts chasing customers.

    Why this is hard on WordPress today

    The reason most WordPress businesses do not do this is not that it is complicated in theory. It is that the pieces live in different places that do not talk to each other.

    The click ID is captured by a tag. The lead lands in a form plugin or a CRM. The sale gets marked won in yet another system, often a spreadsheet or the owner's head. Stitching those together, holding the click ID for weeks, and uploading clean conversions back to two ad platforms on a schedule is exactly the kind of plumbing that never gets built, so it never gets built.

    That is the gap. The data exists, scattered across your tools. Nobody has connected it end to end.

    What good looks like

    When offline conversion tracking is working, your marketing reports change in a way you can feel:

    • Your reports show revenue and customers, not just leads.
    • You can finally answer "which campaign actually drives sales?" with data instead of a hunch.
    • Your ad platforms get smarter every week, because they are learning from real outcomes.
    • Your sales team stops complaining about lead quality, because the system is now optimizing for the leads they can actually close.

    This is the difference between marketing that looks busy and marketing that is accountable to the bottom line.

    Where to start

    Ask yourself one question: if I marked a deal "won" in my system today, would Google and Meta ever find out?

    For almost every WordPress business, the answer is no. The click ID was never captured, or it was captured and never connected to the sale, or the sale lives somewhere the ad platforms will never see. That broken connection is costing you, quietly, every single day your campaigns optimize toward the wrong goal.

    Closing that loop, capturing the click on your own domain, carrying it to the sale, and feeding the real outcome back to the platforms, is exactly what Sales Provenance was built to do for WordPress, without moving you off the platform you already run on.