Warum Gutscheinabläufe still kaputtgehen
- Die E-Mail kommt zu spät. Angebots-E-Mails laufen oft zeitgesteuert über ein Marketing-Tool, Minuten nach der Registrierung, und niemand merkt, wenn daraus eine Stunde wird.
- Der Code funktioniert zu oft. Ein Einmalcode, der zweimal oder nach seinem Enddatum akzeptiert wird, kostet jedes Mal Geld.
- Eine Person, viele Konten. Wer sich erneut als
name+promo1@registriert, bekommt bei vielen Apps ein zweites Willkommensangebot. Siehe Missbrauch von Willkommensangeboten. - Die Details stimmen nicht. Die E-Mail sagt 20 % und der Checkout gibt 10 %, oder die E-Mail sagt nie, wann das Angebot endet. „Endet Sonntag“ und „nur heute“ zählen als Enddatum, ab dem Tag, an dem die E-Mail ankam.
So hilft Proxy Mail QA
- Registriere dich für das Angebot auf deiner Staging-Seite mit einer neuen Adresse.
- Sieh dir den Gutschein an auf der Seite „Konten“ und im Posteingang: den Code mit Kopieren, seinen Rabatt („20 % Rabatt“), sein Enddatum und wie lange nach dem Anlegen der Adresse er ankam. Nach dem Enddatum steht dort „Abgelaufen“, und er bleibt kopierbar, damit du testen kannst, dass der Checkout ihn ablehnt.
- Löse ihn beim Checkout ein mit Testzahlungen und halte dann das Ergebnis im Posteingang fest: Akzeptiert, Abgelehnt oder ein Fehler, mit der Meldung, die deine App angezeigt hat.
- Lies das Urteil. Ein Gutschein, der nach seinem Enddatum akzeptiert wird, als Einmalcode zweimal akzeptiert wird oder für ein Angebot akzeptiert wird, das eine Person schon genutzt hat, schlägt fehl. Ein Fehler erzeugt eine Warnung.
Was zu prüfen ist
- Der Gutschein kommt in der Zeit an, die du versprichst, etwa 5 Minuten nach der Registrierung.
- Der Rabatt im Checkout entspricht der E-Mail.
- Ein Einmalcode wird beim zweiten Mal mit einer klaren Meldung abgelehnt.
- Ein abgelaufener Code wird abgelehnt.
- Die E-Mail sagt, wann das Angebot endet, und hat einen Abmeldelink: Angebote sind Marketing.
In einem Test
const submitted = new Date();await page.getByRole('button', { name: 'Get 20% off' }).click();
// Offers often take minutes: this waits up to 10.const coupon = await qa.waitForCode(address, { type: 'coupon', since: submitted, timeout: 600 });expect(coupon.discount).toBe('20% off');expect(coupon.after_seconds).toBeLessThan(300);
await page.getByLabel('Promo code').fill(coupon.value);await page.getByRole('button', { name: 'Apply' }).click();const first = await qa.recordCouponResult(address, 'accepted', { oneTime: true });expect(first.check?.status).toBe('pass');
// The same code again should be refused.await page.getByLabel('Promo code').fill(coupon.value);await page.getByRole('button', { name: 'Apply' }).click();const again = await qa.recordCouponResult(address, 'rejected', { message: await page.getByRole('alert').innerText() });expect(again.check?.status).not.toBe('fail');Agents, die mit dem MCP server verbunden sind, bekommen dasselbe mit wait_for_code (kind coupon) und record_coupon_result, und der Prompt test_coupon_checkout führt durch die ganze Runde auf Staging.