SignalBridge LogoSignalBridge
Back to Blog

How to Track Offline Conversions with Server-Side Data (2026)

Offline conversion tracking explained: how to send in-store purchases, phone call leads, and CRM closes back to Facebook, Google, and TikTok using server-side data and the Conversions API.

15 min read
How to Track Offline Conversions with Server-Side Data (2026)

Key Takeaways

  • Offline conversions are any purchases, leads, or high-value actions that happen outside of a browser session — in-store, via phone, through a CRM close, or from a Shopify webhook
  • Without offline conversion tracking, ad platforms optimize on incomplete data: they see clicks but not the purchases or deals those clicks eventually produce
  • Facebook's Offline Conversions API and Google's uploadClickConversions API allow you to upload these events hours, days, or weeks after they happen — and the platforms attribute them back to the originating ad click
  • Server-side tracking tools like SignalBridge automate this process for e-commerce: Shopify webhook orders are captured server-side and sent to Meta CAPI and Google Ads API automatically, even when the browser pixel was blocked
  • The most common mistake in offline conversion tracking is missing the click ID (gclid/fbclid) — without it, Google and Meta can't match the offline event to an ad click

What are offline conversions?

Offline conversions are any high-value actions that complete outside of a browser session — purchases made over the phone, deals closed by a sales rep, in-store sales, form submissions converted into customers days later, or Shopify orders created by webhooks rather than browser-initiated checkout flows.

For most e-commerce and lead generation businesses, a significant percentage of their best conversions fall into this category. And if you're not sending these events to your ad platforms, you're optimizing your campaigns on an incomplete dataset — which means your algorithms are making bad decisions with your budget.


Why offline conversions matter for ad optimization

Let's say you run Google Ads campaigns for a kitchen equipment e-commerce store. Your typical customer journey looks like this:

  1. Visitor clicks a Google Shopping ad
  2. They browse products, add to cart, then close the tab
  3. Two days later, they call your customer service line and place the order by phone
  4. The sale closes for $340

With only browser pixel tracking: Google Ads sees a click and no conversion. This click looks like a wasted spend. Your campaign's smart bidding algorithm lowers its bid for similar users.

With offline conversion tracking: Google Ads receives the $340 purchase event, attributed to the original click from two days ago. Smart bidding gets the signal it needs and bids higher for similar high-intent users in the future.

This isn't a niche scenario. For many industries, phone orders and delayed conversions account for 20-50% of total revenue.

The same problem in lead gen

For B2B and service businesses, the gap is even wider:

Ad platform seesReality
340 clicks, 23 form fills340 clicks → 23 form fills → 8 discovery calls → 3 closed deals at $2,400 each
CPA = $29/leadActual cost per closed deal = $3,267 (or lower if attribution is complete)

Without offline conversion data, you're optimizing for "leads" when you should be optimizing for "closed deals." The campaigns bringing in cheap leads might be bringing in unqualified leads, while the campaigns with a higher CPA per form fill might be bringing in leads that close at 3x the rate.


Types of offline conversions to track

Conversion typeSourceHow to track
Phone call ordersCustomer service CRMExport call log with phone numbers → upload to ad platform via hashed phone matching
In-store purchasesPOS systemCapture ad click IDs at digital entry points → upload via Offline Conversions API
CRM deal closesCRM (Salesforce, HubSpot, Pipedrive)CRM integration → send closed-won events via API
Shopify webhook ordersShopify order webhooksShopify webhook → server-side tracking tool → CAPI/Google API
Delayed form-fill conversionsMarketing automationLead created → lead converted → upload conversion event
Subscription activationsBilling platformFirst payment processed → send activation event via API

How offline conversion tracking works technically

The mechanism is the same across all platforms: you capture an identifier at the moment the visitor arrives on your site (their ad click ID), then you send that identifier back to the ad platform when the offline conversion happens.

The click ID is everything

Every ad platform assigns a unique click identifier when a user clicks an ad:

PlatformClick ID parameterWhere it appears
Google AdsgclidURL parameter after click
Meta (Facebook/Instagram)fbclidURL parameter after click
TikTokttclidURL parameter after click
Microsoft AdsmsclkidURL parameter after click

When the user lands on your site, you must capture and store this click ID before the session ends. If the user converts offline days later, you send the stored click ID along with the conversion event — and the ad platform can match the conversion to the original ad click.

This is the most common failure point: If you don't capture and persist the click ID at landing, you can't attribute offline conversions. Even if you send the conversion event with hashed email/phone, without the click ID, the attribution becomes probabilistic rather than deterministic.

How to capture and persist click IDs

Option 1: First-party cookie (recommended)

When a user lands on your site with a gclid parameter:

  1. Your JavaScript reads gclid from the URL
  2. Stores it in a first-party cookie with a 90-day expiry
  3. When an order is placed (browser or server-side), the cookie value is included in the event

This is what SignalBridge's pixel does automatically — it captures gclid, fbclid, and ttclid from the landing URL and persists them in a first-party _sb_params cookie that survives for up to 90 days.

Option 2: URL parameter forwarding

Pass the click ID through every page of your funnel as a URL parameter, including on form fields if you're capturing leads. Store it in your database when the form is submitted.

Option 3: CRM field capture

For lead gen, capture the click ID as a hidden field in every lead capture form. Your CRM stores it alongside the contact record. When the deal closes, you have the click ID for attribution.


Offline conversion tracking with Facebook CAPI

Meta's Conversions API supports offline conversions via the same POST /events endpoint used for standard events. The key difference: the action_source parameter is set to system_generated or app instead of website, and you can send events up to 7 days after they occurred.

What data to send for offline Facebook conversions

For best match quality, include as many of these customer data fields as possible (all hashed with SHA-256):

{
  "data": [{
    "event_name": "Purchase",
    "event_time": 1748000000,
    "action_source": "system_generated",
    "user_data": {
      "em": ["<SHA-256 hashed email>"],
      "ph": ["<SHA-256 hashed phone>"],
      "fn": "<SHA-256 hashed first name>",
      "ln": "<SHA-256 hashed last name>",
      "ct": "<SHA-256 hashed city>",
      "st": "<SHA-256 hashed state>",
      "zp": "<SHA-256 hashed zip>",
      "country": "<SHA-256 hashed country code>",
      "fbc": "_fb.1.1596403881668.AbCdEfGhIjKlMnOpQrStUvWxYz1234567890",
      "fbp": "fb.1.1596403881668.1116446386"
    },
    "custom_data": {
      "currency": "USD",
      "value": 340.00,
      "order_id": "ORDER-2026-4521"
    }
  }]
}

The fbc field is the stored fbclid value formatted as a Facebook click cookie. If you have it, include it — it significantly improves attribution accuracy.

Facebook offline conversion: lookback window

Facebook matches offline conversion events to ad impressions/clicks within:

  • 28 days after a click
  • 1 day after an impression

Events sent outside these windows won't be attributed to specific ads, but they'll still be included in your reporting as general offline events.


Offline conversion tracking with Google Ads

Google's uploadClickConversions API allows you to upload conversions after they happen and attribute them back to the ad click that drove the original visit.

Requirements for Google Ads offline conversions

  1. GCLID capture: You must have the gclid stored from when the user first clicked your ad
  2. Correct conversion action type: The conversion action in Google Ads must be of type UPLOAD_CLICKS — the default "Website" type won't accept API uploads
  3. Timing: You can upload conversions up to 90 days after the click

Creating the right conversion action type in Google Ads

This is a critical step that many setups miss. Here's the correct way to create a conversion action that works with the uploadClickConversions API:

  1. In Google Ads: go to Goals → Conversions → + New conversion action
  2. Select "Conversions offline" as the data source (under "Import")
  3. Choose "Other data sources or CRMs"
  4. Configure your conversion action (name, value, etc.)
  5. Save

Alternatively, create a standard website conversion action but also check "Conversions offline" under Data Sources. This creates a dual-mode action that accepts both webpage tag events and API uploads.

Important: Conversion actions created as "Website (tag-based)" only without "Conversions offline" enabled will return INVALID_CONVERSION_ACTION_TYPE when you try to upload via the API.

Google offline conversion upload format

{
  "conversions": [{
    "gclid": "EAIaIQobChMI4...",
    "conversionAction": "customers/1234567890/conversionActions/9876543210",
    "conversionDateTime": "2026-05-23 14:30:00+00:00",
    "conversionValue": 340.00,
    "currencyCode": "USD",
    "orderId": "ORDER-2026-4521"
  }]
}

The orderId field serves as a deduplication key — if you upload the same order twice, Google will count it only once.

Google offline conversion: lookback window

Google Ads attributes offline conversions to clicks within:

  • 90 days for most conversion types
  • 30 days for calls from ads

The e-commerce specific case: Shopify webhook orders as offline conversions

For Shopify stores, the most impactful offline conversion scenario isn't phone orders or in-store sales — it's the gap between browser pixel events and actual Shopify orders.

Here's what happens frequently:

  1. Customer clicks a Facebook ad, lands on your Shopify store
  2. Customer completes checkout, but their ad blocker blocks the Facebook Pixel purchase event
  3. Shopify's orders/paid webhook fires (server-side)
  4. If you have server-side tracking, this webhook is captured and sent to Meta CAPI as a Purchase event with the stored fbclid from the customer's cookie

This is the most valuable offline conversion tracking for most Shopify stores: capturing the $50, $150, or $500 purchase events that browser pixels are missing for 25-40% of customers.

How SignalBridge handles Shopify offline conversions

SignalBridge integrates with Shopify webhooks to automatically capture orders/paid events and send them to Meta CAPI, Google Enhanced Conversions, and TikTok Events API — with the customer's click IDs and hashed personal data for maximum match quality.

The flow:

  1. Customer clicks a Facebook ad (SignalBridge pixel captures fbclid in first-party cookie)
  2. Customer purchases (browser pixel fires if not blocked, with event_id for deduplication)
  3. Shopify orders/paid webhook fires → SignalBridge receives it server-side
  4. SignalBridge looks up the customer's stored fbclid and customer data
  5. Sends the enriched Purchase event to Meta CAPI with event_id for deduplication
  6. Meta counts the event once (deduplicates browser pixel + CAPI if both arrived)

Step-by-step: implementing offline conversion tracking

Step 1: Capture and store click IDs

Before you can upload offline conversions, you must capture click IDs when visitors land on your site from ad clicks.

For browser-based capture:

// Capture click IDs from URL parameters and store in first-party cookies
function captureClickIds() {
  const params = new URLSearchParams(window.location.search);
  const clickIds = {
    gclid: params.get('gclid'),
    fbclid: params.get('fbclid'),
    ttclid: params.get('ttclid'),
    msclkid: params.get('msclkid'),
  };
  
  Object.entries(clickIds).forEach(([key, value]) => {
    if (value) {
      // Store with 90-day expiry
      document.cookie = `${key}=${value}; max-age=${90 * 24 * 60 * 60}; path=/; SameSite=Lax`;
    }
  });
}

captureClickIds();

For server-side tools (SignalBridge): The pixel handles this automatically and persists it in the _sb_params first-party cookie.

Step 2: Pass click IDs through your conversion flow

Every conversion point (checkout, form, CRM) needs access to the stored click IDs.

For Shopify:

  • At checkout, read the cookie and store the click ID in order notes or metafields
  • Or let your server-side tracking tool pull it from the customer's cookie automatically

For lead gen forms:

  • Add a hidden input field populated from the cookie:
<input type="hidden" name="gclid" id="gclid_input">
<script>
  const gclid = document.cookie.match(/gclid=([^;]+)/)?.[1];
  if (gclid) document.getElementById('gclid_input').value = gclid;
</script>

Step 3: Store click IDs with conversion records

When a conversion happens (order placed, lead submitted, deal closed):

  • Store the click ID(s) in your database alongside the conversion record
  • Store the timestamp of the original click (for attribution window checks)
  • Store hashed customer data: email, phone, name

Step 4: Send conversions to ad platforms

For Meta CAPI:

curl -X POST \
  "https://graph.facebook.com/v18.0/{pixel-id}/events?access_token={token}" \
  -H "Content-Type: application/json" \
  -d '{
    "data": [{
      "event_name": "Purchase",
      "event_time": '"$(date +%s)"',
      "action_source": "system_generated",
      "user_data": {
        "em": ["<sha256-hashed-email>"],
        "fbc": "<stored-fbc-value>"
      },
      "custom_data": {
        "value": 340.00,
        "currency": "USD",
        "order_id": "ORDER-2026-4521"
      }
    }]
  }'

For Google Ads: Use the ConversionUploadService API.

For automated platforms (like SignalBridge): Shopify webhooks are sent to the platform, which handles API delivery to all connected platforms automatically.

Step 5: Verify attribution

After uploading, verify attribution in each platform:

  • Meta Events Manager: Check the offline events dataset for delivery status and match quality
  • Google Ads: Under Conversions, check for "Imported" conversions with Upload source
  • Lookback period: Allow 24-72 hours for conversions to appear in your reports

Common offline conversion tracking mistakes

Mistake 1: Not capturing click IDs on landing

The most common failure. If the gclid or fbclid isn't captured when the user arrives, no amount of customer data matching will attribute the offline conversion as accurately. Fix: implement click ID capture on page load, before the user navigates away.

Mistake 2: Uploading conversions after the attribution window

Google allows uploads up to 90 days after the click; Meta allows up to 28 days. If you batch-upload old data outside these windows, it won't be attributed to specific ads.

Mistake 3: Using the wrong conversion action type (Google)

Uploading to a "Website (tag-based)" conversion action via the API returns INVALID_CONVERSION_ACTION_TYPE. Always use UPLOAD_CLICKS type or a dual-mode action.

Mistake 4: Deduplication failures

If you run both browser pixel and server-side tracking, ensure your offline conversion events use the same event_id format as your online events, or use a distinct order_id as the dedup key. Without deduplication, a single purchase appears twice in your platform reports.

Mistake 5: Sending data without proper hashing

All personal data sent to ad platforms (email, phone, name, location) must be SHA-256 hashed. Sending raw email addresses violates platform terms of service and privacy regulations.


Offline conversion tracking by business type

E-commerce (Shopify/WooCommerce)

Primary use case: Capture Shopify webhook orders that the browser pixel missed due to ad blockers or iOS restrictions.

Setup: Server-side tracking tool (SignalBridge) connected to Shopify via webhook. Click IDs captured on landing page via first-party cookie.

Events to track: Purchase (Shopify order paid), optionally InitiateCheckout (Shopify checkout started)

Lead Generation (B2B/Services)

Primary use case: Track which ads ultimately produce qualified leads, discovery calls, and closed deals — not just form fills.

Setup:

  1. Capture gclid/fbclid on landing page → store with form submission
  2. CRM integration: when lead is qualified, send Lead event to Meta CAPI
  3. When deal closes, send Purchase or CompleteRegistration event with deal value

Events to track: Lead (qualified), CompleteRegistration (demo booked), Purchase (deal closed with value)

Omnichannel Retail (online + in-store)

Primary use case: Close the loop on customers who clicked an online ad and later bought in-store.

Setup: Capture click IDs online → when customer registers loyalty card or provides email at POS, match POS purchase to stored click ID via hashed email → upload to ad platforms.

Events to track: Purchase (in-store sale matched to online click)


FAQ

What are offline conversions in Google Ads?

Offline conversions in Google Ads are conversion events — purchases, leads, calls, or other actions — that happen outside of a browser session but can be attributed back to an ad click. Google's uploadClickConversions API allows you to upload these events with the original gclid (Google Click ID) from when the user first clicked your ad, so Google can attribute the conversion to the correct campaign, ad group, and keyword.

How do you track offline conversions in Facebook Ads?

Facebook's Conversions API (CAPI) supports offline conversions via its standard events endpoint. You send conversion events with the original fbclid or fbc cookie value and hashed customer data (email, phone, name). Facebook matches the event to the original ad click within a 28-day click window. For Shopify stores, server-side tracking tools automate this by connecting Shopify orders/paid webhooks to CAPI.

Do I need a gclid to upload Google offline conversions?

Yes. The gclid is required for click-attribution offline conversions in Google Ads. Without it, Google can't match the conversion to a specific ad click. You can use Enhanced Conversions (hashed email/phone matching) as a fallback, but deterministic attribution requires the gclid. Always capture and store the gclid from landing page URL parameters.

How long after an ad click can I upload an offline conversion?

Google Ads allows uploads up to 90 days after the ad click. Meta allows up to 28 days after a click (or 1 day after a view). Events uploaded after these windows are accepted by the API but won't be attributed to specific ads.

How is offline conversion tracking different from server-side tracking?

Server-side tracking sends events to ad platforms from your server instead of the visitor's browser — in real time or near-real time. Offline conversion tracking is specifically for events that happen outside of any browser session (phone calls, in-store purchases, CRM closes) and are uploaded in batch or via API after the fact. In practice, server-side tracking with tools like SignalBridge handles both: real-time server-side events AND Shopify webhook events (which are effectively offline since the Shopify order is created by a server-side process).

Can I track offline conversions for TikTok Ads?

Yes. TikTok's Events API supports offline conversions. You send events with the stored ttclid (TikTok click ID) from the user's landing page visit and hashed customer data. TikTok has a 28-day attribution window for clicks. The setup is similar to Meta CAPI — capture the ttclid on landing, store it with conversion records, and send via the Events API when the conversion occurs.

Ready to recover more conversions?

Start tracking what your pixels miss. Set up in 5 minutes, no credit card required.

Start Free Trial