Direct Mail Marketing ROI: How to Track Calls, Leads, and Sales from Every Postcard
Summary
Best for: any local business mailing postcards that wants proof before spending more.
Fastest win: put a dedicated tracking phone number on each campaign (or each postcard version).
Simple rule: if you can’t tie a lead to a mailer in 10 seconds, your tracking is too complicated.
Direct mail works best when it becomes a repeatable system, not a one-time gamble. The problem is most businesses don’t actually know what their postcards produced, so they either stop too soon or keep mailing without improving.
This guide gives you a simple way to track responses (calls + web visits), turn those into leads, and then tie them to sales and revenue, so you can calculate ROI and confidently do more of what’s working.

What “ROI” really means for postcard marketing
ROI is just a fancy way of asking: “Did I get more money out than I put in?”
Here are the only numbers you need to run direct mail like a grown-up:
- Pieces mailed (how many postcards went out)
- Responses (calls, form fills, quote requests, coupon redemptions)
- Leads (qualified opportunities, real people who might buy)
- Sales + revenue (closed deals and the dollars)
- Total campaign cost (printing + postage + design + tools)
The core formulas (keep these in a notes doc)
- Response rate = Responses ÷ Pieces mailed
- Lead rate = Leads ÷ Pieces mailed
- Conversion rate = Sales ÷ Leads
- Cost per lead (CPL) = Campaign cost ÷ Leads
- Cost per acquisition (CPA) = Campaign cost ÷ Sales
- ROI = (Revenue − Campaign cost) ÷ Campaign cost
The goal isn’t perfect attribution. The goal is consistent tracking so you can improve campaign to campaign.
Step 1: Track every postcard call (the fastest path to ROI)
If you do only one thing, do this: use a dedicated phone number that appears only on that postcard campaign.
Why it works: - Calls are usually your highest-intent responses. - A unique number makes attribution automatic. - You can track call volume, missed calls, and outcomes.
The simple setup
- Get a tracking number that forwards to your main line.
- Put that number on the postcard as the primary CTA.
- Name the number after the campaign (example: “June 6x11 Roof Offer” or “Kitchen Remodel – Oak Park”).
- Log outcomes:
- Lead (qualified / not qualified)
- Appointment set (yes/no)
- Sale closed (yes/no)
- Revenue (if closed)
Staff script (so calls don’t get wasted)
Train whoever answers the phone to capture one line of attribution:
- “Just curious: did you call from our postcard or online?”
If they say postcard, your CRM note can be: Source = Postcard / Campaign = [Campaign Name].
Most ROI “problems” are actually missed calls and slow follow-up problems. If your phone coverage is weak, fix that before you judge the postcard.

Step 2: Track web leads with a dedicated URL + QR code (and UTMs)

Not everyone wants to call. A lot of people will: - scan a QR code, - visit your site later, - fill out a form at night, - or check reviews first.
To track that traffic, you need a unique destination for your postcard.
What to put on the card
Use both: - A short vanity URL (easy to type) - A QR code (easy to scan)
Example structure:
- yourcompany.com/spring (vanity URL)
- QR code points to the same page
Add UTMs (so analytics doesn’t lump it into “Direct” traffic)
UTMs are just tags added to a link. They help tools like Google Analytics identify where the visit came from.
Use something like Google’s Campaign URL Builder: - https://ga-dev-tools.google/campaign-url-builder/
Common UTM pattern for postcards:
- utm_source=directmail
- utm_medium=postcard
- utm_campaign=june_offer
- utm_content=version_a (if you’re A/B testing)
Then your QR code should link to the UTM version, even if the printed vanity URL is clean.
Landing page rule (this is where most people mess up)
Your postcard should not send people to your homepage.
Send them to a simple landing page that matches the mailer: - Same headline - Same offer - Same CTA - A short form (name, phone, address, message)
If you want a practical direct mail mindset + cadence, our roofing playbook includes a simple tracking section you can copy: - https://neighborhoodpostcards.com/knowledgecenter/articles/direct-mail-for-roofers
Step 3: Use coupon/offer codes (especially for in-person or “I didn’t call” sales)
Offer codes are old-school: and that’s why they’re great. They don’t rely on someone clicking a link.
Use an offer code when: - you sell in-store, - you take a lot of “I’m not sure where I saw you” calls, - or you want a clean way to attribute sales.
Make the code campaign-specific
Good examples:
- JUNE25
- NEWNEIGHBOR
- FREEINSPECT
Bad examples:
- SAVE10 (you’ll reuse it and lose attribution)
Make redemption part of the process
- Online: code required at checkout (or at form submission)
- Phone: “What code do you have?” (and log it)
- In-person: POS note field (code recorded)
Pro tip: if your offer is “Free estimate” (not code-friendly), add a code anyway for tracking. Example: “Mention code OAKPARK to get priority scheduling.”
Step 4: Close the loop in your CRM (and do a simple matchback)
Even with perfect phone numbers and QR codes, some people will: - Google you instead of using the URL - call the number they find on your website - ask their spouse to “look you up later”
That’s why you need two extra habits: CRM source tracking and matchback.
CRM source tracking (keep it simple)
Create two fields: - Source (Postcard, Google, Referral, Yard sign, etc.) - Campaign (June-EDDM-Route-123, July-Targeted-98103, etc.)
Your rule: - Every new lead must have Source + Campaign before it’s marked “qualified.”
Matchback (the easy version)
Matchback means: compare your mailed list to your new customers during a defined window.
Simple approach: 1. Pick a window (usually 30–60 days after mail hits homes). 2. Export the addresses you mailed. 3. Export new customers during that window. 4. Match by address (or at least ZIP + street).
This catches sales where the customer didn’t use your tracking number, QR, or code: but they still bought after being mailed.
Don’t use matchback to inflate numbers. Use it to avoid undercounting what the postcard influenced.

Step 5: Build a one-page ROI report you can reuse every month
You don’t need a complicated dashboard. You need a repeatable worksheet.
What to track (copy/paste this)
Campaign info - Campaign name: - Drop date: - Target area: - Pieces mailed: - Total cost:
Responses - Calls to tracking number: - Form fills (landing page): - QR scans (optional if you track it separately): - Coupon/code redemptions:
Lead quality - Qualified leads: - Appointments set: - Estimates sent:
Sales - Sales closed: - Revenue: - Gross profit (optional but better):
How to use it
- Fill it out weekly for the first 3–4 weeks after a drop.
- At day 30 (and again at day 60), finalize results.
- Decide one improvement for the next mailer:
- Better offer
- Stronger CTA
- Tighter targeting
- More repeats to the same neighborhood
- Faster follow-up
If you’re sending to new neighborhoods often, you’ll learn slower. If you mail the same area repeatedly, your ROI usually improves because recognition compounds.
Common tracking mistakes (and the quick fix)
- Using one phone number for everything : Use a unique number per campaign (or at least per channel).
- Sending people to the homepage : Use a dedicated landing page that matches the postcard.
- No one logs “how they heard about you” : Add Source + Campaign fields and make it mandatory.
- Judging results too early : Many campaigns close in weeks 2–6, not day 2.
- Changing 10 things at once : Change one variable per drop (offer, headline, format, targeting, etc.).
Next steps (do this in order)
- Pick one tracking method you’ll implement this week (dedicated phone number is easiest).
- Add a landing page + QR code for the next drop.
- Make your team log Source + Campaign in your CRM.
- Run the same postcard into the same area 2–3 more times and compare results.
Final Recommendation
Ready to win more customers with less pressure?
If you want clean, confidence-building ROI numbers from postcards, run this simple loop: 1 campaign = 1 tracking phone number + 1 landing page + 1 offer code + CRM logging. Then repeat the campaign into the same neighborhood so you can improve it instead of constantly starting over.