Offline Marketing Attribution: How to Measure Ad Results
Offline marketing attribution made practical: funnel metrics, QR and promo codes, attribution models, control groups and a report template for city campaigns.
7 min readFortuners Team

Offline marketing attribution works the same way as online tracking, except that you have to build the trail yourself. Before launch you set a goal and one primary metric, give every placement its own QR code or promo code, count each stage from materials handed out to paying customers, and compare the result with a period or an area without advertising. That tells you not only how many people responded, but also what each customer cost and which locations are worth repeating. Below you'll find the complete system: definitions, funnel metrics, tracking methods, attribution models, geo tests, formulas and a report template.
Effectiveness vs efficiency: what are you actually measuring?
The two words are often used interchangeably, but they answer different questions.
Advertising effectiveness tells you whether the campaign reached its goal. If a yoga studio wanted 80 people to book a trial class and 95 did, the campaign was effective.
Efficiency tells you what it cost to get there. The same 95 bookings can be an excellent result on a small budget and a weak one on a large budget.
Before you count anything, agree on a shared vocabulary. These terms come up throughout the article.
| Term | What it means | How to count it |
|---|---|---|
| Reach (contacts) | The number of people who had a real chance to see the ad | Flyers handed out, cookies served, estimated footfall past the placement |
| Scan | A visit to the landing page after scanning a QR code | Redirect counter or landing page analytics |
| Conversion | The action you care about: a sign-up, a booking, a purchase, a redeemed code | Form, booking system, till, online shop |
| Conversion rate | The share of people from the previous stage who took the action | Conversions ÷ people at the previous stage × 100% |
| CAC (customer acquisition cost) | What one new customer cost you | Total campaign cost ÷ number of new customers |
| ROAS | Revenue generated per unit of currency spent on advertising | Revenue attributed to the campaign ÷ campaign cost |
| ROI | Return on investment once margin is taken into account | (Profit from the campaign − campaign cost) ÷ campaign cost × 100% |
| Incremental lift | How many extra customers came because of the ad rather than by coincidence | Change in the test group minus change in the control group |
A clearly defined goal and target audience do half of the measurement work for you.
Why offline advertising looks unmeasurable (and how to fix it)
Online ads leave a trail automatically: an impression, a click, a session. A poster, a flyer or a product sample handed out in a café has no "click here" button. That creates three typical problems.
- Exposure leaves no trace. You don't know who saw a poster until they do something you can record.
- Action is delayed. Someone picks up a flyer on Tuesday and signs up two weeks later after typing your brand name into Google. In your analytics, that looks like organic search traffic, not like the flyer.
- People measure what's easy. Reports show the number of printed materials instead of the number of customers, because that's the only figure anyone has to hand.
You can fix this with three rules applied at the planning stage.
- Every placement gets its own trail. A separate QR code, promo code or URL for each location and each type of placement.
- The offer requires a countable action. "First class free with this code" is far easier to measure than "Come and visit us".
- You have a baseline. You compare the campaign result with the period before it, or with an area where it didn't run.
One honest caveat: not everything shows up in the numbers. Some people remember the brand and come back six months later, so direct measurement shows the lower bound of the effect, not the whole effect. That's still far better than guessing.
Funnel metrics: from first contact to paying customer
The simplest way to think about an offline campaign is as a funnel. People drop out at every stage, and your job is to find the stage where you lose the most of them.
| Stage | Metric | Formula | Data source |
|---|---|---|---|
| 1. Reach | Materials handed out | Units that actually reached people's hands (not units printed) | Delivery notes, remaining stock at each location |
| 2. Interest | Scan rate | Scans ÷ handed out × 100% | QR code counter, website analytics |
| 3. Action | Scan-to-lead conversion | Sign-ups or bookings ÷ scans × 100% | Form, booking system |
| 4. Customer | Code redemption rate | Redeemed codes ÷ handed out × 100% | Till, online shop, front desk |
| 5. Value | CAC, ROAS, repeat visits | Formulas from the glossary above | Sales data and customer history |
Illustrative example (made-up numbers, not a benchmark): a pilates studio hands out 2,000 leaflets with a QR code in local cafés. 400 people scan the code, which is 20% of those handed out. 120 people book a trial class, 30% of those who scanned. 60 people redeem the code at the front desk: half of the bookings and 3% of everything handed out.
What does a funnel like that tell you? If there are plenty of scans but few sign-ups, the problem usually sits on the landing page: a form that's too long, an unclear offer, no available time slots. If there are plenty of sign-ups but few redeemed codes, look at reminders, scheduling or how the front desk handles the code. If scans are low, check whether the code is visible, whether the offer is attractive and whether the material is reaching the right people.
Indirect signals when there's no direct trail
Part of the effect will never pass through a code. So alongside the funnel, watch these indirect signals during and after the campaign:
- branded search queries in Google Search Console (opens in a new tab) (the Performance report, filtered to queries containing your brand name),
- direct and organic visits in your analytics, ideally broken down by city,
- views and actions in your Google Business Profile, such as requests for directions,
- answers to a "How did you hear about us?" question on your form or at the till.
These signals won't prove cause and effect, but they will show whether the campaign moved anything beyond the codes.
Offline attribution methods: unique QR codes, promo codes, vanity URLs and UTMs
No single method is perfect, which is why you combine them. The table below lays out the most common options.
| Method | What it measures | Strengths | Limitations |
|---|---|---|---|
| Unique QR code (one per placement or location) | Scans, location, day and time | Instant data, split by location; a dynamic code lets you change the landing page after printing | A scan isn't a customer yet; someone can share a photo of the code with a friend |
| One promo code for the whole campaign | Redemptions at the till or online | Links the ad to a transaction; easy to remember | Leaks to coupon sites; can't tell you the location if one code covers everything |
| Unique single-use codes | Redemptions down to the individual unit | Precise, doesn't leak | Needs a system to generate and validate codes |
| Vanity URL or short link | Visits typed in by hand | Works without a scanner; suits posters and radio | Many people will just type your main domain |
| UTM parameters | Traffic source in analytics | Industry standard, free, easy to filter | Only work on a click or scan; declined cookie consent cuts the data |
| Dedicated booking line (call tracking) | Calls generated by a placement | Captures people who prefer to call | Extra cost and setup; harder with many placements |
| "How did you hear about us?" survey | Customer self-reports | Cheap; captures delayed effects | Memory is unreliable; staff must ask every time |
| Control group or geo test | Lift over what would have happened without the ad | Shows the net effect | Needs comparable areas and several weeks |

How to build a QR code link with UTM parameters
Your QR code should point to a URL with UTM parameters that record the source, the medium, the campaign and the specific location. For example:
https://www.example.com/autumn?utm_source=cafes&utm_medium=offline&utm_campaign=autumn-2026&utm_content=powisle-01
A few rules that will save you a lot of data clean-up:
- write everything in lower case and without diacritics (so "srodmiescie", not "Śródmieście"), because analytics treats "Autumn" and "autumn" as two different values,
- use
utm_contentfor the location or placement, so you can compare locations with each other, - use dynamic QR codes when you want to be able to change the landing page without reprinting,
- scan every code on a test print with several different phones before you approve the full print run,
- print a short URL next to the code for people who don't want to scan.
Promo codes: one per campaign or one per location?
One code for the whole campaign is simple and easy to remember, but it won't tell you which location worked. A separate code for each location gives you the split, but it complicates things at the till. A sensible compromise: one promo code per campaign plus a separate QR code for each location. The QR code tells you where the interest came from, and the promo code confirms the purchase.
That is how measurement works in Fortuners campaigns. After the meal, a restaurant guest opens a fortune cookie and finds the brand's offer on the slip, together with a QR code assigned to that campaign and that specific venue. After scanning, they land on the offer page with a discount code. You can read more about the format in our guide to custom fortune cookie campaigns.
This month you'll finally make time just for yourself.
Code CALM26.
GDPR and cookies on the post-scan landing page
Measurement usually ends on a page where someone leaves their details. A few general rules here are easy to forget in a rushed launch:
- Privacy notice. If you collect a name, an email address or booking details, people must receive the information the GDPR requires: who the controller is, the purpose and legal basis of processing, and how long you keep the data.
- Data minimisation. Collect only what you genuinely need to fulfil the offer.
- Separate marketing consent. Consent to a newsletter or text messages must not be a condition of receiving the code, and the box must not be ticked by default.
- Cookies. Under EU rules, which apply in Poland too, analytics and marketing cookies generally need the user's consent. Some people will decline, so your analytics will undercount. That's why it pays to count scans on the server side as well, at the moment of the redirect, without identifying individuals.
Attribution models for offline conversions and their limits
Attribution is the way you assign credit for a conversion to the different contacts a person had with your brand. If someone saw a flyer, then a social media ad, and finally typed your brand name into Google, each model will split the credit differently.
| Model | How it assigns credit | When it makes sense | The problem for offline campaigns |
|---|---|---|---|
| Last touch | All credit to the last contact before conversion | Quick decisions, one main channel | A flyer or poster is almost never the last click |
| First touch | All credit to the first contact | Evaluating awareness-building channels | The first offline contact usually isn't recorded |
| Linear | Equal credit to every contact | Longer decisions with many touchpoints | Contacts nobody can see get zero |
| Time decay | More credit to contacts closer to conversion | Campaigns with a clear deadline, such as an end-of-month offer | Undervalues materials handed out early on |
| Position-based | Most credit to the first and last contact, the rest shared equally | When both discovery and closing matter | Requires a full path, which offline doesn't have |
| Data-driven | An algorithm assigns credit based on conversion history | Large accounts with plenty of conversions | The algorithm only sees what was recorded |
In 2023 Google retired the first-click, linear, time-decay and position-based models (opens in a new tab) in GA4 and Google Ads, leaving data-driven and last-click attribution. For offline advertising, that matters. Both remaining models only see the path recorded in analytics, so contact with a printed piece that didn't end in a scan simply doesn't exist for them.
Three-layer attribution
Instead of searching for one perfect model, report three layers separately, and never add them together:
- Hard data. Scans and redeemed codes tied to the campaign and the location. This is a reliable lower bound of the effect.
- Self-reports. Answers to "How did you hear about us?". They capture people who came without a code, but they are less precise.
- Incremental lift. The difference between an area or period with the campaign and one without it. It shows the net effect, including people who left no trail at all.
Before launch, also set an attribution window: how long after contact you still credit a conversion to the campaign. The simplest option is to tie it to the validity of the code, for example 30 days after the campaign ends.
Where marketing mix modelling and offline conversion imports fit
Marketing mix modelling (MMM) estimates each channel's contribution statistically from long series of spend and sales data, so it needs many months of history and sizeable budgets across several channels. Offline conversion imports send till or CRM conversions back into ad platforms such as Google Ads, but only for people who interacted with a digital ad first. For a local campaign in a handful of neighbourhoods, codes, surveys and a geo test tell you more for far less effort.
Control groups and geo tests: measuring incremental lift
A control group is a set of people, or an area, that didn't see the advertising but is otherwise similar to the group that did. If sales rise in both groups, it's probably the season or the weather. If they rise only where the ad ran, the difference is the effect of the campaign.
In local marketing the easiest way to do this is geographically, because the campaign runs in specific districts anyway.
A geo test, step by step
- Choose two similar areas. For example, two districts that have so far brought you a similar number of customers.
- Measure the baseline. Check how many new customers each area brought in during the weeks before the campaign. Record the district or postcode when you register a new customer.
- Run the campaign in one area only. Change nothing in the other: no extra promotions, no new posters, no special events.
- Compare the change, not the result. What counts is the difference between growth in the test area and growth in the control area.
- Log disruptions. Roadworks, a street festival, unusual weather or a competitor's promotion can all skew the result.
Illustrative example (made-up numbers): a studio has averaged 40 new customers a month from Praga and 40 from Mokotów. In the month the campaign ran only in Praga, 58 new customers came from Praga and 46 from Mokotów. That's growth of 18 in Praga and 6 in Mokotów, so the lift you can attribute to the campaign is roughly 12 people. If 9 people redeemed the promo code, you know the codes captured most of the effect, but not all of it.
With small numbers, it's easy to mistake chance for an effect. When the groups differ by a handful of people, treat the result as a sign of direction, not proof. The bigger the campaign and the longer the test, the firmer the conclusion.
Campaigns in restaurants and cafés lend themselves well to this kind of test, because a venue has a fixed location and a stable guest profile. For more on choosing venues, read our guide to advertising in restaurants, and for planning activity district by district, see our local marketing strategy guide.
Customer acquisition cost, ROAS and ROI
The funnel shows where you lose people. Customer acquisition cost and return on the campaign show whether it pays off.
- CAC = total campaign cost ÷ number of new customers. Include everything in the cost: production, distribution, your team's time and the value of the discounts you gave away.
- ROAS = revenue attributed to the campaign ÷ campaign cost. A ROAS of 2 means PLN 2 in revenue for every PLN 1 spent.
- ROI = (profit from the campaign − campaign cost) ÷ campaign cost × 100%. Calculate profit from your margin, not from revenue, because part of the revenue covers the cost of delivering the service.
Illustrative example (made-up numbers): a campaign costs PLN 12,000 and brings in 60 new customers who redeemed the code. CAC is PLN 200. A first visit generates PLN 150 in revenue on average, so first visits bring in PLN 9,000 and first-visit ROAS is 0.75. That looks like a loss. But if the average customer stays for six months and spends PLN 600 over that time, revenue rises to PLN 36,000 and ROAS to 3. At a 50% margin, profit is PLN 18,000, and ROI after deducting the campaign cost is 50%.
This example shows the most common mistake in evaluating campaigns for service businesses: counting only the first transaction. If your customers come back, judge the campaign by customer value over a realistic horizon, such as 3, 6 or 12 months.
It also helps to run the calculation in reverse before launch: maximum acceptable CAC = average customer value × margin. If a customer brings in PLN 600 of revenue over six months and your margin is 50%, one customer can cost at most PLN 300 for the campaign to break even.
Offline campaign report template
A good report fits on two pages and ends with a decision. You can copy the template below into a spreadsheet or a document.
| Report section | What to include | Example entry |
|---|---|---|
| 1. Goal and primary metric | The one-sentence goal from the brief and the target number | 100 trial class bookings in 4 weeks |
| 2. Scope | Dates, city and districts, placements or venues, volume | 4 weeks, 6 cafés in 3 districts |
| 3. Funnel | Handed out, scans, sign-ups, redeemed codes and the rates between stages | Stage table with percentages |
| 4. Results by location | Ranking of locations by scans, codes and cost per customer | Best and weakest location, with a comment |
| 5. Timing | Days of the week and hours of scans | Scans peak at lunchtime |
| 6. Cost and efficiency | Total cost, CAC, ROAS, ROI over the chosen horizon | CAC and ROAS at 30 days and at 6 months |
| 7. Incremental lift | Result of the comparison with a control group or baseline period | Difference in growth between districts |
| 8. Customer self-reports | Answers to "How did you hear about us?" | Number of people naming the campaign without using a code |
| 9. Data quality | Anything that may have skewed the result | Declined cookie consent, leaked code, a public holiday mid-campaign |
| 10. Decisions | What to repeat, what to switch off, what to test | Keep 4 venues, test a new offer in two |
Section 4 is easiest to keep as a separate table, with one row per location:
| Location | Handed out | Scans | Scan rate | Sign-ups | Redeemed codes | Cost per customer |
|---|---|---|---|---|---|---|
| Café A | … | … | … | … | … | … |
| Breakfast bar B | … | … | … | … | … | … |
| Campaign total | … | … | … | … | … | … |
In Fortuners campaigns, most of this data collects itself. In the partner panel you can see cookies handed out, scans day by day, redeemed codes, each venue's results on a map and peak hours, and the final report arrives as a PDF. You can try it on sample data in the panel demo, and the whole process is laid out in the How it works section.
Common mistakes when measuring offline marketing
- One code for every placement. You know the campaign did something, but not what to switch off.
- No baseline. Without pre-campaign data, every increase looks like a success and every dip like a failure.
- Counting printed instead of handed out. A box of flyers in the storeroom isn't reach.
- Treating a scan as a customer. A campaign with fewer scans but better conversion can be the more effective one.
- A measurement window that's too short. A report closed the day after the campaign ends misses everyone who acts with a delay.
- The till or front desk doesn't record codes. If staff apply the discount on request without logging the code, you lose the most important stage of the funnel.
- Changing several things at once. A new offer, new locations and a new landing page in one campaign make it impossible to identify the cause.
- Adding attribution layers together. A customer who used a code and also ticked "flyer" in the survey is one customer, not two.
- Drawing conclusions from a handful of cases. A difference of three customers between locations is usually just chance.
Measurement ready before campaign launch
- Goal and primary metric written down in one sentence
- Baseline from several weeks before the campaign
- A separate QR code for each placement or location, tested on a print proof
- Promo code with an expiry date and a way to record it at the till
- Links with UTM parameters and consistent naming
- Landing page with a privacy notice and separate consent boxes
- “How did you hear about us?” question on the form or at the till
- Control area or period with no other promotions running
- Attribution window agreed before launch
- Report template with the date of the first review
Measuring offline advertising doesn't require an analytics department. It requires three decisions made before anything goes to print: what the goal is, what trail each placement will leave and what you'll compare the result with. Settle those, and after the campaign you won't be guessing, just choosing what to repeat.
Frequently asked questions
How do you measure offline marketing without an analytics team?
You need three things: a separate QR code or promo code for every placement, a spreadsheet tracking materials handed out, scans, sign-ups and redeemed codes, and a comparison with the period before the campaign or with an area that saw no advertising. Everything else comes down to simple formulas for customer acquisition cost and campaign return.
Are QR code scans a good measure of offline ad performance?
Scans show interest, not sales. Treat them as a middle stage of the funnel and always report them alongside sign-ups and redeemed codes. A campaign with fewer scans but a higher scan-to-customer conversion rate can be the more effective one.
What is a control group in an advertising campaign?
It is a group of people or an area that did not see the advertising but is otherwise similar to the group that did. By comparing how sales changed in both, you separate the effect of the campaign from seasonality, weather and everything else going on at the time.
Which attribution model should you use for offline campaigns?
For small and mid-sized businesses a layered approach works best: hard data from codes as the lower bound of the effect, customer self-reports as a supplement and a control-group test to estimate incremental lift. Web analytics models cannot see anyone who picked up a flyer or looked at a poster, so on their own they undercount offline results.
How long should you track results after an offline campaign ends?
At least for as long as the offer code is valid, plus a few weeks after the campaign, because some people act with a delay. Set the measurement window before launch and stick to it in the report, so that comparisons between campaigns stay fair.