12 Ecommerce Email Templates / Lifecycle

Free React Email Win-back Template

Build a customer win-back email with React Email — comeback offer, what has changed, and a lighter email option. Free playground.

Sample subject
Your grinder has been very quiet
Format
React Email TSX · Free
Win-back React Email template preview

Template details

What this win-back template includes

Build a customer win-back email with React Email — comeback offer, what has changed, and a lighter email option. 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 lifecycle 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,
  Callout,
  CalloutLabel,
  Centered,
  Display,
  EmailImage,
  EmailLayout,
  Eyebrow,
  Figure,
  OutlineButton,
  Plate,
  ProductCardProps,
  ProductGrid,
  Prose,
  Spacer,
  TextLink,
  colors,
} from './components';

export interface WinbackEmailProps {
  brand?: Brand;
  subject?: string;
  preview?: string;
  eyebrow?: string;
  headline?: React.ReactNode;
  hero?: EmailImage;
  body?: string;
  /** The comeback offer. */
  code?: { label: string; value: string };
  cta?: { label: string; href: string };
  /** What has changed since they left. */
  whatsNew?: {
    eyebrow: string;
    products: ProductCardProps[];
  };
  /** The honest alternative to unsubscribing. */
  downgrade?: {
    body: string;
    label: string;
    href: string;
  };
}

/**
 * Win-back — opens on the deep ground because the tone is different from
 * every other email in the sequence, offers a real discount, and ends by
 * offering less email rather than begging for attention.
 */
export function WinbackEmail({
  brand,
  subject = 'Your grinder has been very quiet',
  preview = 'Six months. 20% off. No hard feelings.',
  eyebrow = 'It has been six months',
  headline = (
    <>
      We are not
      <br />
      upset. Slightly
      <br />
      concerned.
    </>
  ),
  hero = {
    src: 'https://images.unsplash.com/photo-1518057111178-44a106bad636?w=1200&h=720&q=75&auto=format&fit=crop',
    alt: 'Hands holding a steaming mug',
    width: 600,
    height: 360,
  },
  body = 'Maybe you found a local roaster. Maybe you switched to tea, which we would respect out loud and question privately. Either way, here is 20% off anything on the site for the next ten days.',
  code = { label: 'Ten days, one use', value: 'COMEBACK20' },
  cta = { label: 'See what changed', href: '#' },
  whatsNew = {
    eyebrow: 'New since you left',
    products: [
      {
        image: {
          src: 'https://images.unsplash.com/photo-1559056199-641a0ac8b55e?w=1200&h=440&q=75&auto=format&fit=crop',
          alt: 'Solstice',
          width: 600,
          height: 220,
        },
        name: 'Solstice',
        description: 'The release everyone argues about',
        price: '$21',
      },
      {
        image: {
          src: 'https://images.unsplash.com/photo-1504674900247-0877df9cc836?w=1200&h=440&q=75&auto=format&fit=crop',
          alt: 'Wildflower Honey',
          width: 600,
          height: 220,
        },
        name: 'Wildflower Honey',
        description: 'From the roof of the roastery',
        price: '$12',
      },
    ],
  },
  downgrade = {
    body: 'If you would rather hear from us less, that is a real option and we will not be weird about it.',
    label: 'Email me monthly instead',
    href: '#',
  },
}: WinbackEmailProps = {}) {
  return (
    <EmailLayout brand={brand} subject={subject} preview={preview}>
      <Band tone="dark" padding="44px 40px 28px" align="center">
        <Eyebrow tone="dark">{eyebrow}</Eyebrow>
        <Display tone="dark" size={44}>
          {headline}
        </Display>
      </Band>

      <Band padding="34px 40px 0">
        <Plate {...hero} />
      </Band>

      <Band padding="28px 40px 34px" align="center">
        <Prose>{body}</Prose>
        {code ? (
          <>
            <Callout variant="dashed">
              <CalloutLabel>{code.label}</CalloutLabel>
              <Figure>{code.value}</Figure>
            </Callout>
            <Spacer height={24} />
          </>
        ) : null}
        <OutlineButton href={cta.href} align="center">
          {cta.label}
        </OutlineButton>
      </Band>

      <Band tone="paper" padding="34px 40px 40px">
        <Centered>
          <Eyebrow>{whatsNew.eyebrow}</Eyebrow>
        </Centered>
        <Spacer height={18} />
        <ProductGrid products={whatsNew.products} />
      </Band>

      <Band tone="dark" padding="28px 40px 32px" align="center">
        <Prose size={13} margin="0 0 16px" color={colors.onDarkFaint}>
          {downgrade.body}
        </Prose>
        <TextLink href={downgrade.href} tone="dark">
          {downgrade.label}
        </TextLink>
      </Band>
    </EmailLayout>
  );
}

export default WinbackEmail;

Related templates

More from 12 Ecommerce Email Templates.

View the complete bundle