14 SaaS Product Emails — Sonar / Onboarding

Free React Email Welcome Template

The first email after signup: the workspace is live, and the three steps that make it useful. Customize it in the free React Email playground and export production-ready TSX — no sign-up.

Sample subject
You’re in. Let’s find your first signal.
Format
React Email TSX · Free
Welcome React Email template preview

Template details

What this welcome template includes

The first email after signup: the workspace is live, and the three steps that make it useful. Customize it in the free React Email playground and export production-ready TSX — no sign-up. 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 onboarding 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,
  BulletList,
  CTAButton,
  colors,
  Display,
  EmailLayout,
  InlineLink,
  Kicker,
  Lead,
  Note,
  SectionTitle,
} from './components';

export interface WelcomeEmailProps {
  brand?: Brand;
  subject?: string;
  preview?: string;
  label?: string;
  kicker?: string;
  headline?: React.ReactNode;
  lead?: React.ReactNode;
  steps?: { title: string; items: React.ReactNode[] };
  cta?: { label: string; href: string };
  note?: React.ReactNode;
}

/**
 * Welcome — the first email after signup. Hands over the three things that
 * have to happen before the product is worth anything, and nothing else.
 */
export function WelcomeEmail({
  brand,
  subject = 'You’re in. Let’s find your first signal.',
  preview = 'Your Sonar workspace is live — three steps to your first insight.',
  label = 'Welcome',
  kicker = 'Account activated',
  headline = (
    <>
      YOU’RE IN,
      <br />
      PRIYA.
    </>
  ),
  lead = (
    <>
      Your workspace <strong>northwind</strong> is live. Sonar is already
      listening — the moment your first event lands, you’ll see it here.
    </>
  ),
  steps = {
    title: 'Three steps to your first signal',
    items: [
      <>
        <strong>Install the SDK</strong> — one snippet, 4 minutes. Node, Python,
        Ruby, or browser.
      </>,
      <>
        <strong>Name three events</strong> that matter. Signup, activation, and
        the one thing that predicts renewal.
      </>,
      <>
        <strong>Invite your team</strong> so the dashboard becomes the thing
        people argue about.
      </>,
    ],
  },
  cta = {
    label: 'Open your workspace',
    href: 'https://sonar.example.com/onboarding',
  },
  note = (
    <>
      {'Or read the '}
      <InlineLink href="https://sonar.example.com/docs/quickstart">
        5-minute quickstart
      </InlineLink>
      {'. Reply to this email and a human answers — usually within the hour.'}
    </>
  ),
}: WelcomeEmailProps = {}) {
  return (
    <EmailLayout
      brand={brand}
      subject={subject}
      preview={preview}
      label={label}
      accent="mint"
    >
      <Band tone="mint" padding="52px 32px 48px 32px">
        <Kicker color={colors.ink}>{kicker}</Kicker>
        <Display>{headline}</Display>
        <Lead>{lead}</Lead>
      </Band>

      <Band padding="40px 32px">
        <SectionTitle lineHeight={27}>{steps.title}</SectionTitle>
        <BulletList items={steps.items} />
        <CTAButton href={cta.href}>{cta.label}</CTAButton>
        <Note>{note}</Note>
      </Band>

      <Band tone="ink" padding="0" />
    </EmailLayout>
  );
}

export default WelcomeEmail;