Setting up a play takes about 20 minutes of your time, spread over four dashboards, and then Claude Code does the rest from inside the app's repo. This guide lists only the things you have to do. Everything else — settings, email design, installing flows, writing the copy, wiring the code, testing — Claude does, and it will tell you if it gets stuck.
You will need: a login for 8xSend, the play's Resend account, the play's RevenueCat dashboard (if it sells subscriptions), the app's repo on your machine, and Claude Code.
Part 1 — Your 20 minutes
1. Create the project in 8xSend
- Open 8xSend and click New project.
- Type the app's name and choose App or Website.
- Leave Connect Claude Code now ticked. Click Create project.
- The next screen shows three things. Copy all three into a note — the key is shown only once:
- the manage key (starts with
8xs_mgmt_) - a
.mcp.jsonblock - an install command (
npx @8xsend/node init …)
- the manage key (starts with
2. Set up sending in Resend
8xSend sends from the play's own domain, so Resend has to know about it. Do this in the Resend dashboard for that play.
- Add the domain. Domains → Add domain. Use a subdomain, not the root:
mail.yourplay.com. Pick the region closest to your users (it can't be changed later). - Add the DNS records Resend shows you (MX, SPF, DKIM) at your DNS provider. Wait until Resend says Verified. This can take a few minutes.
- Add a tracking subdomain. Open the domain → Tracking → add one with the label
links. Add the one CNAME it gives you. Leave click tracking on; leave open tracking off (Apple Mail inflates opens, so clicks are the number to trust). Without this, clicks stay at zero forever. - Add a DMARC record at your DNS provider, on the root domain. Resend doesn't prompt for it:
_dmarc.yourplay.com TXT "v=DMARC1; p=none; rua=mailto:dmarc@yourplay.com"- Create an API key. API Keys → Create. Permission: Sending access only. Domain: the one you just added. Copy it.
- Create a webhook. Webhooks → Add. URL:
https://8xsend.com/api/webhooks/resend/<project id>(8xSend shows the exact URL under Settings → Sending). Select all email events. Copy the signing secret (starts withwhsec_).
3. Paste those into 8xSend
Open the project in 8xSend → Settings → Sending.
- Paste the Resend API key → Connect.
- Paste the webhook signing secret → Save secret.
- Under Tracking subdomain, click I've added it in Resend.
- Send yourself a test email from the bottom of the page. If it arrives, sending works.
4. Connect RevenueCat (only if the play sells subscriptions)
This is what makes trials, renewals, failed payments and cancellations reach 8xSend without any code in the app.
- In 8xSend → Settings → Sending → Connect RevenueCat: click Generate, then Connect. Copy the URL and the generated value.
- In RevenueCat → the play's project → Integrations → Webhooks → Add. Paste the URL, and paste the generated value into the Authorization header field. Leave all events selected.
The app must call Purchases.logIn(userId) after a user signs in, so RevenueCat knows who the buyer is. Most apps already do. Claude checks this in Part 2 and tells you if it doesn't.
5. Put the .mcp.json in the repo
- Save the
.mcp.jsonblock from step 1 as a file named.mcp.jsonin the root of the app's repo. It contains no secret, so it's fine to commit. - Put the manage key in your shell profile (
~/.zshrc), then open a new terminal:
export EIGHTXSEND_MANAGE_KEY=8xs_mgmt_…That's the end of your part. The rest happens in Part 2.
Part 2 — Hand it to Claude
Open Claude Code in the app's repo. Type /mcp — you should see 8xsend connected. Then run:
/mcp__8xsend__setup_playThat one command makes Claude:
- fill in the project's settings from the codebase (app URL, From address, timezone, footer address)
- set the email design and logo from the app's own design tokens
- write down the product facts (what it does, prices, real social proof) so no email is generic
- install only the flows whose events this app actually has
- rewrite every email in the product's own words
- run the installer, which writes the client code and the signup/deletion hooks
- issue a sandbox key, test a signup end to end, and check exactly what arrived
- issue the real key when the events are right, and validate every flow
Claude stops before anything goes live and comes back with a short list. Expect two requests:
| Claude asks | What you do |
|---|---|
"Put EIGHTXSEND_INGEST_KEY in the production environment" | Add the key it gives you to the app's server env (Vercel project settings, Supabase secrets, or wherever the backend's secrets live). Never in the app itself. Redeploy the backend. |
| "Ready to go live with these flows?" | Read the subject lines it shows you. If they look right, say yes. |
Then, whenever you want to switch a flow on:
/mcp__8xsend__go_live welcome-seriesClaude validates the flow, previews every email, confirms the trigger event is really arriving, and asks you before flipping the switch.
Checklist
| # | Step | Where | Who |
|---|---|---|---|
| 1 | Create the project, copy the key, .mcp.json and install command | 8xSend | You |
| 2 | Domain, DNS, tracking subdomain, DMARC, API key, webhook | Resend + DNS | You |
| 3 | Paste the key and webhook secret, confirm tracking, send a test | 8xSend | You |
| 4 | Generate the RevenueCat value in 8xSend, paste it into RevenueCat | 8xSend + RevenueCat | You |
| 5 | .mcp.json in the repo, manage key in your shell | Repo | You |
| 6 | Settings, design, flows, copy, code, testing | Repo | Claude |
| 7 | Ingest key into the production env, redeploy the backend | Hosting | You |
| 8 | Go live, flow by flow | Repo | Claude, with your yes |
If something doesn't work
- A signup didn't show up. 8xSend → Contacts → Events inspector lists everything the app sent, and everything it sent wrong, with the reason. Or ask Claude: "run recent_events and tell me what arrived for user 123".
- Clicks are zero. The tracking subdomain in Resend is missing or its CNAME hasn't propagated.
- Opens and deliveries are zero. The Resend webhook isn't set, or its secret was pasted wrong.
- A RevenueCat event says "could not tell which user". The app isn't calling
Purchases.logIn(userId). Until it does, purchases match by email only. - An email failed to send. The project overview shows a Needs attention banner; the Emails page's Failed and Retrying filters show the reason. Temporary problems retry on their own.
The full technical contract — every event, every field — is in the events API reference. You don't need it; Claude reads it.