Enable email receipts in Stripe by turning on 'Successful payments' under Dashboard → Settings → Emails, or by passing receipt_email in your PaymentIntent or Charge API call. Stripe sends a branded receipt automatically after each successful payment. You can customize the receipt appearance in Settings → Branding.
Sending Email Receipts with Stripe
Email receipts confirm to customers that their payment was processed. Stripe can send these automatically after every successful charge. You can enable them globally in the Dashboard, or control them per-payment by setting the receipt_email field in your API calls. Receipts include the amount, description, last four digits of the card, and a link to view the full receipt. Customizing your branding ensures receipts look professional and match your brand.
Prerequisites
- A Stripe account (free to create at dashboard.stripe.com)
- Access to Dashboard → Settings with admin permissions
- Node.js 18 or newer (for API method)
Step-by-step guide
Enable receipts in the Dashboard
Enable receipts in the Dashboard
Go to Settings → Emails in the Stripe Dashboard. Under 'Customer emails', toggle on 'Successful payments'. This sends a receipt for every successful charge to the email on the customer record or the receipt_email on the payment.
Expected result: The toggle is on. Stripe will now send receipts for all successful payments.
Customize receipt branding
Customize receipt branding
Go to Settings → Branding in the Dashboard. Upload your logo, set brand colors, and add your support URL and phone number. These settings apply to all Stripe-sent emails including receipts.
Expected result: Receipt emails show your logo, brand colors, and support contact information.
Set receipt_email via the API
Set receipt_email via the API
When creating a PaymentIntent, pass the receipt_email parameter. This overrides the customer's default email and is useful when the payer's email differs from the customer record.
1const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);23const paymentIntent = await stripe.paymentIntents.create({4 amount: 5000, // $50.00 in cents5 currency: 'usd',6 customer: 'cus_ABC123',7 receipt_email: 'buyer@example.com',8 description: 'Premium Plan - Monthly',9});1011console.log('PaymentIntent created:', paymentIntent.id);Expected result: After the payment succeeds, Stripe sends a receipt to buyer@example.com.
Set receipt_email in Checkout Sessions
Set receipt_email in Checkout Sessions
For Checkout Sessions, Stripe automatically uses the customer's email. You can pre-fill it with customer_email if no customer record exists.
1const session = await stripe.checkout.sessions.create({2 mode: 'payment',3 customer_email: 'buyer@example.com',4 line_items: [{5 price_data: {6 currency: 'usd',7 product_data: { name: 'Widget' },8 unit_amount: 2500, // $25.009 },10 quantity: 1,11 }],12 success_url: 'https://yoursite.com/success',13 cancel_url: 'https://yoursite.com/cancel',14});Expected result: After payment, Stripe sends a receipt to the customer's email address.
Complete working example
1const express = require('express');2const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);34const app = express();5app.use(express.json());67// Create a payment with receipt email8app.post('/api/charge', async (req, res) => {9 try {10 const { amount, email, description } = req.body;1112 const paymentIntent = await stripe.paymentIntents.create({13 amount, // in cents14 currency: 'usd',15 receipt_email: email,16 description: description || 'Payment',17 automatic_payment_methods: { enabled: true },18 });1920 res.json({21 clientSecret: paymentIntent.client_secret,22 id: paymentIntent.id,23 });24 } catch (err) {25 console.error('Payment error:', err.message);26 res.status(500).json({ error: err.message });27 }28});2930// Resend a receipt for an existing charge31app.post('/api/receipts/resend', async (req, res) => {32 try {33 const { chargeId, email } = req.body;3435 // Update the charge with a new receipt_email to trigger resend36 const charge = await stripe.charges.update(chargeId, {37 receipt_email: email,38 });3940 res.json({41 message: 'Receipt will be sent to ' + email,42 receiptUrl: charge.receipt_url,43 });44 } catch (err) {45 res.status(500).json({ error: err.message });46 }47});4849const PORT = process.env.PORT || 3000;50app.listen(PORT, () => console.log(`Server on port ${PORT}`));Common mistakes when enabling email receipts in Stripe
Why it's a problem: Enabling receipts in the Dashboard but not having emails on customer records
How to avoid: Stripe needs an email to send the receipt. Either set receipt_email on the PaymentIntent or ensure the customer record has an email address.
Why it's a problem: Setting receipt_email to an empty string instead of omitting it
How to avoid: Pass null or omit the field entirely if you do not want to override the customer's email. An empty string causes an error.
Why it's a problem: Expecting receipts for failed or incomplete payments
How to avoid: Stripe only sends receipts for successful charges. Failed or pending payments do not trigger receipt emails.
Best practices
- Always include a description on your PaymentIntents — it appears on the receipt and helps customers identify the charge
- Set up your branding (logo, colors, support info) in Dashboard → Settings → Branding before enabling receipts
- Use receipt_email to control exactly who gets the receipt, especially for gift purchases or B2B transactions
- Store the charge.receipt_url from webhooks so you can link customers to their receipts from your app
- Test receipt emails in test mode to verify branding and content before going live
- For subscription invoices, receipts are sent automatically — no need to set receipt_email separately
Still stuck?
Copy one of these prompts to get a personalized, step-by-step explanation.
Write a Node.js Express endpoint that creates a Stripe PaymentIntent with a receipt_email so the customer gets an automatic email receipt after payment. Include amount, currency, and description fields. Use the stripe npm package.
Enable email receipts for my Stripe payments. Set up the PaymentIntent creation to include receipt_email from the customer's profile, and add a way to resend receipts for past charges by updating the charge with a new receipt_email.
Frequently asked questions
Can I customize the content of Stripe receipts?
You can customize branding (logo, colors, support info) but not the receipt template itself. For fully custom receipt emails, disable Stripe receipts and send your own using the charge.succeeded webhook event.
How do I resend a receipt?
Update the charge with a new receipt_email using stripe.charges.update(chargeId, { receipt_email: 'new@email.com' }). Stripe resends the receipt to the new address.
Do Stripe receipts count as tax invoices?
Stripe receipts are payment confirmations, not tax invoices. For tax-compliant invoices, use Stripe Invoicing or Stripe Tax, which generate proper tax documents.
Are receipts sent for test mode payments?
Yes. Receipts are sent in test mode if you have the setting enabled and provide a valid email. This is useful for testing your branding and email flow.
Can I send receipts for refunds?
Enable 'Refunds' under Settings → Emails to send automatic refund confirmation emails. These are separate from payment receipts.
What if I need a custom email notification system beyond Stripe receipts?
For transactional emails with custom templates, multi-language support, or integration with your email provider, the RapidDev team can help build a webhook-driven notification system triggered by Stripe events.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation