I start with three questions. Did money change hands? What kind of order was it? What decision will the destination make from the event?
Those questions can have different answers. A renewal can be a valid sale and still be the wrong signal for a campaign whose job is to acquire new customers.
What is a renewal in Shopify order data?
For this guide, a renewal is a later paid recurring purchase under an existing subscription contract. I distinguish the order from the attempt to bill it and from the first order that established the subscription.
Shopify’s SubscriptionContract exposes originOrder, the order from which the contract originated, and orders, its associated orders. A successful SubscriptionBillingAttempt creates an order; attempts use idempotency keys to prevent duplicate order creation. Sources: contract, billing attempt.
I compare the origin order, later contract orders and billing/payment evidence before assigning a renewal label. Contract access is scoped: Shopify documents read_own_subscription_contracts or the write equivalent for the contract. I do not assume an unrelated tracking integration can read every contract.
If the needed evidence is unavailable, I ask for an authorised export or a documented mapping from the subscription system and retain an unknown category. I would not promote an order tag, source label, selling-plan presence or old click into a universal renewal detector without verifying the mapping.
An existing customer can start a new subscription. That is a subscription start, but it is not necessarily a first customer purchase. Likewise, a retry of one billing operation is not a new renewal sale. I reconcile the resulting order and payment once. Prepaid fulfilments, migrations and mixed baskets need explicit inclusion rules before they enter a purchase feed.
How do I separate first orders from renewals?
I keep order type and customer history in separate fields. The classification is attached to the event’s order, so a later change in customer status does not rewrite the meaning of an earlier purchase.
Hypothetical example. The following labels are a proposed internal schema, not Shopify fields or completed client work. No events from this example were sent to an ad platform.
Comparison table — scroll horizontally to see all columns
| Evidence for the order | Internal order type | Customer classification | Purchase eligibility |
|---|---|---|---|
| Paid origin order; no earlier qualifying purchase in the agreed history | subscription_start | new | Eligible under the agreed revenue rule |
| Paid origin order; customer already bought before | subscription_start | returning | Sale, but not a first customer purchase |
| Later contract order; successful recurring billing/payment evidence | subscription_renewal | returning | Eligible renewal revenue; acquisition inclusion decided separately |
| Failed billing attempt; no completed paid order | No new paid order | Unchanged | No purchase for the failed attempt |
| Subscription evidence incomplete | unknown | unknown if history is also incomplete | Hold for classification or report the uncertainty |
The ledger I would inspect contains the order key, contract relationship where available, payment state, order type, customer classification, amount convention, currency, event time, consent eligibility and destination delivery state. For click data I also need provenance and capture time. These are audit fields, not instructions to send the entire ledger to every platform.
Should a renewal be a GA4 purchase?
If the measurement plan covers eligible paid revenue, I would include paid renewals as purchase and classify them separately. If the plan covers only first orders, I would document that exclusion so nobody treats the total as all Shopify revenue.
Google’s ecommerce guide defines the purchase payload, including transaction_id, value, currency and items. I use a distinct transaction key for each distinct paid order, then reuse that key for copies of that order. Reusing the original order’s key for later renewals can collapse separate purchases: GA4 documents purchase deduplication by transaction ID for web streams. Sources: ecommerce, transaction IDs.
My proposed order_type parameter needs an event-scoped custom dimension for reporting in GA4. It is my schema, not an automatically supplied renewal dimension. Source: custom dimensions.
An automatic rebill needs a verified collection path; I would not assume a browser checkout event covers it. Google’s Measurement Protocol can send server and offline interactions, but Google describes it as a supplement to gtag, Tag Manager or Firebase collection. Events sent only through it may get partial reporting. I would check its requirements for the intended use rather than invent a checkout session or a new ad click for the rebill.
Should a renewal be a Meta Purchase?
A real, eligible paid renewal can be sent for a revenue or retention measurement goal. I would not mix it into a first-customer acquisition signal without checking the campaign’s selected event and the actual distinction available in that setup.
Meta’s server-event documentation explicitly gives automatic subscription renewals as an example of action_source: system_generated. It also states that all action sources support ad optimisation. This field describes where the action occurred; it does not exclude renewals from bidding. event_time must describe when the actual event occurred. Meta rejects the whole request if any event_time is more than seven days old, so a delayed renewal feed has to send within that window. Source: server event parameters.
If browser and server describe the same purchase, their event ID and event name must match for the recommended deduplication method. A later renewal is a different purchase and needs its own event identity. Source: deduplication.
I would agree a supported separation of the acquisition signal before enabling it. A custom order label alone is not proof that the campaign excludes renewals. I would not relabel an automatic charge as a fresh website checkout, reset its timestamp to the original purchase, or fabricate a new click identifier.
Should a renewal be a Google Ads conversion?
For acquisition-only bidding, I would keep automatic renewals out of the selected acquisition goal. For a revenue or retention goal, including them may be intentional, but the order scope and conversion value rule must be written down.
Google Ads documents primary actions as bidding inputs when their standard goal is selected. Secondary actions are normally observation-only in “All conversions”; a custom goal can use a secondary action for bidding. I check campaign goals as well as the primary/secondary label. Source: conversion actions.
Google documents new_customer for the Google Ads tag and customer_type for the Analytics tag. Those classifications depend on the stated purchase-history window; they are not a generic renewal flag. I map my verified customer history to the chosen route, retaining uncertainty when the history is incomplete. Source: acquisition parameters.
I also check whether a native purchase action and a GA4-imported action describe the same order. I would not make both acquisition bidding signals by accident. The Google Ads conversion-source guide covers that choice.
What can go wrong even when events arrive?
Receipt proves delivery to a destination. It does not establish the order classification, absence of duplicates, campaign inclusion or causal impact of an ad. I check those layers separately.
Comparison table — scroll horizontally to see all columns
| Risk | What I would inspect |
|---|---|
| Renewal reported as a newly acquired customer | Contract/payment evidence and the purchase-history rule |
| Original click copied onto later orders | Capture time, provenance and the destination’s attribution window |
| One order sent twice | Sender retries, transaction/event keys and all delivery routes |
| Different renewals share one event key | Order-to-event mapping, not just aggregate totals |
| Sender silently stops | Arrival checks split by order type, with a named alert owner |
| Renewal excluded from revenue without explanation | Written purchase scope and reconciliation categories |
| Server route bypasses consent or sends unnecessary data | Eligibility checks and destination data rules |
This covers technical implementation, not legal advice. I would not treat a server-side route as permission to send data that the agreed consent and platform rules exclude.
The subscription renewal audit situation describes the diagnostic scope. The related case about 67 days without GA4 purchases records an audit, old identifiers on renewals and gaps in new-order evidence. The rebuild did not proceed. I am not presenting this guide as its implementation or claiming recovered purchases.
Click age is useful diagnostic evidence in that case. In a new implementation, I would first establish order type from subscription and payment evidence, then inspect click identifiers and the attribution window. An old identifier alone neither classifies a renewal nor proves current attribution credit.
What would I accept before release?
I would reconcile a permitted test set by order type, then inspect each destination’s received events and conversion scope. This is a proposed acceptance plan; I have not run live GA4, Meta or Google Ads renewal tests for this guide.
Use a first subscription order, a paid renewal, a returning customer’s new subscription, a failed attempt, a repeated delivery and an order with incomplete evidence. For each, record the expected purchase decision, event key, value convention and customer classification. Check received events, duplicate handling, report segmentation and the campaign’s selected goal separately. Record exclusions and unresolved cases.
The tracking audit checklist and order reconciliation term explain the evidence layers. The Tracking Health Check is a separate diagnostic option when the cause or scope is uncertain. If the task is already defined, I would scope the implementation directly.