The most common tool to nudge a customer to buy again is a coupon. But most coupon programs hand everyone the same broadcast code and the same 20% off. That’s a discount habit, and it trains people to wait for the next sale.

Matched to the moment, a coupon becomes a scheduled reason to come back, and one of the cheapest ways to lift repeat purchases and customer lifetime value (CLV).

This guide covers how to send a coupon with a code that actually scans — native, personalized, no 3rd-party image, and give customers a real reason to come back and repeat purchase.

Build your 1st coupon journey with Pushwoosh

With a scannable barcode inside the message.

Try for free
☝️

Quick framing: this guide covers coupon marketing strategies aimed at customer retentionmake users buy again: repeat purchases, renewals, upgrades (not just open the app).

Send a coupon code that actually scans

A promo code the customer types works fine at an online checkout. But plenty of repeat purchases happen at a counter, in a store, a coffee shop, or a pickup point, and there the code has to be scanned.

A flat coupon image can’t be personalized or tracked, and a text code can’t be scanned at a till at all. That’s the gap between a coupon that redeems and one that stalls at the register.

Email with a 'Something special for you' offer and a scannable barcode with the code 8472 6190 3358 below the product image
🆕

In Pushwoosh, you can now use a barcode block for email and in-app. Drop it into your message, point it at your coupon field, and get a scannable code for each recipient — native, no 3rd-party image. It’s built for exactly this: apps with offline points of sale, where redemption happens at the counter.

Pushwoosh drag-and-drop email editor with the barcode block selected, showing the Code field set to the voucher merge tag, Code 128 symbology, and appearance settings
The barcode block in the Pushwoosh email editor: point the code at a merge tag, pick the symbology, and every recipient gets their own scannable code.

Delivering by push? A swiped-away push won’t be lost, as the message is saved to your app’s Message inbox, so the barcode stays in the app for the customer to open and scan at the register.

Mobile app Message inbox with a coupon message titled 'You won. Or not' and a barcode thumbnail next to the code WELCOME2025-E15
🛠️

For the technical setup, read the docs for the email barcode block and the in-app barcode block.

Why scannable coupons belong in your retention stack

Redeemable offers earn their place at specific lifecycle moments, not as a permanent sale:

  • Welcome offer. A first-purchase code while onboarding intent is at its peak turns a new install into a 1st order.
  • Winback. A lapsed buyer has already paid you once. A personal code tied to their last category is usually enough to reopen the relationship.
  • Geo trigger. Physical proximity to your store is warm intent. A coupon delivered in that five-minute window converts a passer-by into a visit.
  • Loyalty tier reward. A code unlocked at a tier bump makes an abstract status feel like something you can hold.

Each of these maps to a trigger, a channel, and a KPI worth watching:

Offer typeTriggerBest channelKPI to watch
Welcome discountDevice registeredIn-app + email1st purchase rate
Winback code14–30 days inactiveEmail → push fallbackReactivation rate, repeat purchase
Geo offerDwell near locationIn-app (or push)In-store redemption, repeat visits
Tier rewardUpgrade / tier changeIn-app + emailCLV, redemption rate
Offer type
1 / 4
Welcome discount
Trigger
Device registered
Best channel
In-app + email
KPI to watch
1st purchase rate
Offer type
2 / 4
Winback code
Trigger
14–30 days inactive
Best channel
Email → push fallback
KPI to watch
Reactivation rate, repeat purchase
Offer type
3 / 4
Geo offer
Trigger
Dwell near location
Best channel
In-app (or push)
KPI to watch
In-store redemption, repeat visits
Offer type
4 / 4
Tier reward
Trigger
Upgrade / tier change
Best channel
In-app + email
KPI to watch
CLV, redemption rate

Read the table as a routing map: the moment picks the trigger, the trigger picks the channel, and the KPI tells you whether the offer paid for itself. The metric that ties them together is repeat purchase rate, and behind it, customer lifetime value.

📖

For the loyalty-program side — points engines, wallet-based cards, tiers — see loyalty cards for business.

Coupon marketing in action

4 scenarios, same scannable barcode/QR block, different lifecycle moment.

👋 New users: a welcome code they can’t lose

The problem: A 1st-time user gets a welcome discount by push, taps away, and by the time they reach the counter, the code is gone.

The capability: The welcome push notification saves to the Message inbox, where the barcode stays until they redeem it.

Two phone screens: a lock-screen push 'Your 15% code is inside' and the app Message inbox showing the same message with a scannable barcode and the code NORD-15-4F9K2

In Pushwoosh: When a new device registers, send a push: “Welcome — here’s 15% off your first order.” It lands in the Message inbox with the barcode inside, so the user opens the app at checkout and scans it straight off the screen. A 1st purchase, and no lost code.

Pushwoosh Customer Journey Builder flow: First app open triggers a 'Welcome code: 15% off' in-app, then a wait-for-trigger on first purchase, with an email and an inbox reminder on the not-triggered branch
The welcome coupon journey: the in-app carries the code, and the inbox message keeps it available if the first purchase doesn't happen.

🛒 E-commerce & delivery: a winback code that scans offline

The problem: a customer bought twice, then went quiet for 6 weeks. A “we miss you” email with no reason to act gets archived.

The capability: A voucher-pool code in an email, unique per user, tied to their last purchased category.

Winback email 'Here's 15% off your next order' with a barcode, the code NORD-15-4F9K2, a 'Valid until Sep 30' badge, and a Shop now button

In Pushwoosh: Segment buyers inactive 21+ days. Send an email: “Your 15% code is inside — good on your next order.” The barcode renders inline with a unique code the customer scans at pickup or in-store. If email isn’t their reachable channel, the journey falls back to push. The cashier scans it at the counter; the code redeems once and expires.

Pushwoosh journey for buyers inactive 21+ days: a winback email with the code, a wait-for-trigger on code redeemed, an expiry reminder, and a push fallback for users unreachable by email
The winback journey: email first, a reachability check for the push fallback, and an expiry reminder before the code lapses.

💳 Subscription apps: a tier-reward code at the upgrade moment

The problem: a user upgrades to a higher plan and gets a confirmation screen. The moment status changes is the moment to reinforce it, and most apps waste it.

The capability: an in-app message the instant the upgrade event fires, carrying a redeemable perk tied to the new tier.

In-app message 'Your Gold perk is here' with a GOLD UNLOCKED badge, a barcode, and the code GOLD-CAFE-7K2P

In Pushwoosh: on the tier_upgraded event, show an in-app message with a QR block pulling the reward code from a device tag — “Gold unlocked. Scan for your member gift.” One tap in the app, or one scan at a partner location. The reward is specific, immediate, and attached to the status they just earned.

Pushwoosh journey triggered by the tier_upgraded event: a 'Gold unlocked' in-app, a wait-for-trigger on reward redeemed, then an email and a last-day reminder if it isn't
The tier-reward journey: the in-app fires on the upgrade event, and the follow-ups only run for users who haven't redeemed.
💡

Tip: Save the barcode to the Message inbox, too, so the perk waits inside the app if they’d rather redeem it later.

🛍️ Retail + geo: dwell turns into a coupon in hand

The problem: a shopper is standing in your store zone right now, and your app knows it — but a plain push is easy to ignore mid-aisle.

The capability: a geo-dwell trigger that hands over an actual coupon, not just a nudge, while the customer is physically in range.

In-app message 'Scan for 15% off — today only' with a YOU'RE IN-STORE badge, a QR code, and an 'Ends at closing' note

In Pushwoosh: A shopper enters the zone around your flagship and stays. After 3 minutes, the dwell event fires and an in-app message appears: “You’re in-store — scan for 15% off today.” The barcode sits right there in the message, personalized and scannable at the counter.

Pushwoosh journey starting from a 3-minute dwell in a store geozone, split into loyalty member and new visitor branches with different in-app offers and a 2-hour redemption window
The geo-dwell journey: the shopper segment decides the size of the offer, and the code expires at closing.

Geofencing gives you the trigger; the barcode block gives you the redeemable payload.

Build your 1st coupon journey

Every flow above is the same 4 moves. Here’s the shortest path from offer to live campaign in Customer Journey Builder:

  1. Define the offer and the code

    Decide the incentive and how codes are issued — a unique value per user (via {{voucher}} in email or a device tag in-app).

  2. Drop in the barcode block

    In the email or in-app editor, add the barcode block, set the symbology to match where it scans, and point the value at your merge tag or device tag.

  3. Branch the journey

    Set the trigger — inactivity, an upgrade event, a geo-dwell — then route by channel and reachability, with a fallback for users you can't reach on the first channel.

  4. Set the guardrails

    Add an expiry and a goal check so a redeemed code exits the user from the flow.

A few mistakes that quietly kill redemption:

  • No expiry. A code with no deadline gives no reason to act now. Put a date in the copy and in the journey logic.
  • A shared code. One code for the whole list means no per-user tracking, and it’s one screenshot away from your margins. Use a voucher pool.
  • An uploaded image instead of the block. A flat image can break in the inbox, can’t be personalized, and can’t be tracked. The native block fixes this problem.

Where should the code live?

You can use coupons with a code in 3 places, depending on the level of persistence. So, pick by how long the code needs to stick around:

  • In the message. The barcode block in an email or in-app: instant and personalized, for the moment you send.
  • In the Message inbox. The message persists inside your app, so the customer pulls the code up at the till even after the push or in-app are long gone.
  • In a wallet pass. Lives in Apple or Google Wallet — survives an uninstall and can resurface near the store.

Turn offers into repeat revenue with Pushwoosh

A coupon is only as good as the moment it lands and the code that scans. Pushwoosh gives you both: the barcode block renders native, personalized, trackable codes inside email, in-app, or Message inbox, and Customer Journey Builder fires them at the lifecycle moment that turns 1 purchase into the next.

Pick your highest-intent moment — a winback, a tier reward, a shopper near the store — and build the coupon flow behind it. Then watch the redemptions.

Launch your 1st coupon journey
Try for free

FAQ

An image is static, identical for every recipient, and depends on an external URL that can fail to load. The native block renders per user on our side, carries a unique code, and can be tracked to a redemption. Nothing to host, nothing to break.

Valentina Stepanova
Content Marketing Writer at Pushwoosh
Share

Related articles

View all