Bulk Email Marketing.
Bring your own Resend or AWS SES account, import your customer list (or pull from your storefront), and send throttled bulk campaigns straight from MeshX.
Connect a sending provider
Go to Storefront โ Marketing โ Email โ Setup. Pick a provider:
| Provider | What you paste | Setup time |
|---|---|---|
| Resend | Resend API key (starts re_) | ~1 minute |
| AWS SES | Access Key ID + Secret Access Key + region | ~30 minutes (verification + production access) |
You also set From address, From name, and Reply-to on the same page. MeshX generates a webhook URL per provider โ paste this into Resend/SES so opens, clicks, bounces, and complaints flow back into MeshX.
Build your audience
Every campaign sends to one of two audience pools:
- Storefront customers โ anyone who opted in at checkout or via your newsletter signup on the storefront. These are auto-captured with consent timestamps.
- Imported audience โ a CSV you upload. Go to Marketing โ Audience โ Import.
Import sources
When importing, tag the source so you can audit your lists later. Built-in source tags include:
etsy_exportโ emails from your Etsy buyer-export CSVamazon_exportโ emails from Amazon reportsdirectโ anything else (Instagram DMs, WhatsApp, market stalls, etc.)
Create a campaign
Go to Marketing โ Email โ New campaign. Fields:
| Field | Details |
|---|---|
| Subject line | What the customer sees in their inbox. Keep it under 60 characters. |
| Audience | Storefront customers, or one of your imported lists. |
| HTML body | Raw HTML textarea โ paste any HTML email template you like. Supports the template variables below. |
| Throttle (hours) | Spread the send over 1โ168 hours. The cron divides your audience by throttle to compute a per-tick batch size. |
Template variables
These are substituted per-recipient at send time:
{{first_name}}โ customer's first name (falls back to "there" if unknown){{email}}โ recipient address{{unsubscribe_url}}โ one-click unsubscribe link (required by law โ include it in every campaign)
How sending works
When you hit Send now, MeshX queues the campaign. A cron job (/api/cron/marketing/send) runs every 5 minutes and picks up pending sends:
- The cron divides your audience by your throttle to compute a per-tick batch (hard ceiling: 5,000 emails per tick)
- Each row is delivered through your connected provider (Resend or SES)
- The 7-day frequency cap suppresses anyone who's already received an email from your tenant in the last week
- Unsubscribed addresses are skipped automatically
- Send results (success / error) are recorded per recipient for analytics
Campaign analytics
Each campaign card on the Marketing โ Email dashboard shows live counts, driven by provider webhooks:
- Recipients โ total addresses targeted
- Delivered โ accepted by the recipient's mail server
- Opens โ unique opens (tracking pixel; some clients block this)
- Clicks โ unique link clicks
- Failed โ bounces or provider errors (auto-suppressed from future sends)
- Unsubscribes โ clicks on the
{{unsubscribe_url}}link
Open a campaign to drill into a per-recipient log of who got it, who opened, and who clicked.
