Skip to content

Start typing to search the blog.

Subscription CAPI for Shopify: Recharge and Skio Tracking Guide

Recharge and Skio renewals skip the browser pixel. Learn how to send Shopify subscription Pulses via Meta CAPI server-side and fix identity and deduplication.

Updated

Shopify subscriptions with Recharge and Skio break Meta CAPI tracking at the point that matters most, the renewal. The first order behaves like any Shopify purchase and can fire a browser pixel at checkout, but every renewal after that is an off-session charge with no buyer in a browser, no pixel to fire, and often thinner customer identity than the initial checkout. Without a server-side Path, those renewals never reach Meta or Google as Pulses, so reported purchases fall short of Shopify orders and the algorithm optimizes on a shrinking share of revenue. This guide shows how subscription Pulses differ from storefront Pulses, why Recharge and Skio need server-side delivery, and how to fix identity and deduplication so recurring revenue is counted correctly. The complete Shopify conversion tracking guide frames where subscriptions sit in a healthy tracking stack; this guide covers the subscription-specific gaps.

The Quick Answer

Send every Shopify subscription renewal as a server-side Pulse through Meta CAPI and Google Ads, not through the browser pixel. Recharge and Skio create renewal orders in Shopify without a shopper session, so the only reliable capture point is the Shopify orders/create webhook on the server, enriched with email, phone, fbp, fbc, and a stable event ID, then delivered to each Channel with correct hashing and deduplication. Generate one deterministic event ID per renewal order and reuse it across any retry, use the same transaction ID for Google Ads, and verify Clarity Score and Match Strength per Channel on the Overview. Do this and recurring purchases that were invisible to the pixel become counted Pulses that feed optimization.

What Shopify Subscriptions Do to Tracking

A Shopify subscription is not one purchase. It is an initial purchase plus a series of renewal orders that Shopify creates on a schedule. Apps like Recharge and Skio manage the schedule, the price, the renewal timing, and the customer portal, but the order itself is a standard Shopify order once it is created. That distinction decides how tracking should work.

On the initial checkout, the buyer is present in a browser. The store can collect email, phone, address, browser ID, and click ID in the same way as any one-time purchase. The Facebook pixel can fire, a server Pulse can be sent, and Meta can deduplicate the pair with a shared event ID as described in what Meta CAPI is.

On renewal, the buyer is not present. Recharge or Skio charges the stored payment method off-session and creates a new Shopify order without a page view, without a checkout form, and without a pixel firing environment. There is no browser ID for that moment and no fbc from a click. The only data available is what Shopify and the subscription app already store: email, phone, shipping address, and whatever browser identifiers were saved from the original checkout.

This is why subscription stores report a persistent gap between Shopify orders and Meta purchases even after they have fixed storefront tracking. The initial order is counted, the renewals are not, and as the subscriber base grows, the share of revenue coming from renewals rises. A store with thirty percent of monthly revenue from renewals that does not send renewal Pulses is missing nearly a third of its true conversion volume in the ad platform, before any browser-level loss is considered.

Why It Matters for Your Shopify Store

Missing renewal Pulses distorts every decision downstream of the ad account.

First, return on ad spend looks worse than reality or better than reality depending on which orders are counted. If Meta sees only initial subscription purchases and not the renewals those purchases generate, the value Meta attributes to the ad that acquired the subscriber is understated. The store under-invests in acquisition that is actually profitable over the full subscription lifetime. If the store later adds renewal tracking without deduplication controls, the same order can be double counted and the opposite error appears. Julian Juenemann of MeasureSchool has noted that client-side pixel loss of forty to sixty percent is already common for standard Shopify traffic, and Meta Business Engineering has documented that server-side CAPI can recover thirty to sixty percent of conversions the pixel misses. Subscriptions add a second layer of loss on top of that baseline because renewals skip the browser entirely.

Second, audience and creative optimization degrades. Meta and Google learn from the purchase signal they receive. When renewals are absent, the system learns from initial purchases only, which are a different population than renewing subscribers. Creatives and audiences that drive high-quality subscribers with strong renewal behavior receive no extra credit, and the system shifts budget toward one-time buyers who look identical on the first order. Over a quarter, the drift compounds.

Third, lifecycle metrics lose their anchor. Stores that measure cohorts, churn, or lifetime value from Shopify but report campaign performance from the ad platform are comparing two data sets with different completeness. The Hawklists Overview makes the gap visible because Clarity Score shows delivered Pulses per Channel and the Stream preserves per-order identity, so a renewal that arrives without phone or browser ID is flagged as a Missed window rather than silently counted as a low-value conversion.

For stores spending two thousand dollars or more per month on Meta or Google, the error is material on the first renewal cycle and grows with subscriber count. A subscription catalog with five hundred active subscribers renewing monthly at fifty dollars creates twenty-five thousand dollars in monthly recurring revenue that never touches a browser. If none of that revenue is sent as a Pulse, the ad platforms optimize as if it does not exist.

Root Cause 1: Renewals Are Off-Session With No Pixel

The most direct cause of missing subscription Pulses is that renewal orders have no browsing context.

Recharge and Skio both operate by storing the payment method and schedule at the time of the first order, then triggering a charge at the start of each billing period. Recharge Product Documentation describes renewals as scheduled charges that create Shopify orders via the Shopify API, and Skio describes the same pattern through its subscription engine that syncs with Shopify checkout and the customer portal. In both cases, the renewal is a server-to-server creation between the subscription app and Shopify, not a shopper clicking through a cart.

Because there is no shopper session, there is no opportunity for the Facebook pixel or Google tag to fire. The browser ID that exists for the initial checkout is not present at renewal time unless the integration explicitly saved it from the original session and reattaches it to the renewal Pulse. The click ID from the ad that acquired the subscriber is also not present at renewal unless it was stored. Even when those values were stored, they refer to a click that may be days or weeks old, which changes how matching should be evaluated.

The fix is not to try to fire a pixel at renewal. The fix is to treat every renewal as a server Pulse from the beginning. Capture the Shopify orders/create webhook for orders that Recharge and Skio mark as subscription renewals, enrich the order with stored customer identity, generate a stable event ID from the order ID, and deliver the Pulse to Meta CAPI and to the Google Ads Channel. The Channel delivery is server-to-server HTTPS, so it does not depend on a browser, on App Tracking Transparency consent, or on Safari Intelligent Tracking Prevention. The same path that protects storefront Pulses from ad blockers protects renewal Pulses from the absence of a browser altogether.

A common mistake is to rely on the subscription app pixel or thank you page extension that fires only on the initial subscription checkout. That covers the first eighty percent of the problem and leaves the recurring eighty percent of volume where the pixel has no page to run on. Measure the gap by comparing Shopify orders tagged as subscription renewal against Meta reported purchases for the same period. If the renewal orders are absent in Ads Manager, the capture point is wrong.

Root Cause 2: Identity Gaps at Recurring Checkout

A renewal Pulse that is delivered but carries weak identity is delivered without value. Match Strength, the share of Pulses Meta successfully matches to a known user, depends on completeness of customer information parameters, and renewals are where that completeness degrades.

At initial checkout, a Shopify store collects email, phone, address, and the browser ID and click ID from the pixel. A complete Pulse can include all of those fields, hashed with SHA-256 and normalized to E.164 for phone, which is what Meta Business Engineering documentation lists as the identity inputs for CAPI matching. A Pulse with email plus phone plus browser ID can reach Match Strength near ninety percent in a healthy setup.

At renewal, the subscription app may not forward all of those fields to the Shopify order. Recharge and Skio both store email and phone from the original checkout, but the renewal order that Shopify creates may not carry the original fbp or fbc unless the store saved them as customer metafields or order attributes at subscription creation. Many stores learn this only after they see renewal Pulses arriving with email only and a Match Strength that sits in the fifty to sixty percent range even though Clarity Score for the Channel is near one hundred percent. The Channel shows delivery, Match Strength shows the identity inside the delivery was thin.

Phone is the highest-impact field to preserve. Because phone numbers change less often than email addresses and are more likely than any other field to be associated with a Facebook account, a renewal Pulse that includes phone matches at a meaningfully higher rate than one that includes email alone. Address fields help, but phone and email together drive most of the lift. The Google Ads Developer Documentation shows the same pattern for enhanced conversions: hashed email and phone are the primary keys Google uses to match a renewal Pulse to a Google Account user, so a renewal without phone underperforms on both destinations.

The second gap is the browser ID. The browser ID links the original browsing session to the buyer. If the store captured fbp at initial checkout and stored it on the customer or subscription record, the renewal Pulse can reattach that original fbp even though there is no current browser. This gives Meta a stable device link across the initial and recurring phases. Stores that do not save fbp at subscription creation have no way to reattach it at renewal, and the Match Strength ceiling for renewals is permanently lower. The Stream in a signal layer surfaces this directly: Pulses that lack fbp or phone are flagged, and the Hawk assistant surfaces the Missed window where identity could have been preserved but was not carried forward.

The operational remedy is to audit what Recharge and Skio write onto the Shopify order at renewal and what the store saves at initial subscription creation. Confirm that email and phone flow from the subscription record onto the renewal order, that the original fbp and fbc are stored as attributes on the customer or subscription, and that the renewal Pulse reuses those stored values. The fix is data carry-through, not more collection, because the renewal has no form to collect from.

Root Cause 3: Deduplication Across First Order and Renewals

Subscriptions create two deduplication problems at once, one classic and one subscription-specific.

The classic problem is the same as any Shopify purchase that is sent through both the browser pixel and CAPI for the initial order. As detailed in the guide to cross-channel Pulse deduplication, Meta expects a shared event ID and event name across the browser and server representations of the same purchase and will count them as two conversions if the IDs diverge. For the initial subscription purchase, generate one deterministic ID such as shopify_10842_purchase and send that identical ID and the name Purchase in both the pixel and the CAPI payload within roughly forty-eight hours. This prevents double counting of the initial order in the same way as a one-time purchase.

The subscription-specific problem is that renewals must not deduplicate against the initial order and must not deduplicate against each other. Each renewal is a distinct Shopify order with its own order ID, its own value, and its own event time, and it must be counted as its own Pulse. If the store generates an event ID from the subscription ID alone without the order ID, every renewal for the same subscription will share one ID and Meta will collapse separate months of revenue into one conversion. If the store generates an event ID from order ID but reuses the initial order ID for a renewal retry, a failed CAPI request that retries with a new ID becomes a second counted purchase.

The correct pattern is to generate the CAPI event ID and the Google transaction ID from the Shopify order ID of the renewal itself, not from the subscription ID and not from the customer ID. For Meta, that is shopify_{order_id}purchase as event_id with event_name Purchase and event_time set to the renewal order creation time. For Google Ads, that is the same shopify{order_id} value as transaction_id with conversion time set to the same creation time. Both values must be deterministic so any retry after a timeout or any replay from the Stream reuses the identical string. Google Ads Developer Documentation describes the transaction ID as the dedup key for enhanced and offline conversions for forty-five to sixty-three days, and Meta Business Engineering describes the event ID and name pair as the dedup key for roughly forty-eight hours within one platform. Keeping the ID per order satisfies both windows without conflating separate renewals.

Verify the ID survives checkout extensibility changes and subscription portal edits. A Recharge or Skio portal update that alters how order attributes are written can silently drop the event ID or transaction ID even though the order still creates. Confirm after any portal or checkout change that a test subscription renewal Pulse and the renewal order share the identical ID and that the Stream shows one Pulse per renewal order, not zero and not two.

How Hawklists Handles Subscription Pulses

Hawklists is a Shopify signal layer that captures Pulses at the Shopify order confirmation point and delivers each Pulse to connected Channels, Meta CAPI and Google Ads, over server-to-server connections. The path is the same for a one-time purchase and for a renewal order created by Recharge or Skio: when Shopify creates the order, the orders/create webhook fires, the order is captured, enriched with available customer identity data, assigned a stable event ID derived from the order ID, and delivered to each Channel with the correct hashing and formatting.

For Meta CAPI, that means the server Pulse carries the customer information parameters Meta uses for matching, hashed with SHA-256, with phone normalized to E.164, and with the browser ID and click ID reattached when those values were stored from the initial checkout and carried onto the renewal order. The external event ID is set deterministically from the order ID so the pixel and CAPI pair for the initial subscription order deduplicates correctly and so retries for the same renewal reuse the same key rather than creating a second counted Pulse.

For Google Ads, the same order ID is sent as the transaction identifier with each Pulse delivered to the Google Ads Channel, consistent with the enhanced conversions pattern for hashed customer data. The value remains stable over retries and over the adjustment window so a second arrival for the same order is recognized as a replay rather than a new buyer.

Two practical details matter for subscription stores. First, Hawklists preserves the shared ID when an order is updated, refunded, or re-imported, so an edited renewal does not generate a second live Pulse with a new key. Second, the per-Channel Clarity Score on the Overview reflects delivered Pulses without inflating the count for duplicates Meta or Google merged, and Match Strength reflects identity completeness after delivery. When the Hawk assistant flags a rise in Missed windows or a divergence between Shopify renewal orders and reported purchases for a Channel, the first check is whether the renewal order carried email and phone and whether the original browser ID was available to reattach. The benefit is not a new channel type. It is that every order, including off-session renewals, produces one logical Pulse and that one logical Pulse is what each Channel counts.

Hawklists today is built for Signals and Pulses at Shopify order confirmation, and recurring subscription orders are Shopify orders. Merchants using Recharge or Skio should still verify that their subscription app writes the identity fields the store expects onto each renewal order and that their theme or checkout extensibility changes have not altered what is stored at subscription creation. The Channel mechanics handle delivery. The store owns the carry-through of identity from the initial checkout to the renewal record.

Step-by-Step Fix for Recharge and Skio

  1. Map the order flow. In Shopify, filter orders by source and tag to identify which orders are initial subscription purchases and which are renewals from Recharge and Skio. Confirm that every renewal creates a standard Shopify order with an order ID, a creation timestamp, and customer contact fields. If a renewal does not create a Shopify order, it cannot produce a Pulse and the subscription app configuration needs correction before any tracking change.

  2. Save identity at subscription creation. At the point a shopper creates a subscription, capture email, phone, first and last name, and the Facebook browser ID and click ID from the pixel, and store them as customer metafields or subscription attributes that Recharge and Skio preserve. Confirm those fields are present on a test subscription before worrying about renewal delivery. A renewal cannot carry identity that was never saved.

  3. Verify identity carries to renewal orders. Create a test renewal or wait for the next scheduled charge and open the renewal order in Shopify. Check that email and phone from the subscription record appear on the order, and that the stored browser ID and click ID were written as order attributes. If the renewal order lacks phone or the browser ID, adjust the Recharge or Skio Shopify sync so those fields copy from the subscription to the order on creation.

  4. Set the capture point to orders/create. Configure Pulse capture to fire on the Shopify orders/create webhook rather than on a page view or checkout thank you page. This is the only point that runs for off-session renewals. Confirm a test renewal order triggers the same capture as a storefront order and appears in the Stream with the correct order value and currency.

  5. Generate deterministic IDs per renewal. For each order, generate one event ID from the order ID, for example shopify_{order_id}_purchase, and use that identical string as event_id for the Meta CAPI Pulse and as transaction_id for the Google Ads Pulse. Set event_name Purchase and event_time to the order creation time in both. Reuse the same string on any retry so a timeout does not create a second counted conversion.

  6. Deliver to each Channel with correct formatting. Send the renewal Pulse to Meta CAPI with customer information parameters hashed with SHA-256 and phone in E.164, and to Google Ads with the same hashed identity. Confirm each Channel receives the Pulse independently and that Clarity Score per Channel increments for the renewal.

  7. Verify deduplication for the initial order. For the initial subscription purchase only, confirm the browser pixel Purchase event and the server CAPI Pulse share the same event ID and name. Fire a test initial subscription purchase, read the pixel eventID and the Stream Pulse event_id, and confirm they are identical. Renewals should have no browser event to deduplicate against, only the server Pulse.

  8. Reconcile per Channel and per type. For one week, compare Shopify orders split into initial and renewal against Meta reported purchases and Google reported conversions for the same dates. Each Channel should track close to Shopify totals for its destination when IDs and identity are correct. Investigate any Channel where renewal orders are present in Shopify but absent or double counted in the platform. The comprehensive guide to Shopify signal recovery provides the wider recovery checklist this subscription check feeds into, and the clarity score guide shows how to read delivery health per Channel after renewal Pulses are live.

Diagnosing With Clarity Score and Match Strength

Clarity Score and Match Strength answer two different questions, and subscriptions expose the difference clearly.

Clarity Score measures delivery: what share of Pulses sent from the server were confirmed received by each Channel. The score is a composite of ID Completeness at forty percent, Match Quality at thirty percent, Window Status at twenty percent, and Validation at ten percent, with seventy-five or higher considered healthy and below sixty indicating revenue is being lost before the platform can optimize. For subscriptions, read Clarity Score per Channel and split the Stream by order tag so renewal Pulses are visible separately from initial purchase Pulses. A healthy Clarity Score on both Meta and Google for renewals means delivery for off-session orders is intact. A low score on one Channel with a healthy score on the other points to credentials, hashing, or schema for that destination, not to the subscription app.

Match Strength measures identity: what share of delivered Pulses Meta matched to a user. A renewal Pulse can have a Clarity Score of ninety-eight percent and a Match Strength of fifty-five percent, which means the Channel received the renewal but could not tie it to a Facebook user because the identity inside the Pulse was thin. For subscriptions, the expected pattern is that Match Strength for renewals trails Match Strength for initial orders by some gap because the renewal has no current browser context. The fix that moves Match Strength for renewals is carrying phone and the original browser ID onto the renewal order. Track Match Strength for initial purchases and renewals separately if your signal layer exposes that split in the Stream, or export a week of Pulses and compute the share that carried phone and browser ID. The movement of that share predicts the movement of Match Strength.

When either metric dips after a store change, match it to the timeline of the last subscription portal edit, checkout extensibility update, or theme release. The guide to Match Strength on Meta Ads details the identity fields in priority order, and the most common subscription-specific dip is a portal change that stopped writing the stored browser ID onto renewal orders.

Common Pitfalls for Subscription Stores

Checkout extensibility overwrites stored attributes. Shopify checkout extensibility and thank you page extensions can change what order attributes survive from subscription creation to renewal. After any checkout change, fire a test subscription and a test renewal and confirm the stored browser ID, click ID, and phone still land on the renewal order. A silently dropped attribute after a theme change is the most common way renewal Match Strength falls.

Shopify Markets splits the identity. Stores that sell subscriptions in multiple markets may collect phone in national formats. The Pulse requires E.164 normalization before hashing, so a phone that is correct for shipping but not normalized for CAPI will fail to improve Match Strength. Normalize at capture and confirm the hashed value is derived from the E.164 form.

Portal edits that create orders without identity. Recharge and Skio both allow subscribers to update their subscription in the customer portal, which can trigger a prorated charge or a new order. Those orders must carry the same identity enrichment as a scheduled renewal, with the same deterministic event ID generated from the order ID. Audit portal-initiated orders separately from schedule-initiated renewals.

Treating renewals as attribution clicks. A renewal is not a new ad click. Do not fabricate a click ID at renewal time to improve matching. Reattach the original click ID that was stored at acquisition if it is available and let Meta score the match on identity completeness rather than on a synthetic click. Fabricated click IDs create validation failures that reduce Validation inside Clarity Score.

Summing Meta and Google and comparing to Shopify. As with any cross-channel Pulse, do not sum Meta purchases and Google conversions and compare the sum to Shopify renewal orders. Compare each Channel separately to Shopify for the same date range. The same renewal order legitimately counted once in Meta and once in Google will look like a duplicate if the two totals are summed.

FAQ

Do Recharge and Skio renewals fire the Facebook pixel? No. Renewals are off-session charges where the subscription app creates a Shopify order without a shopper in a browser. There is no page for the pixel to run on. Renewals must be sent as server Pulses through Meta CAPI and through Google Ads to be counted.

Why does Meta show fewer purchases than Shopify for my subscription store? Because the store sends a browser event for initial purchases but not a server Pulse for renewals, or sends renewal Pulses without complete identity so they do not match to a user. Moving renewal capture to the Shopify orders/create webhook, carrying phone and stored browser ID onto the renewal order, and delivering to CAPI with a stable event ID closes the gap.

How should I deduplicate subscription Pulses? Generate one deterministic event ID per Shopify order from the order ID and reuse it across the browser and server pair for the initial purchase and across any retry for renewals. Use that same order-derived value as the transaction ID for Google Ads. Do not reuse the subscription ID across different renewal orders, or separate months will collapse into one conversion.

Does sending renewal Pulses require a different Channel? No. The Channel is the same Meta CAPI Channel and the same Google Ads Channel used for storefront purchases. What changes is the capture point and the identity carry-through onto the renewal order, not the destination.

What is the quick health check after I enable subscription CAPI? Watch Clarity Score per Channel for delivery and Match Strength for identity. A healthy setup shows Clarity Score at seventy-five or higher for renewal orders and Match Strength improving as phone and browser ID coverage on renewals rises. If Clarity Score is healthy but Match Strength is low, the gap is identity on the renewal order. If both are low, the gap is delivery or credentials for that Channel.

Does Hawklists already handle Recharge and Skio renewals? Hawklists captures Pulses at Shopify order confirmation and delivers them to Meta CAPI and Google Ads, and renewal orders from Recharge and Skio are Shopify orders that flow through that same capture point. Stores should still verify that Recharge and Skio write the identity fields the Pulse needs onto each renewal order and that any checkout extensibility or portal change has not removed the stored browser ID or phone.

Related topics

Blessy Livingstone

Content Strategist at Hawklist

Blessy Livingstone is a content strategist at Hawklist. She writes and edits the guides and articles on Shopify conversion tracking, signal recovery, and ads optimization, working from research and interviews with practitioners rather than personal claims of platform expertise. Her background is in B2B content strategy and long-form writing, and she focuses on keeping technical topics clear, accurate, and useful for store owners.

B2B content strategyEditorial and research
On this page