Skip to content

GuidesAd Platforms7 min read

Subscription Renewals: Orders, Events and Ad Attribution

How I separate subscription starts, renewals and new customers before deciding what purchase events GA4, Meta and Google Ads should receive.

Published
Reviewed
A calendar and magnifying glass above separate trays for a first receipt and recurring receipts.

Daniil MaximkinProduct & Solutions Engineer

Short answer

A paid renewal can belong in revenue measurement without representing a newly acquired customer. I first classify the order from subscription and payment evidence, then choose the event and bidding scope for each destination. GA4 revenue, Meta Purchase delivery and Google Ads acquisition goals need separate decisions. An old click identifier is something to investigate, not proof that an ad caused the renewal.

— Daniil

Key takeaways

  • A subscription start, a renewal and a new customer are separate classifications. An existing customer can start another subscription.
  • A billing retry or failed attempt is not another paid purchase. Keep the order and payment evidence underneath the event.
  • For complete revenue measurement, eligible paid renewals can remain purchases with a separate order classification.
  • For acquisition bidding, agree which purchases qualify before mixing first orders and automatic renewals.
  • Event receipt, deduplication and attributed conversions are separate checks; a received event does not establish ad causation.
In this guide

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.

Evidence for the orderInternal order typeCustomer classificationPurchase eligibility
Paid origin order; no earlier qualifying purchase in the agreed historysubscription_startnewEligible under the agreed revenue rule
Paid origin order; customer already bought beforesubscription_startreturningSale, but not a first customer purchase
Later contract order; successful recurring billing/payment evidencesubscription_renewalreturningEligible renewal revenue; acquisition inclusion decided separately
Failed billing attempt; no completed paid orderNo new paid orderUnchangedNo purchase for the failed attempt
Subscription evidence incompleteunknownunknown if history is also incompleteHold 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.

RiskWhat I would inspect
Renewal reported as a newly acquired customerContract/payment evidence and the purchase-history rule
Original click copied onto later ordersCapture time, provenance and the destination’s attribution window
One order sent twiceSender retries, transaction/event keys and all delivery routes
Different renewals share one event keyOrder-to-event mapping, not just aggregate totals
Sender silently stopsArrival checks split by order type, with a named alert owner
Renewal excluded from revenue without explanationWritten purchase scope and reconciliation categories
Server route bypasses consent or sends unnecessary dataEligibility 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.

Questions

Questions this guide answers

Should I never send renewals as Purchase?

There is no blanket rule. An eligible paid renewal can be part of revenue measurement. Whether it belongs in the campaign's optimisation signal is a separate decision, based on the goal and verified destination behaviour.

Can click age tell me which orders are renewals?

It can flag a suspicious pattern. I classify from subscription and payment evidence first, then inspect click provenance and age. A missing or old click ID alone cannot establish the order type.

Does an accepted server event prove attribution works?

No. I check the received event, duplicate handling, reporting and campaign conversion scope separately. Attribution credit also does not establish that the ad caused the sale.

Daniil Maximkin

Hi, I’m Daniil.

I work with you from defining the problem to implementation and handover. You talk to the person who does the work. I work in English and Russian.

Tried it and still stuck?

Describe your task

The first answer is free, within one working day. Or write directly: next@taskfordaniel.com