
Context: Three Stores, 41 Coupon Codes, and No Way to Tell Which Branch Sold What
Picture a hypothetical multi-outlet homeware and F&B brand in Johannesburg running a shop-local push across three stores. Marketing has 41 live coupon codes in a spreadsheet. Google Merchant Center promotions are live with no promotion_id captured in analytics. The POS cannot reconcile a redemption to a branch. One code meant for a single outlet has surfaced on a deals aggregator. This is not a creative failure - it is a measurement failure. The coupon is the unit of analysis. Until every code ties to a branch, a channel, and a customer cohort, local deal marketing is guesswork.
Why a Local Deal Is a Measurement Problem Before It Is a Creative Problem
A branch-level discount is a controlled experiment: change price for a defined group and observe the response. Without clean code architecture you cannot isolate the branch effect from the channel effect or organic demand. Most brands fire zero promotion-level telemetry, so a redemption gets attributed to whatever channel the last click happened to be. Redesign codes and tracking first; the creative can follow.
Offer Design: Choosing the Discount Structure That Fits Footfall vs Online
Two questions decide the discount shape: are you buying a store visit or an online order, and do you need to protect full-price buyers? For footfall, a minimum-spend coupon (e.g., R200 off a R1,000 in-store basket) drives basket size and is harder to abuse online. For online, percentage-off codes with a capped discount limit exposure. Avoid automatic discounts if you need code-level attribution.
Blue info callout: Automatic discounts trade attribution for convenience. They apply without a code, so you lose the ability to tie the redemption to a specific campaign, channel, or branch. Use them only for broad, untracked promotions.
Distribution Mechanics: Where a Locally Scoped Deal Can Actually Live
| Channel | Good for | Attribution | Leakage risk |
|---|---|---|---|
| Owned email/SMS | Direct reach to known customers | High (unique codes) | Medium (forwards) |
| In-store POS and receipt print | Capture offline intent | High (tied to transaction) | Low (if restricted) |
| Google Merchant Center promotions | Surface offers on Shopping ads and free listings | Medium (promotion_id required) | Medium (visible to all) |
| Meta offer ads | Reach local audiences with deal creative | Medium (placement-level) | High (sharing) |
| Amazon coupons | Marketplace deal visibility | Low (Amazon owns data) | Low (platform-controlled) |
| Deal aggregators/newsletters | Volume and discovery | Low (aggregator reports only) | Very high (codes spread) |
| Affiliate networks | Performance-based reach | High (tracking links) | Medium (cookie stuffing) |
Code Architecture: The Naming Convention That Buys You Attribution Resolution
Adopt a code structure that encodes branch, channel, and cohort. For example, JHB-NORTH-EML-2025W14 tells you this is the Johannesburg North branch, email channel, week 14 of 2025. Paired with a promotion_id in GA4, you can join redemptions to the exact campaign.
BRANCH-CHANNEL-COHORT
Example: JHB-NORTH-EML-2025W14
Branch: JHB-NORTH (store identifier)
Channel: EML, SMS, POS, GMC, META, AMZ
Cohort: 2025W14 (year-week or audience segment)Green tip: Promotion_id discipline - ensure every coupon code has a matching promotion_id in GA4 and Merchant Center. This single field unlocks cross-channel deduping and branch-level reporting.
Constraining Leakage: Keeping a Branch Code Inside Its Trade Area
A code meant for one outlet must not be redeemable at another or online without restriction. Use geo-restriction at checkout (IP or shipping address checks) and set usage limits per code. For online redemptions, validate that the shipping address falls within the branch's trade area. For in-store, require the code to be presented on a device or receipt. This prevents a single code surfacing on an aggregator and eroding margin across all stores.
Amber warning: Code leakage to aggregators and geo-restriction at checkout - without geo-restriction, a branch-specific code can be redeemed anywhere, destroying both attribution and margin. Set usage limits and validate shipping addresses against the trade area.
Explore the framework further with our conversion rate optimisation services.
Tracking Plumbing: GA4 promotion_id, Server-Side Capture and the POS Join
GA4 has a recommended ecommerce event for promotions that carries promotion_id, promotion_name, creative_name, and creative_slot. Most brands fire zero promotion-level telemetry. Implement this event on your deal landing pages and checkout, then use a GTM server-side container to keep coupon_id attached when the redemption happens on a different domain (aggregator, affiliate, POS). Server-side tracking is essential because third-party cookies often do not survive the journey.
For the POS join, export a daily transaction log that includes coupon code and store ID, then match it to your GA4 promotion_id via a shared key. This is the only way to reconcile online and offline redemptions to the same campaign.
The Break-Even Lift Formula: When a Coupon Campaign Pays for Itself
A discount reduces margin per unit. To be margin-neutral, the promotion must generate enough incremental volume to offset that reduction:
Break-even incremental lift = Discount % / (Gross margin % - Discount %)
Example: 20% discount, 50% gross margin
Lift = 0.20 / (0.50 - 0.20) = 0.20 / 0.30 = 66.7%
So you need at least a 67% increase in units sold to maintain gross profit.If your average order value is R500 and gross margin is 50% (R250), a 20% discount cuts margin to R150. You need to sell 67% more units to break even. Discounting full-price buyers is value-destroying; target only price-sensitive segments.
Amber warning: The formula assumes no cannibalisation. If your coupon is redeemed by customers who would have bought at full price, the effective margin loss is higher. Always compare against a holdout group.
Incremental Margin vs Reported Redemption: Deduping Against Organic Demand
Reported redemption counts include organic demand. To isolate incremental margin, run a geo holdout: withhold the coupon from a matched control store for the campaign period. The difference in sales between test and control is your incremental lift. Apply your margin percentage to that lift to get incremental margin - the only number that matters for budget decisions.
Reconciling Three Numbers: Aggregator Reports, GA4 and Till Slips
Aggregators report clicks or claimed redemptions, GA4 reports promotion events, and the POS reports actual redemptions. These will never match perfectly. Build a reconciliation table that compares the three by code and branch, and investigate variances above a threshold (e.g., 10%). Common causes: aggregator attribution windows, GA4 event firing errors, and POS manual overrides. This process is core to our custom reporting approach.
South African Compliance Guardrails: POPIA, the CPA and the ARB Code
POPIA requires a lawful basis for direct marketing via email or SMS - consent is typical. The Consumer Protection Act 68 of 2008 prohibits bait marketing; promotions must be honest about availability, and 'while stocks last' without reasonable stock is a risk. The ARB Code of Advertising Practice requires coupon and deal claims to be substantiable. Get all terms reviewed by your legal team; this is not legal advice.
A Reporting Model You Can Maintain Every Month
Create a monthly dashboard with four columns: branch, channel, redemptions, incremental margin. Populate redemptions from the reconciled POS and GA4 data, and incremental margin from the holdout calculation. Review variances and adjust code allocation. This model scales without adding headcount. See how this applies to your store by exploring our CRO services.



