Four steps stand between a click on a Google web ad and an app conversion in Google Ads: the tracking link fits the Final URL, the ad is approved, AppsFlyer attributed the install under the media source you are reading, and Google accepted the conversion upload. Check them in that order and stop at the first one that fails. Start with the campaign type and the Final URL, because the destination changes the answer. If your ads send people straight to the App Store or Google Play, AppsFlyer’s upload to Google’s Offline Conversion API is the route AppsFlyer documents, and Google says its own Web to App Acquisition Measurement is not available for accounts whose web campaigns send users to an app store.
Scope: Google Ads web campaigns (any objective except App promotion) that promote an iOS or Android app, measured through AppsFlyer’s Google Ads Web integration (googleads_int), with the Singular and Adjust differences noted. None of the pages below states a regional limit. Checked against each vendor’s own pages on 1 October 2026. For why you might choose this route over App campaigns, see Do Google Search Ads work for app installs?. This post is only about making it measure.
What should you check first?
The campaign type and the Final URL, because every other rule depends on them. AppsFlyer’s guide, Google Ads (AdWords): Create web-based campaigns, applies to every Google objective except App promotion and every campaign type except Shopping. An App campaign is a different integration, so if that is what you run, this post is the wrong one.
Then read the ad’s Final URL. It is a store listing, your own web page, or (by mistake) an AppsFlyer link, and each needs a different tracking link.
Which link and which conversion source fit your Final URL?
In the table, the link rules are AppsFlyer’s and the measurement rules are Google’s.
| Final URL | Tracking template (AppsFlyer) | What fails | Where Google’s conversions come from | How to validate | Known limits |
|---|---|---|---|---|---|
| App Store or Google Play listing | Single platform attribution link with af_r={lpurl} |
A OneLink here returns “Tracking call unsuccessful” from Google | AppsFlyer’s upload to Google’s Offline Conversion API (OCI). Google’s own Web to App Acquisition Measurement is not available to an account with web campaigns that send users to a store | Google’s Test button on the template, then one real click that appears in AppsFlyer | AppsFlyer parameters can only go in the template. AppsFlyer’s view through attribution for these campaigns needs a Smart Script or Smart Banners landing page, so it does not apply here |
| Your own web page with Smart Script or Smart Banners | Optional. OneLink with af_android_url, af_ios_url and af_web_dp all set to {lpurl}, or af_r={lpurl} |
Without a template: people who skip the page’s button and go to the store themselves cannot be attributed. With a template: people who tap the button register two clicks | AppsFlyer’s OCI upload, and separately Google’s Web to App Acquisition Measurement if you import first opens and no web campaign in the account sends users to a store | The button’s outgoing URL carries gclid, gbraid or wbraid |
Smart Script forwards gclid automatically from version 2.8.1 and gbraid and wbraid from 2.9.0. Smart Banners generate OneLink links only. The page itself must pass Google’s destination policy |
| An AppsFlyer link (OneLink or single platform) | Not applicable | AppsFlyer warns this may get the campaign rejected | None until the Final URL is fixed | Not applicable | The Final URL must be a direct address with no redirects |
Keep the two sources apart. AppsFlyer’s upload sends what AppsFlyer attributed, matched to Google clicks by click ID. Google’s Web to App Acquisition Measurement is Google counting installs itself from imported first opens. In an account whose web campaigns go straight to the store, only the first is available.
What does the tracking template need?
AppsFlyer’s guide lists the parts, and a missing or wrong one is enough to break the link or the ad:
pid=googleads_int, mandatory.af_siteid, mandatory, any value you choose.c, mandatory and static. AppsFlyer says there is no ValueTrack parameter for it, so type the name in. Put the campaign ID inaf_c_id={campaignid}, which AppsFlyer also needs for cost, click and impression data.af_force_transparent=true, mandatory. AppsFlyer says Google may disapprove the ad without it.- A redirect to
{lpurl}. The{lpurl}value must use HTTPS, be encoded, and sit on a domain in your redirect allowlist.
AppsFlyer rejects af_dp, af_android_store_csl, af_ios_store_cpp, af_og_title, af_og_description and af_og_image in this flow, and forbids af_base_params_forward and af_param_forwarding because they alter {lpurl}. No duplicate parameters, no parameters without values, no ValueTrack parameter Google leaves empty, and any values set under Campaign URL options in Google Ads must match the template.
On the Google side, About tracking in Google Ads says the template and every redirect must be HTTPS and done on the server, and the Test button checks that the Final URL plus your tracking resolves. About parallel tracking says parallel tracking is mandatory for Search, Shopping, Display, Video and Performance Max: the user goes straight to the Final URL while the template loads in the background. AppsFlyer ties its {lpurl} redirect rule to exactly that.
Why does a working redirect not prove the setup works?
A click that lands in the right place has passed only the first of four checks. Test them separately, with one real click on a phone, and note the first one that fails.
- Link validation. Google’s Test button resolves, and the test click appears in AppsFlyer under the campaign you expect. A “Tracking call unsuccessful” error points back to the link type in the table.
- Ad approval. Google’s Destination requirements policy disapproves a tracking template that does not lead to the same content as the Final URL, and destinations “solely designed to send users elsewhere”, which matters if your landing page only bounces people to the store. About ValueTrack parameters says template changes take 24 to 48 hours to reach serving ads, so test after that window. About tracking in Google Ads says URL options set or edited at ad, keyword or sitelink level go back through review, while those at account, campaign or ad group level do not.
- MMP attribution. The install appears in AppsFlyer. AppsFlyer attributes it probabilistically, or deterministically when an install referrer is available.
- Upload acceptance. Google received the conversion, matched it to a click and counted it against the right conversion action.
A redirect test says nothing about steps 3 and 4, which are what a “no conversions” report is about.
Where do Google web to app installs show up in AppsFlyer?
Mostly not under the partner you set up. AppsFlyer sends conversions to Google under googleads_int, but its dashboards and raw data report them under googleadwords_int, the media source of its main Google Ads integration, so web and App campaign results sit in one view. The raw data original_url field and the postback reports keep googleads_int. The same page’s traits table adds that installs can show under googleads_int with re-engagements under googleadwords_int when a googleadwords_int SRN integration is active alongside. AppsFlyer also says Google may claim some web campaign installs itself, as self reported googleadwords_int attributions, and that this “may become more common as Google expands support for web campaign install attribution”. For iOS it points these campaigns to the Classic Dashboard and says the SKAN Dashboard is, in most cases, not relevant to them.
So before I conclude there are no installs, I would filter the dashboard by googleadwords_int and the campaign ID, check googleads_int as well, then confirm in raw data that original_url contains googleads_int.
Why does AppsFlyer show the install but Google shows nothing?
Then the upload is failing, or landing where you are not looking. AppsFlyer’s setup and troubleshooting steps give the checks:
- Events are mapped. Installs are the only automatic postback. Every other event needs a Google conversion action created as a click import, with its
ctidvalue pasted into the AppsFlyer event mapping. A new conversion action shows as Inactive until data arrives. - Count is set to Every. AppsFlyer says the conversion action must use Every, not One, to accept
gbraidandwbraiduploads. - Click IDs survive. Google appends
gclidfor Android and for consenting iOS users, andgbraidandwbraidfor iOS users who did not consent. On a landing page, the button’s outgoing URL must carry one of them or the postback cannot register. To see them in raw data, map each one to its ownaf_subparameter as well. - The token works. The OAuth scope
https://www.googleapis.com/auth/adwords, Sign in with Google done in AppsFlyer, and the manager (MCC) ID in both Customer ID fields when more than one Google Ads account runs the app. A “Missing token” error means this step is not done. - Agency accounts. If an agency runs the campaign, both the advertiser’s and the agency’s
googleads_intintegrations must be active, and the agency must sign in with Google, or the postback fails. - The plan. AppsFlyer says
googleads_intis available on its Growth and Enterprise plans only, not Zero or Welcome. - iOS privacy setting. AppsFlyer’s setup tells iOS apps to turn off Advanced Privacy for this partner. Its Apply Aggregated Advanced Privacy framework page says that while the app level Aggregated Advanced Privacy toggle or a partner’s Advanced Privacy toggle is on, identifiers such as click IDs, IDFV, user agent and IP of iOS 14.5 and later users who have not granted ATT permission are not available to partners, and that the partner toggle can only be changed once the app level one is off. It also tells advertisers to work with legal advisors on how Apple defines tracking before turning the app level setting off. Apple’s User Privacy and Data Use page says you “may not derive data from a device for the purpose of uniquely identifying it”. That setting is for the app owner and privacy counsel to decide before the test.
In Google Ads, open the conversion action named in the mapping, because the Conversions column can leave it out. Google’s About primary and secondary conversion actions says secondary actions are reported in All conversions and are not used for bidding, unless they sit in a custom goal.
Acceptance is not the end either. On a Google App campaign test I ran in February and March 2026, measured in AppsFlyer, the revenue event sent $1 instead of $0 when there was no value. Google received those values, and its reported ROAS was inflated across the board, most on iOS, where conversion volumes were lower. That was an App campaign, not a web campaign, but the lesson carries: check the values Google received as well as the count. I wrote up the rest of that test in which Google Ads bid strategy works best for apps.
How is Google’s own web to app measurement different?
It is Google counting installs without your MMP’s upload. Google’s About Web to App Acquisition Measurement says:
- It covers Search, Performance Max, Shopping, Hotel, Video and Demand Gen campaigns, on Android and iOS, and is not available for accounts with web campaigns that send users to an app store.
- Indirect installs need first open events for both platforms imported into the account that holds the web campaigns, and show in All conv. The Web to app first conv. column also needs in app actions imported and one of them bid to as a primary action.
- Integrated Conversion Measurement has expanded to web to app acquisition through on device measurement, which Google says improves attribution for iOS installs on Search and Shopping inventory from your web campaigns in third party attribution partners. Video and Display inventory are described as coming later.
- A conversion is attributed to one campaign only, with no double reporting between App campaigns and web campaigns, and Google says the same logic extends to partner reporting.
Google also says it has started claiming and reporting app first opens driven by Search and Shopping inventory in Search, Performance Max and Shopping campaigns. Google gives that change and the ICM expansion as the reasons installs attributed to web campaigns can rise in your MMP with no change to your links. In AppsFlyer, installs Google claims arrive as self reported googleadwords_int attributions, not through your googleads_int upload. My setup guide for iOS App campaigns covers what ICM and on device measurement need inside the app, by MMP.
Does this work the same on Singular or Adjust?
No, and the differences matter for iOS.
Singular’s Google Ads Web - Web to App Campaigns guide puts the Singular link in the tracking template with the store URL as Final URL (or your own site running its Web SDK), requires _global_redirect={lpurl} in the link or the ad is rejected, and says deep linking must be off. Its FAQ says the offline upload passes gclid automatically and lists gbraid and wbraid as coming soon, and it names the Offline Conversions API’s limits as click conversions only, with no modelling. It also needs enhanced conversions for leads turned on in Google Ads. Its integration summary marks view through and re-engagement as not supported. So by Singular’s own page, iOS clicks without consent, which carry gbraid or wbraid instead of gclid, have no click ID it can upload yet.
Adjust’s Extend your Google Ads setup beyond app campaigns says Google Ads does not accept Adjust universal links or branded links as the tracking template, that editing the Adjust link can get it rejected, and that Google Ads might not claim attribution for certain users in web to app campaigns.
What does this have to do with bidding?
Bidding can only optimize on the conversions it receives, so getting a web campaign’s app conversions back into Google is signal engineering. The order follows from the rules above: settle the Final URL, match the tracking link type to it, run the four checks, and read performance only after the upload is accepted. The growth audit, which can be booked on its own, is where I check whether measurement is what holds an account back. How this route compares with App campaigns is in why a Google App campaign spends on YouTube. The same trace for Meta is in why Meta web to app shows clicks but no installs in AppsFlyer.
Sources
All checked on 1 October 2026.
- AppsFlyer: Google Ads (AdWords): Create web-based campaigns, edited 15 September 2026.
- AppsFlyer: Apply Aggregated Advanced Privacy framework, edited 11 June 2026.
- Google Ads Help: About Web to App Acquisition Measurement, no page date.
- Google Ads Help: About primary and secondary conversion actions, no page date.
- Google Ads Help: About tracking in Google Ads, no page date.
- Google Ads Help: About parallel tracking, no page date.
- Google Ads Help: About ValueTrack parameters, no page date.
- Advertising Policies Help: Destination requirements, no page date.
- Singular: Google Ads Web - Web to App Campaigns, edited 24 August 2026.
- Adjust Help Center: Extend your Google Ads setup beyond app campaigns, no page date.
- Apple Developer: User Privacy and Data Use, no page date.
Questions people ask
Can I use a OneLink as the tracking template when the Final URL is the App Store?
No. AppsFlyer's Google web campaign guide says that when the Final URL points straight to Google Play or the App Store, the tracking template must be a single platform attribution link, and that a OneLink in that slot returns a "Tracking call unsuccessful" error from Google. OneLink belongs in the template when the Final URL is your own web page.
Does Google's Web to App Acquisition Measurement work if my ads send people straight to the App Store?
No. Google's help page says the feature is not available for accounts with web campaigns that direct users to an app store such as the Apple App Store or Google Play. In such an account, the route AppsFlyer documents for a store Final URL is its upload to Google's Offline Conversion API. Checked on 1 October 2026.
Why do my Google web installs show under googleadwords_int instead of googleads_int?
Because AppsFlyer reports them that way. Conversions are sent to Google under googleads_int, but the AppsFlyer dashboards and raw data show them under googleadwords_int. The original_url field keeps googleads_int, and so do postback reports. AppsFlyer's traits table adds that installs can appear under googleads_int with re-engagements under googleadwords_int when a googleadwords_int SRN integration is also active, so check both before you conclude nothing was attributed.
Do I have to turn off Advanced Privacy in AppsFlyer for iOS web to app?
AppsFlyer's setup steps say to turn it off for an iOS integration. Its Aggregated Advanced Privacy page says that while that setting is on, identifiers such as click IDs, IDFV, user agent and IP of iOS 14.5 and later users who have not granted ATT permission are not available to partners, and it tells advertisers to work with legal advisors on how Apple defines tracking before turning the app level setting off. Whether to change it is for the app owner and counsel to decide before you start debugging.