Por qué los flujos de cupones fallan sin avisar
- El correo llega tarde. Los correos de ofertas suelen pasar por una herramienta de marketing con un horario, minutos después del registro, y nadie lo nota cuando se convierte en una hora.
- El código funciona demasiadas veces. Un código de un solo uso aceptado dos veces, o después de su fecha de fin, cuesta dinero cada vez.
- Una persona, muchas cuentas. Registrarse de nuevo como
name+promo1@consigue una segunda oferta de bienvenida en muchas apps. Consulta abuso de ofertas de bienvenida. - Los detalles están mal. El correo dice 20% y el pago da 10%, o el correo nunca dice cuándo termina la oferta. “Termina el domingo” y “solo hoy” cuentan como fecha de fin, desde el día en que llegó el correo.
Cómo ayuda Proxy Mail QA
- Regístrate para la oferta en tu sitio de staging con una dirección nueva.
- Ve el cupón en la página Cuentas y en la bandeja de entrada: el código con Copiar, su descuento (“20% de descuento”), su fecha de fin y cuánto tardó en llegar desde que se creó la dirección. Pasada su fecha de fin aparece como “Vencido” y se puede seguir copiando, para que pruebes que el pago lo rechaza.
- Aplícalo en el pago con pagos de prueba y luego registra el resultado en la bandeja de entrada: Aceptado, Rechazado o un error, con el mensaje que mostró tu app.
- Lee el veredicto. Falla un cupón aceptado después de su fecha de fin, aceptado dos veces siendo de un solo uso, o aceptado para una oferta que una persona ya reclamó. Un error da una advertencia.
Qué comprobar
- El cupón llega dentro del tiempo que prometes, por ejemplo 5 minutos después del registro.
- El descuento en el pago coincide con el correo.
- Un código de un solo uso se rechaza la segunda vez, con un mensaje claro.
- Un código vencido se rechaza.
- El correo dice cuándo termina la oferta y tiene un enlace para darse de baja: las ofertas son marketing.
En una prueba
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');Los agentes conectados al MCP server obtienen lo mismo con wait_for_code (kind coupon) y record_coupon_result, y el prompt test_coupon_checkout recorre la ronda completa en staging.