Email Templates

Creating Email Templates

@brail/react provides a suite of components and utilites for creating email templates. In many ways, it's the heart of Brail and has been painstakingly developed to provide a pleasant developer experience, while producing correct HTML markup.

Looking for component info? Skip to the components section.

Creating an email template

Templates are the atom of Brail's universe, where the template view, data schema, sending logic and email metadata are all colocated. Those familiar with tRPC (opens in a new tab) will feel at home using the template creation API.

import Brail from "@brail/react"
const b = Brail.init()
export default b.template
	.meta(/** 👈 (Optional) Define metadata schema e.g { to: string, subject: string} */)
	.props(/** 👈 (Optional) Define props schema */)
	.preview(/** 👈 Define data for template preview */)
	.view(props => {
		return <Email>{/* 👇 Your email template view */}</Email>

Brail now has everything it needs to preview, validate, generate and send templates – whether via API, SDK or any other methods you might dream up.


If you prefer a more functional approach, you can use createTemplate instead of b.template to create a template. 👇

import { createTemplate } from "@brail/react"
// Creating a template using functional style
export default createTemplate({
	metaSchema: {/* Meta schema */},
	view: {/* Temlate view*/},
	// ...etc.

Defining schema

Brail supports defining schemas for both the template's props and metadata. This is useful for ensuring that the template is used correctly and that the correct data is passed to the template, both via type-safety and runtime validation when used in APIs.

// $: npm install zod
import z from "zod"
// Props are data sent to your component
const propSchema = z.object({ title: z.string().optional() }) // { title?: string }
// Meta is sent to e.g. a sender function
const metaSchema = z.object({ to: z.string(), subject: z.string(), }) // { to: string, subject: string }
// Register schema
	// ...

Other template methods

	.preview({/* Data provided for previewing the template */})
	.metaDefault(props => ({/* Specify any default metadata, like a subject*/}))
	.onSend(async args => {
		const { meta, html } = args
		// Bind email sending logic to the template
		await send(, html)