Emails that reach inboxes

Send transactional and marketing email from pre-warmed IP addresses, authenticated with DKIM, SPF, and DMARC on the domain that you verify. Messaging records the delivery, the opens, and the clicks of every message that you send.

Password resets and newsletters from the same email API

Messaging sends password resets, order confirmations, newsletters, and campaigns from IP addresses that already have an established sender reputation. You can build each email with React components or in the visual editor, while Conversations stores the messages and replies of each recipient in one thread.

How Messaging builds, sends, and tracks your email

High deliverability

Messaging sends from pools of IP addresses that Conjoin warms up before your first send, so each address already has a sender reputation. When you verify your sending domain, Messaging configures DKIM, SPF, and DMARC authentication for it.

Broadcast campaigns

Send a newsletter or a marketing email to a list of recipients now, or schedule it for a time that you choose. Messaging reports the delivery, open, and click counts for each campaign.

Conversation tracking

Use Conjoin Messaging Conversations to group emails into threads. Link each thread to a contact, an order, or a campaign so that you can read the whole history of a recipient, replies included.

Visual email editor

A marketer can write, format, and style an email in the drag-and-drop editor, which saves the result as an HTML template. Your code then sends that template by its ID.

React Email support

Write email templates as React components with React Email and style them with Tailwind classes. Messaging stores the HTML that each component renders to as a template.

Template engine

Store HTML templates with placeholders that Messaging fills in at send time. When you edit a template in the dashboard or through the API, Messaging applies the change from the next email that you send with that template.

Click and open tracking

Messaging records when a recipient opens an email and which links they click, then posts each event to your webhook.

Custom sending domains

Send from your own domain. Messaging lists the DNS records that the domain needs and checks them when you verify it, so recipients see your domain in the From line while Conjoin delivers the mail.

Attachments

Attach up to 25MB of files to each email, such as invoice PDFs, images, or documents. Messaging encodes each file with its MIME type and transmits it over an encrypted connection.

Bounce and suppression handling

When a receiving server returns a hard bounce, Messaging adds that address to your suppression list and drops it from later sends. For a soft bounce, Messaging retries with exponential backoff and marks the message as failed once the last retry fails. You can use those suppression lists, which Messaging updates with every bounce and unsubscribe, to meet the requirements of CAN-SPAM and GDPR.

99.9%
Inbox rate

Share of emails that mailbox providers place in the inbox

< 500ms
Send latency

Time from API call to dispatch

DKIM, SPF, DMARC
Authentication

Messaging sets up all three for each verified domain

Build faster with solutions designed for real-world needs

Send password resets that pass DKIM, SPF, and DMARC checks

Messaging signs each reset with DKIM and sends it from pre-warmed IP addresses, after which the receiving server checks that signature along with the SPF and DMARC records of your domain. Messaging also reports your inbox placement rate.

Impact

The sample sends Henrique Costa a Ferncross Clinic reset link that expires in 15 minutes. Messaging writes the link into both the HTML body and the plain-text body from the reset_url placeholder on the recipient entry.

Prompt for a coding agent: Send password reset emails with a link that expires in 15 minutes.

Conjoin IDE

Select a file to view its contents

Send newsletters with the same call as your transactional email

Pass a list of subscribers to the same emails.send call that you use for transactional email. When you turn on conversations for the send, Messaging threads each reply and records the engagement of each recipient.

Impact

The sample sends the Lindenmere Vineyards spring release notes to three subscribers. Messaging fills in {{name}} in the greeting from the entry of each subscriber in the list. Because the call sets create_conversation and accepts_replies to true, Messaging threads any reply from a subscriber into that subscriber's own conversation.

Prompt for a coding agent: Send the spring release notes to our subscribers, with each name in the greeting.

Conjoin IDE

Select a file to view its contents

Build a welcome email in React and send it as a template

Build a template from React Email components, with inline styles or Tailwind classes. The render function of React Email converts the component into HTML with its styles inlined. Register that HTML once as a Messaging template, after which each send needs only the template ID and the placeholder values.

Impact

The sample renders the Aurinia Beauty welcome email to HTML, keeping firstName and tour_token as placeholders, then saves it as the default English template. The send call in send.ts passes the template ID along with Rania's values for those placeholders.

Prompt for a coding agent: Build the welcome email in React, save it as a template, and send it to new customers.

Conjoin IDE

Select a file to view its contents

Attach invoices and receipts to any email

Add an invoice PDF, a receipt, or another document to the attachments of a transactional email. Messaging sends each file inside the message, so the recipient receives the document with the email itself.

Impact

The sample loads the invoice for Tilbury Optical order TO-44192 from disk and attaches it to the order confirmation as a base64-encoded PDF. It names the attachment tilbury-invoice-TO-44192.pdf and sets its MIME type to application/pdf.

Prompt for a coding agent: Attach the PDF invoice to each order confirmation email.

Conjoin IDE

Select a file to view its contents

Suppress a contact so that Messaging skips them on later sends

Besides the addresses that Messaging suppresses after a hard bounce, you can suppress any contact yourself through the API. Check the suppression status of a contact before you send, or leave the check to Messaging, which enforces the suppression list on every send call.

Impact

The sample creates a contact for Zhao Liwei from the Cinderbeak Music checkout and suppresses email to that contact. Messaging then skips that address on every email send until you resubscribe the contact.

Prompt for a coding agent: Create a contact from checkout, and suppress email to that contact.

Conjoin IDE

Select a file to view its contents

Count the opens and clicks on a campaign

Messaging records opens with a tracking pixel and clicks with tracked links. Query those events through the API to build a report for one campaign.

Impact

The sample fetches up to 200 events for one Embergrove Studios campaign message from May 5, 2026 onward. It then counts the events by status, such as delivered, opened, or clicked, and prints the totals.

Prompt for a coding agent: Count the deliveries, opens, and clicks on this campaign since May 5.

Conjoin IDE

Select a file to view its contents

Build your next app on Conjoin

Conjoin will open with a free Build tier, while the pricing page already lists the launch prices for Pro and Business. If you tell us what you're building, we'll talk you through early access.