Short answer: give every QR code, print ad, TV spot and landing page its own tracking link with a consistent UTM structure, make sure that link survives the store redirect, then measure the full funnel from scan or click to install, sign-up and revenue. Promo codes and holdout regions fill the gaps where no link is possible.
You launch billboards with QR codes in Mumbai and Bangalore. Three weeks later, your MMP shows a bump in "organic" installs and nothing against the outdoor campaign. That is the offline attribution gap: QR codes, print, TV and web landing pages fall into the organic bucket while Meta and Google are tracked cleanly.
This post covers measurement: how to get install attribution for these channels and how to read the numbers. For how to route a scan to the right screen in the app, see our companion guide to deep linking for QR codes.
The three gaps to close
- No tracking link at all. The QR code points straight to the App Store or Play Store with no parameters. Every install looks organic.
- A link exists but attribution fails. The link is in the QR code, but SDK misconfiguration, an expired link or a window that is too short means scans never turn into attributed installs.
- Attribution works but is not actionable. Installs land against "QR campaign", but you cannot tell the Koramangala billboard from the Indiranagar one, or one newspaper from another.
How to set up QR code attribution
Step 1: one tracking link per placement
Create a unique link for every distinct placement. Billboards in five cities need five links, or you cannot compare cities.
Use a consistent UTM structure:
utm_source=qr
utm_medium=offline
utm_campaign=billboard_bangalore_q1
utm_content=hsr_layout_v1
utm_source=qrmarks a QR scan.utm_medium=offlinegroups it with other offline channels.utm_campaignnames the initiative and city.utm_contentidentifies the placement or creative version.
In Linkrunner, you create a trackable link for each placement and generate its QR code from the same place.
Step 2: handle all three scan outcomes
- App installed: the link opens the app on the right screen.
- App not installed: the link sends the user to the store and keeps the campaign context, so the first open is credited to the QR campaign. Deferred deep linking then takes the user to the intended screen after install. This is where most setups break.
- Desktop or unsupported device: the link falls back to a mobile-friendly landing page whose download buttons also carry the campaign.
Test all three paths on current iOS and Android devices before anything is printed.
Step 3: print-ready QR codes
- Use dynamic QR codes, so you can change the destination without reprinting.
- Set error correction to high, so a scuffed or partly covered code still scans.
- Keep at least 2cm by 2cm for print, much larger for billboards.
- Print a dark code on a light background, with a clear quiet zone around it.
- Add a call to action next to it, such as "Scan to download".
Before launch, scan from several devices, confirm the app opens when installed, confirm the store redirect when not, and check that a test install appears in your MMP against the right campaign within minutes.
Step 4: track the funnel, not just installs
Track scans, store page views, installs, first opens and your key in-app events for each placement. If 5k scans produce only 300 installs, the problem is more likely the store listing or the offer than the placement itself.
Each week, check three ratios against your own baseline:
- Scans to store views: a big drop means a broken link or redirect.
- Store views to installs: a drop points at the store listing.
- Installs to first opens: a drop means installs are happening that your SDK is not seeing.
For a real example, see how abcoffee tracks every offline user from a QR code through to the app. If you are still choosing a tool, Deep Linking Tools compares QR code deep link support.
How to track print, TV, radio and OOH
Offline ads often have nothing to scan. People see the ad, remember the brand and install later. Three methods close most of the gap.
Method 1: vanity URLs
Give each channel a short, memorable URL, for example yourapp.in/tv for a TV spot or yourapp.in/paper for a print ad, and redirect each one to a tracking link with its own UTMs:
utm_source=tv
utm_medium=offline
utm_campaign=tv_ipl_2026
utm_content=15sec_v2
- Register a short domain or subdomain.
- Map each vanity path to its own tracking link.
- Report vanity URL visits as a recall signal alongside installs.
Method 2: promo and referral codes
When no link is practical, give each placement a unique code that users enter after install.
- Create one code per placement or publication.
- Fire an in-app event to your MMP when the code is redeemed.
- Track redemption rate and time from install to redemption.
The limit: you only see users who remember and enter the code, so this method undercounts.
Method 3: holdout regions
For large TV, radio or national print bursts, run the campaign in some cities and hold others back for the same weeks. Compare install growth in the campaign cities against the trend in the holdout cities. The difference is your incremental lift. You do not get install-level attribution, but you get a defensible answer to "did it work?".
How to track web-to-app journeys
Many installs start on a web page. A user clicks a Meta ad, lands on your site, reads about the app, then downloads. If the web visit is not connected to the install, the paid click is lost and the install looks organic. Our guide to deep linking for web-to-app covers the routing side; here is the measurement side.
Step 1: put a web SDK on landing pages
The web SDK should:
- capture the landing page UTMs on the first visit,
- keep them through the session,
- pass them through when the user taps "Download app".
Linkrunner's Web SDK is in beta. The common failure is a download button that links straight to the store and drops the campaign. Point every download button at a tracking link instead.
Step 2: set sensible windows
- Click to install: 7 days is a common default for web clicks.
- View to install: keep it short, around a day, to avoid crediting visits that had nothing to do with the install.
To test, visit a landing page with known UTMs on a test device, tap download, wait a couple of hours, install and open the app, and check the install appears with the right campaign.
Step 3: decide who gets credit
A user clicks a Meta ad on day 1 and a Google ad on day 3, then installs. Most mobile teams use last-click, because it matches how ad networks report and keeps MMP and network numbers comparable. If TV and print are building awareness that last-click never credits, use holdout tests to size their effect rather than switching models. Linkrunner uses last-click by default, configurable, with multi-touch on request.
A UTM naming convention that lasts
Without a standard, "billboard_blr", "blr_billboard" and "bangalore_outdoor" end up as three campaigns.
- Source: the channel, such as qr, tv, print, radio, landing_page or event.
- Medium: the media type, such as offline, web, partnership or referral.
- Campaign: channel, place and period, such as billboard_bangalore_q1 or print_jan2026.
- Content: placement or creative, such as hsr_layout_v1 or page3_fullpage.
Rules that keep it clean:
- Lowercase only; "QR" and "qr" are different values in most tools.
- Underscores, not spaces.
- Include place and period for trend analysis.
- Version creatives with _v1, _v2.
- Keep one shared template for the team and every agency.
The weekly validation routine
Run this every Monday:
- Attribution coverage: what share of last week's installs have a known source? If you are running tracked offline campaigns and the organic share jumps, something is broken.
- Scans against installs: compare your QR tool's scan count with attributed QR installs. A sudden fall in that ratio usually means a broken link.
- Live links: scan every live QR code and open every vanity URL from a phone.
- Zero-click links: any link with no clicks for 24 hours while media is live needs checking.
- Post-install quality: compare sign-up, D7 retention and revenue per install by source, not just install counts.
How to judge offline campaigns
Install volume alone flatters cheap reach. Put every channel in one weekly view:
| Metric | Why it matters |
|---|---|
| Installs and CPI | Volume and cost, compared against your India CPI benchmarks by category |
| Sign-up rate | Whether the channel brings real users |
| D7 retention | Whether they stay |
| Revenue per install (D7, D30) | Whether they pay |
| Payback period | When revenue covers acquisition cost |
A billboard with a low CPI but weak D7 retention can be a worse buy than a paid campaign with a higher CPI and strong retention. Set alerts for an attribution drop, a CPI spike week on week, and a fall in sign-up rate, so problems surface before the weekly review.
Where Linkrunner fits
Linkrunner handles QR codes, offline links, web-to-app and paid networks in one platform, so every channel lands in the same dashboard:
- Dynamic, deferred deep links by default, with QR code deep links and branded short links on custom domains.
- One dashboard for Meta, Google, QR, offline and web traffic, from click to install, sign-up, revenue and ROAS.
- Web SDK (beta) for web attribution.
- Post-install event tracking across every channel.
- SKAN 4.0 wizard for iOS measurement.
- Open data exports via CSV, API and webhooks, with no export or API fees.
On cost: Linkrunner charges from ₹1.20 per attributed install, falling with volume, with no feature paywalls, seat limits or export restrictions. The rate is ₹1.20 up to 50k installs a month, ₹1.00 up to 100k, ₹0.90 up to 500k and ₹0.80 above that, and one rate applies to all of the month's installs. At 100k installs a month the rate is ₹1.00, about ₹1 lakh a month, roughly ₹2 to 7 lakh less than legacy MMPs, which typically cost ₹3 to 8 lakh a month at that volume. The first 25k attributed installs are free.
FAQ
Can you track QR code app installs?
Yes. Put a unique tracking link behind each QR code, make sure it keeps the campaign through the store redirect, and the MMP credits the first app open to that QR placement. Dynamic QR codes let you fix the destination without reprinting.
How do you measure TV or print ads for an app?
Use a vanity URL or a unique promo code per spot or publication for direct attribution, and run holdout regions for large campaigns to measure incremental lift where no link is possible.
Why do my QR installs show up as organic?
Usually because the QR code points straight to the store, or the tracking link loses its parameters on the store redirect.
What attribution window should I use for web-to-app?
A 7-day click-to-install window is a common default, with a short view-to-install window of about a day so unrelated visits are not credited.
How much does it cost to track offline campaigns with Linkrunner?
The same as any other channel: from ₹1.20 per attributed install, falling to ₹0.80 above 500k installs a month, after 25k free installs. There are no separate charges for QR codes, deep links or exports.
Want to see QR, offline and web-to-app attribution in one dashboard? Request a demo from Linkrunner and we will walk through it with your own campaigns.