Building Templates

Templates are exported from .tsx or .jsx files in the emails directory. They are vanilla React components with a few email-specific properties.

MJML is a markup language for building responsive emails. We use it to build templates because it takes a lot of guesswork out of building responsive emails that are compatible across clients.

To use MJML from react, we use the excellent mjml-react package. You'll notice that it uses a slightly different syntax than the MJML documentation but the props are all available.

If you want to add a subject to your email, you can do so by adding a static subject property to your component. This property should be a string or function that takes the props of your component and returns a string.

type WelcomeProps = {
  name: string;

const Welcome: Template<WelcomeProps> = ({ name }) => (
        <MjmlText>Hi {name},</MjmlText>
        <MjmlText>Welcome to our service!</MjmlText>
Welcome.subject = ({ name }) => `Welcome ${name}!`;

export default Welcome;

In this example, the Welcome ${name}! will be used as the email subject when this template is delivered with sendMail. Passing a subject into a sendMail call will override the subject defined on the component.

await sendMail({
  to: "",
  subject: "This is a custom subjec",
  component: <Welcome name="Amelita" />,

This will send an email with the subject "This is a custom subject".

Often times, email clients will show a preview of the email in the inbox. This is called the preview or preheader text. By default, most clients will generate this from the first few lines of text in your email.

To specify custom text, use the MjmlPreview component. It will generate the appropriate hidden text.

const MyTemplate: Template<{}> = () => (
      <MjmlPreview>I am the pre-header!</MjmlPreview>

A more thorough reference for preheader text in HTML can be found here.