# How to enable email receipts in Stripe

- Tool: Stripe
- Difficulty: Beginner
- Time required: 5 minutes
- Compatibility: Stripe API v2024-12+, Node.js 18+, Stripe Dashboard
- Last updated: March 2026

## TL;DR

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.

## Before you start

- 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

### 1. 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.

### 2. 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.

### 3. 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.

```
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);

const paymentIntent = await stripe.paymentIntents.create({
  amount: 5000, // $50.00 in cents
  currency: 'usd',
  customer: 'cus_ABC123',
  receipt_email: 'buyer@example.com',
  description: 'Premium Plan - Monthly',
});

console.log('PaymentIntent created:', paymentIntent.id);
```

**Expected result:** After the payment succeeds, Stripe sends a receipt to buyer@example.com.

### 4. 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.

```
const session = await stripe.checkout.sessions.create({
  mode: 'payment',
  customer_email: 'buyer@example.com',
  line_items: [{
    price_data: {
      currency: 'usd',
      product_data: { name: 'Widget' },
      unit_amount: 2500, // $25.00
    },
    quantity: 1,
  }],
  success_url: 'https://yoursite.com/success',
  cancel_url: 'https://yoursite.com/cancel',
});
```

**Expected result:** After payment, Stripe sends a receipt to the customer's email address.

## Complete code example

File: `receipts-example.js`

```javascript
const express = require('express');
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);

const app = express();
app.use(express.json());

// Create a payment with receipt email
app.post('/api/charge', async (req, res) => {
  try {
    const { amount, email, description } = req.body;

    const paymentIntent = await stripe.paymentIntents.create({
      amount, // in cents
      currency: 'usd',
      receipt_email: email,
      description: description || 'Payment',
      automatic_payment_methods: { enabled: true },
    });

    res.json({
      clientSecret: paymentIntent.client_secret,
      id: paymentIntent.id,
    });
  } catch (err) {
    console.error('Payment error:', err.message);
    res.status(500).json({ error: err.message });
  }
});

// Resend a receipt for an existing charge
app.post('/api/receipts/resend', async (req, res) => {
  try {
    const { chargeId, email } = req.body;

    // Update the charge with a new receipt_email to trigger resend
    const charge = await stripe.charges.update(chargeId, {
      receipt_email: email,
    });

    res.json({
      message: 'Receipt will be sent to ' + email,
      receiptUrl: charge.receipt_url,
    });
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`Server on port ${PORT}`));
```

## Common mistakes

- **Enabling receipts in the Dashboard but not having emails on customer records** — undefined Fix: Stripe needs an email to send the receipt. Either set receipt_email on the PaymentIntent or ensure the customer record has an email address.
- **Setting receipt_email to an empty string instead of omitting it** — undefined Fix: Pass null or omit the field entirely if you do not want to override the customer's email. An empty string causes an error.
- **Expecting receipts for failed or incomplete payments** — undefined Fix: 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

## 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.

---

Source: https://www.rapidevelopers.com/stripe-guide/how-to-enable-email-receipts-in-stripe
© RapidDev — https://www.rapidevelopers.com/stripe-guide/how-to-enable-email-receipts-in-stripe
