Korant

Time-boxed offers and the two clocks you must never mix

What the numbers say

  1. 01

    In a 20 zone rotation with one live per week, any given zone is live 5% of the time, so 95% of referrals happen outside a live window.

    Arithmetic on a 20 zone rotation cycle with one zone live per week.

  2. 02

    Tying the reward clock to the offer clock therefore pays nothing on 95% of referrals, including ones made minutes before the window closed.

    Derived from the same rotation arithmetic.

  3. 03

    A 30 day referral link validity covers 4.3 weeks, which is 21% of a 20 week rotation cycle, so the reward clock has to be set independently of the cycle.

    Arithmetic on a 30 day link validity against a 20 week rotation cycle.

  4. 04

    The offer clock is evaluated at checkout and the reward clock at order creation, which are 2 distinct moments in an order lifecycle.

    Derived from Shopify discount evaluation and order creation sequencing.

The forty minutes that broke a referral

Asha buys at 14:12 during a live window in her pincode, gets 25% off, and immediately forwards her referral link to the building WhatsApp group. That is exactly the behaviour the entire mechanic was built to produce.

The window closes at 14:30. Rohit, four floors up, opens the message at 14:52 and buys.

He pays full price, which is correct and explainable. Asha earns nothing, which is neither.

She did the referral. It converted. A new customer arrived through her link, and the system paid her nothing because a clock she never saw had moved on.

The next time somebody asks her about the brand, she will mention that the referral thing does not really work. She will be right, and the reason will be a design decision nobody made deliberately.

The two clocks, defined

The confusion comes from both clocks measuring time on the same offer, so they get built as one field.

The offer clock decides whether a discount applies to an order. It belongs to the rotation, it is evaluated at checkout, and it answers a question about the buyer’s delivery address at the moment of payment.

The reward clock decides whether a referral earns. It belongs to the referral link, it is evaluated at order creation, and it answers a question about who introduced the buyer.

Different subjects, different questions, different moments.

The offer clock asks: is this order eligible for a discount right now. The reward clock asks: did this order originate from a valid referral.

Nothing about the second question depends on the first. A referral that converts at full price is still a referral, and the person who made it did the same work as one whose friend caught a live window.

Once you see them as separate questions, the design follows. Once you see them as one campaign with one end date, you get the opening example.

The worked example, minute by minute

TimeEventOffer clockReward clockOutcome
14:00Window opens in pincode 560034Liven/aDiscount available in zone
14:12Asha buys, shares her linkLiveStarts, 30 day validity25% off, link issued
14:30Rotation moves to 560078Closed for 560034UnaffectedZone goes dark
14:52Rohit clicks Asha’s link and buysClosedValid, day 0Full price, Asha earns coins
09 SepPriya clicks the same link and buysClosedValid, day 14Full price, Asha earns coins
12 OctLink reaches day 30n/aExpiresFurther clicks earn nothing

Rohit buys forty minutes after Asha, with the offer already rotated. He pays list price and Asha is still paid.

That is the correct behaviour and it is worth stating as a rule: the discount is a property of the moment, and the referral is a property of the relationship.

Note the second row. Asha’s reward clock starts when her link is issued, not when the window opened and not when it closed. Its lifetime is measured in days against her link, entirely independently of a rotation measured in weeks against zones.

Four ways brands conflate them

Each of these ships regularly and each produces a different failure.

Rewards expire with the offer. The opening example. Referrers lose earnings on referrals they made in good faith, and the ones who lose out are disproportionately your most active sharers, since they refer most often and therefore hit the boundary most often.

The offer extends to cover the reward. The mirror error, and worse. To make Rohit’s purchase earn Asha coins, somebody extends the discount to him, which means the zone gate has leaked and the rotation no longer means anything.

The reward requires the friend to receive the discount. Superficially reasonable and quietly catastrophic. In a twenty zone rotation any zone is live around 5% of the time, so this rule pays nothing on roughly 95% of referrals. The referral programme appears broken because it is switched off almost always.

Both clocks stored against one campaign record. The nastiest of the four. Ending the campaign voids coins already earned, taking value away from customers retroactively for a reason invisible to them, and the support tickets that follow have no good answer.

The fourth one is a data model problem rather than a policy problem, which is why it survives design review. Nobody intends to expire earned balances, and the schema does it anyway.

What each clock should attach to

The fix is structural and it is not complicated.

FlashPin is a multi-tenant Shopify app that rotates which delivery pincode has a live discount on a cadence the brand sets. Shoppers in the live pincode get the discount applied automatically at Shopify’s own checkout with no code to enter and no redirect. Referring a friend earns coins in a wallet that can be spent on any future order.

The offer clock attaches to the rotation state: a live zone, a start, an end, held server-side and evaluated at checkout. It is derived from the schedule rather than stored as a flag, so it is reconstructible at any timestamp.

SB&R is a Shopify app for chained referral rewards. Every referral link belongs to someone who has already bought. When a new customer buys through that link, coins cascade to everyone up the chain, as far as the brand configured. Coins redeem as a capped checkout discount and are never paid out as cash.

The reward clock attaches to the referral link: an issue timestamp and a validity period, evaluated when an order is created. Set that validity from your category’s time-to-purchase, not from the rotation cycle.

The mismatch in units makes the point. A 30 day link validity covers 4.3 weeks, which is 21% of a twenty week rotation cycle. There is no sensible way to align those two numbers, and any attempt to align them means one of them is now wrong.

A third clock exists and deserves its own decision: how long earned coins remain spendable. Attach that to the wallet balance, not to the link and not to the rotation, and never let ending a campaign expire it.

The support conversation this prevents

Two independent clocks produce two clean sentences, and the whole design is worth judging by whether support can say them.

To the friend: the offer in your area has closed for now, and it will come round again.

To the referrer: you earned coins for this referral, and you will earn them whether or not your friend caught a live window.

Both are true, neither requires an apology, and neither invites an argument.

Compare that to the conflated version, where support has to explain that the referral did work but did not count, which is a sentence with no honest ending.

Say both things at the point of sharing rather than at the point of complaint. The share screen should state that the friend may or may not catch a live offer and that the referrer earns regardless.

That sentence removes the entire class of ticket, and it costs one line of copy.

Where independence runs out

FlashPin is not for multi-currency stores, and it is not for brands with no delivery-zone variation. Neither limit is about clocks, and both decide whether the rotation exists to have a clock in the first place.

Independence has a real cost that should be named. Paying rewards on referrals that convert at full price means paying more rewards, and the total referral liability is larger than under the conflated design.

That is the correct trade rather than a bug. A referral that converts at full price is more valuable than one that converts at 25% off, so paying for the better outcome and not the worse one would be an odd choice.

Chain depth compounds the liability, since a referral converting at full price still cascades coins upstream. Model that at your configured depth before setting the reward rate rather than after.

The limitation worth sitting with is that clean clocks fix attribution and not motivation. A referrer who understands she earns regardless of the window has one less reason to feel cheated and no additional reason to share in the first place.

Separating the clocks removes a way to lose people you already had. It does not create advocates, and a brand that fixes this and sees no change in referral volume has learned that the clock was never the constraint. The cadence question underneath the rotation is in flash sales without the brand damage, the deadline credibility question is in countdown timers are dead, and the limits worth building on are in scarcity you can defend.

The tool for this · Shopify app FlashPin FlashPin time-boxes the offer and applies it at checkout without a code, so there is nothing to screenshot and share. Also relevant · Shopify app SB&R SB&R handles the chain, the cap, and the append-only ledger underneath it.

Questions people actually ask

What is the difference between a referral window and an offer window?

The offer window decides whether a discount applies to a given order, and it is a property of the rotation. The referral window decides whether a referral earns a reward, and it is a property of the referral link. They answer different questions about different people, and they should expire on different schedules.

Should a referral only earn when the offer is live?

No, and this is the most common design error. In a twenty zone rotation any zone is live around five percent of the time, so tying the reward to the offer means ninety-five percent of referrals earn nothing. The referrer did the work either way and the friend still became a customer.

What happens if a friend buys after the window closes?

The friend pays full price, because the offer clock governs the discount and it has expired. The referrer still earns, because the reward clock governs the referral and it has not. Both outcomes are correct and they should be explained clearly at the point of sharing.

How long should a referral link stay valid?

Long enough to cover your category's decision time and short enough to stay attributable, which for most D2C is between thirty and ninety days. Set it from your own time-to-purchase data rather than from the rotation cycle, since the two are unrelated and matching them recreates the bug.

What is the worst way to conflate the two clocks?

Storing both against a single campaign record. Ending the campaign then voids coins that were already earned, which takes value away from customers retroactively for a reason they cannot see. It is the version that generates the angriest support tickets and the hardest ones to answer.

Written by Nayak — Builds checkout, referral and attribution tooling for Shopify D2C brands