Skip to content

Every email is made of blocks stacked in a list. Each block has a type and a props object. Blocks are available on all plans.

Text

Rich-text block with full formatting support (bold, italic, links, font size, color, alignment).

ts
{
  type: 'text',
  props: {
    html:          string,   // inner HTML — edited via the rich text toolbar
    fontSize:      number,   // px, default 16
    fontFamily:    string,
    fontWeight:    string,   // '400' | '600' | '700'
    color:         string,
    textAlign:     'left' | 'center' | 'right',
    lineHeight:    number,   // default 1.6
    letterSpacing: number,   // px, default 0
    paddingTop:    number,
    paddingRight:  number,
    paddingBottom: number,
    paddingLeft:   number,
    hideOnMobile:  boolean,
  }
}

Image

Responsive image block with optional link, alt text, and border radius.

ts
{
  type: 'image',
  props: {
    src:           string,
    alt:           string,
    linkUrl:       string,
    width:         number | 'full',
    height:        number | 'auto',
    align:         'left' | 'center' | 'right',
    objectFit:     'cover' | 'contain',
    objectPosition: string,
    borderRadius:  number,
    paddingTop:    number,
    paddingBottom: number,
    hideOnMobile:  boolean,
  }
}

Button

Call-to-action button with customisable colors, size, alignment, and full-width option.

ts
{
  type: 'button',
  props: {
    label:           string,
    url:             string,
    backgroundColor: string,
    textColor:       string,
    borderRadius:    number,
    fullWidth:       boolean,
    align:           'left' | 'center' | 'right',
    paddingTop:      number,
    paddingRight:    number,
    paddingBottom:   number,
    paddingLeft:     number,
    hideOnMobile:    boolean,
  }
}

Divider

Horizontal rule with configurable thickness, style, and color.

ts
{
  type: 'divider',
  props: {
    color:         string,
    thickness:     number,
    style:         'solid' | 'dashed' | 'dotted',
    paddingTop:    number,
    paddingBottom: number,
    hideOnMobile:  boolean,
  }
}

Spacer

Invisible vertical gap — useful for fine-grained spacing without padding hacks.

ts
{
  type: 'spacer',
  props: {
    height:       number,
    hideOnMobile: boolean,
  }
}

Columns

Multi-column layout block. Each column is an independent drop zone that holds its own child blocks.

ts
{
  type: 'columns',
  props: {
    columns:        number,     // 2 or 3
    columnWidths:   number[],   // flex ratios, e.g. [1, 2] for 1:2
    columnChildren: Block[][],  // child blocks per column
    gap:            number,
    paddingTop:     number,
    paddingBottom:  number,
    hideOnMobile:   boolean,
  }
}

Social

Social media icon row. Supports Facebook, Twitter/X, Instagram, LinkedIn, YouTube, TikTok, GitHub, and a generic web link.

ts
{
  type: 'social',
  props: {
    icons: Array<{
      platform: 'facebook' | 'twitter' | 'instagram' | 'linkedin'
               | 'youtube' | 'tiktok' | 'github' | 'web',
      url:      string,
    }>,
    iconSize:     number,
    spacing:      number,
    align:        'left' | 'center' | 'right',
    paddingTop:   number,
    paddingBottom: number,
    hideOnMobile: boolean,
  }
}

Video

Video thumbnail with a play button overlay. Links to the video URL when clicked in the sent email (email clients don't support inline video playback).

ts
{
  type: 'video',
  props: {
    videoUrl:      string,
    thumbnailUrl:  string,
    altText:       string,
    width:         number | 'full',
    align:         'left' | 'center' | 'right',
    paddingTop:    number,
    paddingBottom: number,
    hideOnMobile:  boolean,
  }
}

HTML

Raw HTML block — drop in any custom markup. Useful for advanced layouts, custom widgets, or pasting code from your design team.

ts
{
  type: 'html',
  props: {
    html:          string,
    paddingTop:    number,
    paddingBottom: number,
    hideOnMobile:  boolean,
  }
}

WARNING

Raw HTML is not sanitized before rendering in the editor preview. Make sure you trust the source.

List

Bullet or numbered list with configurable font, color, and item spacing.

ts
{
  type: 'list',
  props: {
    listType:      'bullet' | 'numbered',
    items:         string[],
    fontSize:      number,
    fontFamily:    string,
    color:         string,
    itemSpacing:   number,
    paddingTop:    number,
    paddingRight:  number,
    paddingBottom: number,
    paddingLeft:   number,
    hideOnMobile:  boolean,
  }
}

hideOnMobile

Every block type supports hideOnMobile: boolean. When true, the block is hidden on screens narrower than 600px via a CSS media query in the compiled HTML output. Useful for desktop-only hero images or decorative spacers.