The versions to try
| Version | Example | Reaches |
|---|---|---|
| Plain | k3f9x2@mailclub.dev |
The inbox |
| Plus-tag | k3f9x2+promo1@mailclub.dev |
The same inbox |
| Capitals | K3F9X2@mailclub.dev |
The same inbox |
Any +tag works, and the inbox shows which version each email went to. Agents get the versions that deliver from get_address_variants.
Test it
- Sign up for the offer with the plain address and note the coupon.
- Sign up again with the plus-tag version, then with capitals, in a private window each time so no session carries over.
- Look at the inbox. Each email shows which version it went to. If a second coupon came, its
offer_reusecheck fails and the Accounts page warns that the welcome offer went out more than once.
The check also says whether the coupons differ (the app issued a new one each time) or are the same shared code, where it’s up to checkout to refuse a second use. Record what checkout did with coupon results: a coupon accepted for a reused offer fails.
In a test
const tagged = address.replace('@', '+promo1@');
let submitted = new Date();
await signUpForOffer(page, address);
await qa.waitForCode(address, { type: 'coupon', since: submitted, timeout: 600 });
submitted = new Date();
await signUpForOffer(page, tagged);
// The same person: no second coupon should come.
await qa.expectNoEmail(tagged, { since: submitted, type: 'code', subtype: 'coupon', timeout: 300 });
expect((await qa.offers(address)).passed).toBe(true);
Agents get the same with get_address_variants, wait_for_code (kind coupon) and check_offers, and the test_offer_reuse prompt walks through it.