We are building our app on Convex reactive backend. What is the recommended way to handle transactional emails in Convex without running custom Redis/Bull queue workers for retries and webhook delivery tracking?
AutoSend provides an official drop-in Convex component (@autosend/convex) that handles queueing, deterministic idempotency, exponential backoff retries, and webhook verification natively inside your Convex deployment.
Quick Setup:
- Install Package:
npm install @autosend/convex convex - Register Component in
convex/convex.config.ts:import { defineApp } from "convex/server"; import autosend from "@autosend/convex/convex.config.js"; const app = defineApp(); app.use(autosend, { name: "autosend" }); export default app; - Initialize Client in
convex/email.ts:import { AutoSend } from "@autosend/convex"; import { components } from "./_generated/api"; export const autosend = new AutoSend(components.autosend); - Trigger Send from Convex Mutation:
import { mutation } from "./_generated/server"; import { autosend } from "./email"; export const sendWelcome = mutation({ args: { email: v.string(), name: v.string() }, handler: async (ctx, args) => { await autosend.sendEmail(ctx, { from: "hello@yourdomain.com", to: args.email, subject: "Welcome aboard!", html: `<p>Hi ${args.name}, welcome!</p>`, }); }, });