12 Ecommerce Email Templates / Transactional

Free React Email Order Confirmation Template

Build an order confirmation email template with React Email — line items, totals, shipping address and delivery window. Free playground.

Sample subject
Order DC-48210 confirmed
Format
React Email TSX · Free
Order Confirmation React Email template preview

Template details

What this order confirmation template includes

Build an order confirmation email template with React Email — line items, totals, shipping address and delivery window. Free playground. The source is standard TypeScript and React Email, so it can be sent with Resend or rendered to HTML for another email provider.

  • Production-ready transactional email structure
  • Editable in the visual React Email playground
  • Free TSX source for personal and commercial projects

How to use it

  1. 1. Customize the copy and styles in the playground above.
  2. 2. Export or copy the typed TSX source.
  3. 3. Pass dynamic props and send it from a server route with your email provider.
Follow the Resend and Next.js implementation guide

React Email TSX source

Free for personal, commercial, and client projects under the site license.

View full source code
import * as React from 'react';

import {
  Band,
  Brand,
  Columns,
  Display,
  EmailLayout,
  Eyebrow,
  Figure,
  LineItem,
  LineItems,
  OutlineButton,
  Prose,
  Rule,
  TotalRow,
  Totals,
  colors,
  tnum,
} from './components';

export interface OrderConfirmationEmailProps {
  brand?: Brand;
  subject?: string;
  preview?: string;
  eyebrow?: string;
  headline?: React.ReactNode;
  intro?: React.ReactNode;
  items?: LineItem[];
  totals?: TotalRow[];
  shipping?: {
    /** Heading over the address. */
    eyebrow: string;
    /** One line per line of the address. */
    address: string[];
  };
  delivery?: {
    eyebrow: string;
    /** The window, set large in the heading face. */
    window: string;
    cta: { label: string; href: string };
  };
  /** The closing offer to change something before it ships. */
  amend?: {
    body: string;
    cta: { label: string; href: string };
  };
}

/**
 * Order confirmation — the receipt. Everything the customer needs to check is
 * above the fold: what they bought, what they paid, where it is going and
 * when it lands.
 */
export function OrderConfirmationEmail({
  brand,
  subject = 'Order DC-48210 confirmed',
  preview = 'Roasting Monday. Shipping Tuesday. Nothing required from you.',
  eyebrow = 'Order confirmed · 23 August 2026',
  headline = (
    <>
      Thank you.
      <br />
      It is happening.
    </>
  ),
  intro = (
    <>
      Order <span style={{ ...tnum, color: colors.ink }}>DC-48210</span> is in
      the queue. We roast Monday morning and it leaves the building Tuesday.
    </>
  ),
  items = [
    {
      image: {
        src: 'https://images.unsplash.com/photo-1559056199-641a0ac8b55e?w=168&h=168&q=75&auto=format&fit=crop',
        alt: 'Solstice',
      },
      name: 'Solstice',
      meta: '12 oz · Whole bean',
      quantity: 1,
      price: '$21.00',
    },
    {
      image: {
        src: 'https://images.unsplash.com/photo-1524350876685-274059332603?w=168&h=168&q=75&auto=format&fit=crop',
        alt: 'Ethiopia Guji',
      },
      name: 'Ethiopia Guji',
      meta: '12 oz · Whole bean',
      quantity: 1,
      price: '$26.00',
    },
    {
      image: {
        src: 'https://images.unsplash.com/photo-1504674900247-0877df9cc836?w=168&h=168&q=75&auto=format&fit=crop',
        alt: 'Wildflower Honey',
      },
      name: 'Wildflower Honey',
      meta: '340g jar',
      quantity: 1,
      price: '$12.00',
    },
  ],
  totals = [
    { label: 'Subtotal', value: '$59.00' },
    { label: 'Shipping (Standard, 2–4 days)', value: '$0.00' },
    { label: 'Tax', value: '$5.24' },
    { label: 'Paid · Visa ending 4417', value: '$64.24', emphasis: true },
  ],
  shipping = {
    eyebrow: 'Shipping to',
    address: [
      'Marguerite Oyelaran',
      '44 Provost Street, Apt 3R',
      'Brooklyn, NY 11222',
      'United States',
    ],
  },
  delivery = {
    eyebrow: 'Estimated delivery',
    window: 'Thu 27 – Sat 29 Aug',
    cta: { label: 'Track this order', href: '#' },
  },
  amend = {
    body: 'Need to change the grind, the address, or your mind? Reply within 24 hours and we can still catch it.',
    cta: { label: 'Manage order', href: '#' },
  },
}: OrderConfirmationEmailProps = {}) {
  return (
    <EmailLayout brand={brand} subject={subject} preview={preview}>
      <Band padding="36px 40px 28px" align="center">
        <Eyebrow>{eyebrow}</Eyebrow>
        <Display size={40}>{headline}</Display>
        <Prose margin="16px 0 0">{intro}</Prose>
      </Band>

      <Band padding="0 40px">
        <Rule />
      </Band>

      <Band padding="6px 40px 30px">
        <LineItems items={items} />
        <Totals rows={totals} />
      </Band>

      <Band tone="paper" padding="30px 40px">
        <Columns
          left={
            <>
              <Eyebrow>{shipping.eyebrow}</Eyebrow>
              <Prose
                size={14}
                lineHeight={1.7}
                margin="0"
                color={colors.ink}
                figures
              >
                {shipping.address.map((line, index) => (
                  <React.Fragment key={index}>
                    {index > 0 ? <br /> : null}
                    {line}
                  </React.Fragment>
                ))}
              </Prose>
            </>
          }
          right={
            <>
              <Eyebrow>{delivery.eyebrow}</Eyebrow>
              <Figure size={26} letterSpacing="normal" margin="0 0 12px">
                {delivery.window}
              </Figure>
              <OutlineButton href={delivery.cta.href}>
                {delivery.cta.label}
              </OutlineButton>
            </>
          }
        />
      </Band>

      <Band padding="30px 40px 36px" align="center">
        <Prose size={14} margin="0 0 16px">
          {amend.body}
        </Prose>
        <OutlineButton href={amend.cta.href} align="center">
          {amend.cta.label}
        </OutlineButton>
      </Band>
    </EmailLayout>
  );
}

export default OrderConfirmationEmail;

Related templates

More from 12 Ecommerce Email Templates.

View the complete bundle