PAYMENTS AND RECEIPTS

How to send Stripe receipt emails without duplicate messages

Map Stripe payment and checkout events to the right receipt, verify real transactions and use stable identifiers to avoid duplicate email requests.

To send a Stripe receipt through Emailer API, verify the real supported Stripe transaction, use the approved receipt template and keep a stable send idempotency key for retries. Also decide whether Stripe or your application is responsible for the receipt. Two separate systems sending the same notification can create duplicates even when each system handles retries correctly.

Choose a payment receipt or an order confirmation

A payment receipt and a paid-order confirmation use different evidence. Emailer API currently supports live Stripe verification for these financial emails; an application callback alone cannot authorize them. Use the event and identifier for the message you actually intend to send.

Emailer API eventRequired Stripe evidenceTemplate identifier
payment.receiptcharge.succeeded; captured positive-value unrefunded charge and exact provider-record emailPAYMENT is the ch_ charge ID
order.confirmedSupported paid, complete, positive-value Checkout Session in payment modeORDER is the cs_ session ID

Verify the incoming event and connect read access

If your app receives Stripe webhooks, verify the Stripe signature according to Stripe’s documentation before acting on the event. Design the handler for duplicate deliveries and events arriving out of order. Receiving a webhook is not a reason to skip Emailer API’s own financial-event verification.

Connect the supported restricted live Stripe key with read access to Events, Charges and Checkout Sessions using the secure field. Emailer API encrypts the key and makes read requests. Never paste the key into an assistant conversation or put it in browser code.

For Checkout, the documented supported events are checkout.session.completed and checkout.session.async_payment_succeeded, with the required paid session state. Free, incomplete and test-mode transactions do not qualify for this live sending path.

Make one system responsible for each notification

Example: your business already sends Stripe receipts, and you add an Emailer API receipt after the same payment. The customer could receive two messages even if neither request is technically a retry. Review your existing Stripe receipt configuration and application notifications before enabling another receipt path.

Decide whether you need a payment receipt, a distinct order confirmation or both. If both are useful, make their purposes clear to the customer. Keep an application record connecting the source transaction, message type and send result; do not use a new random business-event identifier on every webhook delivery.

Validate the exact message, then persist the send identity

Install the approved fixed template on the verified domain and obtain event authorization for the exact recipient and content. Financial events must satisfy the documented freshness checks, including the 15-minute event window. Validation checks eligibility without sending; it is not a reservation of future capacity.

Persist the source event ID, authorization ID and send Idempotency-Key. Retry uncertain email admission using the same key and identical payload within the documented 24-hour replay window. Changing content or inventing another key is not a reliable way to recover an unknown outcome.

Reconcile acceptance with the later result

A 202 response means queued. Keep the returned email identifier and inspect delivery logs or verified signed webhook events for the later outcome. Avoid generating another receipt solely because the first request has not yet produced a delivery event.

If verification, capacity or suppression blocks the request, inspect the actual check and reconcile the transaction state. Do not change a payment date or transaction identifier to make an old event appear fresh. Use the current API contract for recovery decisions rather than assuming every payment notification can be resent indefinitely.

Common questions

Can I use an application callback to verify a payment?

Not for Emailer API’s current financial receipt and paid-order paths. They require the supported Stripe verification.

Does idempotency prevent two different systems from emailing?

No. It controls retries of a request within the documented API contract. You still coordinate notification ownership across Stripe and your application.

Continue with a related guide

Sources and next steps

Start free with setup help included · Read current plan limits

Reviewed by the Emailer API editorial assistant against the linked documentation. This guide explains the documented workflow; it is not a report of a new integration test.

YOUR NEXT STEP

Bring your idea.
We’ll help with the email.

Create an account. Choose your first email. Get guided through the setup.

Start building for free