Why Google Ads needs offline conversions for F2F
Google Ads drives F2F traffic through Search, YouTube, Discovery and Performance Max campaigns. In every case, the conversion happens on F2F.com, a site where you cannot install the Google tag. Without conversion data, Smart Bidding strategies like Maximize Conversions and Target ROAS are bidding blind, and Performance Max cannot learn which placements produce paying fans.
Google's answer is offline conversion import. You capture the Google click identifier when the fan lands on your tracking link, and later upload a conversion that references that identifier. Google joins the two and attributes the conversion to the right campaign, keyword and ad. Enhanced conversions add a second matching path using hashed first-party data, which recovers conversions where the click ID was lost, for example on cross-device journeys.
F2F API automates the full loop. It stores click identifiers per tracking link visit, joins them to F2F transactions, and uploads conversions through the Google Ads API with the right conversion action, value, currency, timestamp and consent signals.
Click identifiers: gclid, gbraid and wbraid
gclid: the classic Google Click Identifier, appended to destination URLs when auto-tagging is enabled. Used for most web traffic.gbraid: used for iOS traffic going from web to app, introduced after App Tracking Transparency. It carries aggregated, privacy-preserving attribution data.wbraid: used for iOS traffic going from app to web, for example a click inside the YouTube app that opens your link in Safari.
A single click carries only one of these. Your capture code should look for all three and store whichever is present. When uploading, send exactly one identifier per conversion; Google rejects uploads that include more than one.
You also need the Google Ads Conversion Action ID and, for tag-based setups, the conversion label. The Conversion Action ID identifies which conversion in your account the upload counts toward.
Step 1: Create a conversion action
- In Google Ads, open Goals, then Conversions, then Summary, and choose New conversion action.
- Select Import, then Other data sources or CRMs, then Track conversions from clicks.
- Name the action after the F2F event, for example "F2F Subscribe" or "F2F Purchase", choose the category (Subscribe or Purchase), and set Value to Use different values for each conversion.
- Set the click-through conversion window to 90 days so late subscribers are still credited.
- Note the Conversion Action ID shown in the URL or the action details.
- In your F2F API dashboard, open Ads Tracking, choose Google Ads, sign in with an account that has access to the customer ID, and select the conversion actions to use for each F2F event.
Confirm that auto-tagging is enabled in your account settings. Without it, no gclid is appended and offline conversions cannot be matched.
Step 2: Capture the click identifier
Capture the identifier on the first request to your tracking link and keep it in a first-party cookie for 90 days. The example below captures gclid; repeat the same pattern for gbraid and wbraid, storing them in _gbraid and _wbraid:
# Verify your tracking link sets the first-party _gclid cookie
curl -I "https://link.yourdomain.com/go/creator?gclid=TEST_CLICK_123"
# Expected response header:
# Set-Cookie: _gclid=TEST_CLICK_123; Path=/; Max-Age=7776000; SameSite=Lax; SecureForward the stored identifier, the click timestamp, the client IP and the user agent to F2F API when recording the click. Google requires that the conversion time be after the click time, so accurate click timestamps matter.
Step 3: Upload offline conversions
When an F2F transaction settles, F2F API uploads it to Google Ads automatically. You can also push a conversion yourself. F2F API converts the payload into a Google Ads API UploadClickConversions request with partial failure enabled:
curl -X POST "https://api.apif2f.com/v1/capi/conversions" \
-H "Authorization: Bearer $F2F_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"creator_id": "crt_8f2a91",
"networks": [
"google_ads"
],
"event_name": "purchase",
"event_id": "evt_1f3b8c",
"value": 29.99,
"currency": "USD",
"google_ads": {
"conversion_action_id": "123456789",
"gclid": "Cj0KCQiA-example",
"consent": {
"ad_user_data": "granted",
"ad_personalization": "granted"
}
},
"user_data": {
"email": "fan@example.com"
}
}'The conversion_date_time is sent in the format yyyy-mm-dd hh:mm:ss+hh:mm with your account time zone. Google typically processes uploads within a few hours, and conversions appear in reports attributed to the click date, not the upload date.
Uploading renewals and repeat purchases
Each renewal or PPV purchase is uploaded as its own conversion with a unique order_id derived from the F2F transaction ID. The order ID prevents duplicates if an upload is retried. Using real values for every purchase lets Target ROAS bidding learn which keywords and audiences produce fans with the highest lifetime value.
Step 4: Enable enhanced conversions
Enhanced conversions for leads let Google match conversions using hashed first-party data instead of, or in addition to, a click ID. F2F API sends the fan's email as user_identifiers.hashed_email, normalized (trimmed and lowercased) and SHA-256 hashed. Google matches this against signed-in Google accounts to attribute cross-device subscriptions without third-party cookies.
To enable it, open the conversion action settings in Google Ads, turn on Enhanced conversions for leads, accept the customer data terms, and choose Google Ads API as the method. F2F API then includes hashed identifiers on every upload. Expect a few percent to over 10% additional attributed conversions, depending on how often click IDs are lost in your funnel.
Step 5: Consent Mode v2
Since March 2024, Google requires advertisers who serve users in the European Economic Area to send consent signals with conversion data. Uploads include two fields:
ad_user_data: whether the user consented to their data being sent to Google for advertising. Values are"granted"or"denied".ad_personalization: whether the user consented to personalized advertising, including remarketing. Values are"granted"or"denied".
Capture these choices from your cookie banner on the tracking link and forward them with the click. F2F API attaches them to each conversion. When ad_user_data is denied, F2F API omits hashed identifiers and sends only the minimum fields Google allows. Conversions without consent signals from EEA traffic may be excluded from reporting and bidding, so wire this up before scaling in Europe.
Step 6: Validate uploads
In Google Ads, open the conversion action and check the Diagnostics tab, which shows upload counts, match rates and errors over the last 90 days. In F2F API, the request log shows every upload with the Google partial failure details, if any. Common early issues are conversions uploaded with a time before the click, identifiers from a different Google Ads account, and conversion actions that are not set to Import.
Allow up to 24 hours after your first uploads before judging results; Google processes imports in batches. Once diagnostics show a healthy match rate, switch your campaigns to bid on the imported conversion actions.
Going live checklist
Before switching Smart Bidding to an imported conversion action, confirm each of the following. Google's bidding models react to conversion data quickly, so it pays to make sure the data is clean first.
- Click a live ad and confirm the landing request contains exactly one of
gclid,gbraidorwbraid. - Verify the identifier is stored in a 90-day first-party cookie on your domain and appears in the F2F API click log with an accurate timestamp.
- Send a test conversion through F2F API and confirm it is accepted without partial failure errors in the request log.
- Wait for the Diagnostics tab on the conversion action to show the upload and a healthy match rate.
- Check that EEA traffic carries both Consent Mode v2 signals before scaling campaigns in Europe.
After launch, compare imported conversions in Google Ads with the F2F API conversion report weekly. Remember that Google reports conversions against the click date, so recent days will keep growing for a while as late subscribers convert and uploads are processed.
How F2F API handles retries and adjustments
Failed uploads caused by temporary errors are retried with exponential backoff for up to 24 hours using the same order ID, so a late success never creates a duplicate. If a fan requests a refund or a chargeback occurs on F2F, F2F API can send a conversion adjustment that retracts or restates the original value, keeping your ROAS figures honest. Adjustments reference the original order ID and are visible in the request log next to the upload they modify.
Permanent errors, such as a conversion action that was removed or an expired Google account connection, stop retrying immediately and raise a dashboard alert and a capi.delivery_failed webhook so your team can fix the connection before attribution data goes missing.
Troubleshooting
| Symptom | Probable Cause | Resolution |
|---|---|---|
| CONVERSION_PRECEDES_CLICK | Click timestamp missing or wrong time zone | Record click time server-side in UTC; F2F API converts to account time zone |
| UNPARSEABLE_GCLID | gclid truncated or URL-decoded twice | Store the raw query value exactly as received |
| Click from another account | Tracking link shared across customer IDs | Use one conversion action per customer ID or connect the manager account |
| TOO_RECENT_CONVERSION_ACTION | Conversion action created minutes ago | Wait about 6 hours after creating a new action before uploading |
| Low enhanced match rate | Emails not normalized or missing | Enable email enrichment and let F2F API normalize and hash |
| EEA conversions missing | No Consent Mode v2 signals | Forward ad_user_data and ad_personalization from your consent banner |
Privacy
Only upload data you have a lawful basis to share, honor consent choices, and keep your Google Ads customer data terms accepted. F2F API hashes every personal identifier, respects denied consent automatically, and gives you per-field controls for each conversion action.