Home Dynamic QR Split Testing

Split Testing

Test two landing pages without printing two codes.

NORTH LINE put one card in every parcel of the autumn run, twenty thousand of them, all carrying the same code. Nobody knows yet whether the card should open the care guide or the voucher, and the cards are already in boxes.

The scanner is

The rule engine

ScanEvery scan enters hereA/B split50 / 5050 / 501Care guideCare guide2VoucherVoucherCare guideCare guideexample.com/insert/careexample.com/insert/careVoucherVoucherexample.com/insert/voucherexample.com/insert/voucher

What the scanner gets

Care guide

The care guide. Nothing about this scanner chose it. The hash did.

Sticky is the default: the bucket is a hash of the connecting address and the user agent together with the code and the rule, so the same person scanning twice sees the same page rather than flipping between them. A phone moving from wifi to mobile data can rebucket, which is the honest limit of doing this without a cookie.

Get this wrong and the same customer sees a different page every time they scan and stops trusting the card. Twenty thousand of them are already in boxes.

no subscription · pay per scan · nothing to cancel

The print run is fixed. The hypothesis does not have to be.

Testing anything on printed material normally means committing to the test at the printer, which is the one moment you know least about what works.

  • Two codes on two batches means the batches differ by more than the thing you wanted to test.
  • Weights fixed at print time keep sending half the traffic to a variant you already know is losing.
  • A reader who scans twice sees a different page and stops trusting the code.
  • Ending the test means reprinting, so tests quietly run forever.

What NORTH LINE decided after the cards were boxed

  1. Name the variants and their weights

    Weights are relative rather than percentages, so 50 and 50 behaves the same as 1 and 1, and adding a third variant does not require rewriting the first two.

    { "variants": [{"name":"A","weight":50}, {"name":"B","weight":50}] }
  2. Sticky is the default

    The variant is chosen by hashing the scanner together with the code and the rule. The same person scanning the same code lands on the same variant every time.

  3. Or reroll on every scan

    Random mode picks fresh each time, which suits rotating a set of equivalent destinations rather than measuring which one wins.

What twenty thousand identical cards can still decide

  • Weighted, not just even split

    Send a tenth of scans to a risky variant and the rest to the known-good one. Weights are relative and editable any time.

  • The same customer keeps their page

    A returning reader keeps their variant, so the experience stays coherent and the measurement stays honest.

  • Two splits that do not correlate

    The hash is salted per rule, so two split rules in one flow assign independently rather than sending the same people down the same side of both.

  • Move the weights mid-flight

    Shift traffic toward the winner, or stop the test entirely, without touching anything already printed.

  • Counted like any other scan

    Scans are recorded per destination with the same first-party, cookie-free record as everything else.

  • One rule, 5 credits per change

    A split is a custom rule at 5 credits per change. The scans it routes are 1 credit each, the same as any other scan.

Questions

Will the same person see the same variant twice?

In the default sticky mode, yes. The variant comes from a hash of the scanner plus the code plus the rule. The honest limit is that a phone moving from wifi to mobile data can land in the other bucket, because we do this without a cookie.

Can I change the split after the codes are printed?

Yes. The weights live in the rule rather than in the artwork, so you can shift them, add a variant or remove the rule at any point without a reprint.

Do the weights have to add up to one hundred?

No. They are relative, so 3 and 1 gives a three-to-one split, and adding a third variant does not force you to renumber the others.

What identifies a scanner?

The connecting address and user agent, hashed together with the code and rule identifiers. The hash input is used for the pick and is not persisted as a profile, and no cookie is set.

Does this report statistical significance?

No. You get scan counts per destination and the analytics dimensions around them. Deciding when a difference is real is your call, and a tool that declared a winner for you from scan counts alone would be overstating what it knows.