A raffle sale lets you choose how winners are picked. Pure chance, or a small edge for the people who keep buying from you. If you want the second, you need a number that says who the real fans are. This article covers how to build one from data your store already holds.
An entry form tells you almost nothing
An entry gives you an email address, a name, and maybe an address. Guessing reseller intent from those three is mostly guessing wrong.
- Email addresses are free and unlimited
- Names and addresses are usually real even for resellers, because the parcel has to arrive
- IP addresses collide across a household, an office or a mobile carrier
Purchase history, on the other hand, cannot be faked at entry time, because it cannot be created in the moment. That makes it the sturdiest base to build on.
Telling fans apart is not about rejecting entries. It is about ordering priority when stock is short. That distinction matters again under "which error hurts more".
Three metrics from purchase history are enough
More metrics do not make a better score. A rule you cannot explain just looks opaque from the outside. Three are enough in practice.
| Metric | What it shows | On its own |
|---|---|---|
| Order count | Whether they keep coming back | Splitting orders inflates it |
| Lifetime spend | How much they support you | One expensive order catches up |
| Full-price orders | Whether they buy without waiting for a discount | Barely separates anyone in a discount-heavy store |
All three together, because any single one has a shortcut. Order count alone rewards splitting orders. Spend alone is matched by one large order. Adding full-price orders separates the people who show up only during a sale from the people who pay list price.
How far back to look
One or two months is enough. Older history is a weaker signal for whether someone is behind you right now. Bonafan seeds the score from paid orders in the last 60 days at install, then adds to it as new orders are paid.
Build a formula you can publish
A hidden weighting formula looks, from the outside, like something is being rigged. The safe move is a formula that stays sound when published. These are the Bonafan defaults.
- Order count x 2
- Full-price orders x 3
- Lifetime spend divided by 10,000, rounded down
Someone with three full-price orders totalling 45,000 yen scores 3x2 + 3x3 + 4 = 19. Someone with two discounted orders totalling 8,000 yen scores 2x2 + 0 + 0 = 4.
Publishing this costs nothing, because the only way to raise the score is to buy at full price. A formula is safe to publish exactly when its shortcut is also revenue.
Cancellations and refunds subtract what they added. Without that, someone can order, take the refund and keep the score.
Turning a score into odds
Having a score is not the same as using it well. Award winners strictly from the top down and a new customer can never buy anything. That is selection, not a raffle.
Splitting the winners into two pools is the practical answer.
- Pure raffle pool: filled first, at uniform odds, regardless of history, so a newcomer always has a real chance
- Weighted pool: odds scale with the score
Simple proportionality is enough for the weighted pool: weight = 1 + 0.2 x score. At that coefficient, a score of 20 is about five times as likely to win as a score of 0. Five feels earned to a regular and still worth entering for a newcomer.
| Score | Weight | Versus score 0 |
|---|---|---|
| 0 | 1.0 | 1.0x |
| 5 | 2.0 | 2.0x |
| 10 | 3.0 | 3.0x |
| 20 | 5.0 | 5.0x |
The part that matters: a score of 0 weighs 1.0, not 0. At zero, entering cannot win. A first-time customer who works that out does not enter the next one.
Which error hurts more
Any scoring gets some entries wrong. Decide in advance which error you would rather make.
- Letting one reseller entry through: one unit reaches the resale market
- Shutting out one real fan: they leave without knowing why, and may not come back
The second one is harder to undo. So the rule leans towards lifting the people who supported you, not dropping the people who look suspicious. The pure raffle pool exists for the same reason.
Start weak and raise the coefficient once you have seen the results. The side effect of going too strong, fewer entries from new customers, takes a drop or two to show up in the numbers.
Adding signals from outside purchase history
Social follows and community activity are tempting to score, but they behave differently from orders.
- Attributing them to a person means asking entrants to connect an account, which raises the barrier to entering
- What you collect and why has to go into your privacy policy
- Follows and comments, unlike order history, can be manufactured in days
If you add them, keep purchase history as the primary score and treat outside signals as secondary. Every bit of friction you add at entry shrinks the pool.
Excluding only the clear cases
For unambiguous cases, such as bulk entries from one person or orders confirmed to have been resold, use a blocklist. What matters operationally is applying it at draw time rather than at the entry form.
Reject an entry on the spot and the entrant learns which condition caught them, then adjusts. Accept the entry and quietly leave it out of the draw pool, and you hand over no clues.
The order to roll this out
- Run the first drop unweighted, on pure chance, and record entry volume and who won
- Build the score from purchase history and apply it to those entrants to see the distribution, checking for extreme skew
- From the second drop, add weak weighting while keeping the pure raffle pool
- From the third, compare win rates for regulars and newcomers and tune the coefficient
The number to watch is not the win rate for regulars on its own, but the gap between regulars and newcomers. Let it widen too far and newcomers stop entering, which shrinks the pool itself.
- Raffle design: winners, entry window and deadlines — The numbers you set before the draw
- Anti-scalping methods compared — The options other than scoring
- Bonafan user guide — Where weighting and the pure pool are configured
Bonafan builds this score from purchase history for you and splits each draw between the pure raffle pool and the weighted pool.