Email broadcasts
Draft, test, and send marketing / product-update email broadcasts to an audience via Resend. Use when the user asks to "send a broadcast", "email blast", "newsletter", "product update email", "announce something to users", "marketing email", "review request", "how many contacts", "email history", or "what have we sent". Config-driven brand + sender; mandatory test send and explicit confirmation before any real send; CAN-SPAM compliant; bounded history.From its SKILL.md
npx -y skills add adamjali/claude-skills --skill email-broadcastsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
3 things to look at
- reads credentialsReads from 1 credential source: `RESEND_API_KEY`.
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 1 command, including `export RESEND_API_KEY="your-key"`.
SKILL.md
6.1 KB, ~1.4k tokens by cl100k_base, as published. Nobody here has run it
Email Broadcasts
<objective> Manage product-update and marketing email broadcasts via Resend Broadcasts. Covers the full workflow: audience sync/count, drafting (per design rules), a **mandatory test-send preview**, an explicit user confirmation gate, sending to your audience, and history tracking with rolling-window pruning. CAN-SPAM compliant. You set your brand, sender, addresses, and segment IDs in `references/config.md`. NEVER sends to the full audience without an explicit confirmation phrase ("yes send it"). </objective> <context> @references/config.md @history.md </context><execution_context>
- π’ Auto: contact/audience counts, history reads, knowledge lookups
- π‘ ASK on: draft generation (preview required), test-segment send (still asks before the real send)
- π΄ NEVER: send to the general audience without an explicit "yes send it" (or "schedule it for X")
- Mandatory self-preview: ALWAYS send a test broadcast to the test segment first, wait for "looks good"
- History: keep the last 5 broadcasts full, archive older to one-line at the bottom of
history.md</execution_context>
Setup (one time)
Fill in references/config.md (brand, from/reply-to, physical address for CAN-SPAM, audience
- test segment IDs, test recipients). Set:
export RESEND_API_KEY="your-key" # free key at https://resend.com
Manage contacts in your Resend Audience (import a CSV, or sync from your own source). This skill treats the Resend audience as the source of truth β no specific backend is assumed.
Routing β what does the user want?
| User says | Route to |
|---|---|
| "send/draft a broadcast", "announce", "newsletter" | β Draft & Send workflow |
| "how many contacts/subscribers" | β Resend: list contacts / audience count |
| "what have we sent", "email history" | β History |
| "open rate", "stats" | β Resend: list/get broadcast |
| "how does unsubscribe / CAN-SPAM work" | β Knowledge lookup (below) |
Draft & Send Workflow
Phase 1 β Prepare
- Confirm the audience + count (Resend
list-contacts/ audience). - Ask: purpose (product update, announcement, review request, custom)? What to highlight? CTA?
Phase 2 β Draft
Compose the email (HTML + plain text). Proven structure:
Short, warm intro (2-3 sentences)
WHAT'S NEW β section header + one card per item
A SMALL ASK β the CTA + a short line of context
Sign-off + footer + unsubscribe
Subject lines: short (<40 chars), friendly, no "review/survey", no ALL CAPS, no emoji.
HTML rules: table-based layout; all styles inline (no <style> tag); 600px max width;
bgcolor alongside CSS for Outlook; no JS, no background images; keep it text-heavy on early
sends for deliverability; always include a plain-text version.
Phase 3 β Test (MANDATORY)
Never skip. Never send without explicit confirmation.
- Create a broadcast on the test segment (id from config).
- Send the test (only goes to your test recipients).
- Ask the user to check: inbox placement (not Promotions/Spam), rendering, CTA target, the unsubscribe link, mobile, and the from-name.
- Wait for explicit approval: "yes send it" or "schedule it for X".
Phase 4 β Send
Only after explicit confirmation:
- Create the broadcast on the general audience/segment (id from config).
- Send or schedule via Resend.
- Record it in
history.md.
Phase 5 β Clean up
Update history.md (keep last 5 full, older β one-line). Verify delivery via Resend
list-broadcasts / get-broadcast.
CAN-SPAM Compliance
Every marketing email MUST include:
- A physical mailing address (from config).
- A working unsubscribe link (Resend Broadcasts auto-manage this; it injects a
List-Unsubscribeheader and skips unsubscribed contacts on future sends). - An honest subject line, no deception.
- A real reply-to / support contact (from config).
Tools β when to use what
| Task | Tool |
|---|---|
| List/manage contacts | Resend MCP/API (list-contacts, create-contact, update-contact) |
| Create/send broadcast | Resend MCP/API (create-broadcast, send-broadcast) |
| One-off transactional email | Resend MCP/API (send-email) |
| Check broadcast stats | Resend MCP/API (list-broadcasts, get-broadcast) |
History
history.md format per entry:
## [Date] β [Subject]
- Recipients: [N]
- Segment: General / Test
- Status: sent / scheduled [date]
- Key content: [1-line summary]
Keep the last 5 full entries; older β one-line archive at the bottom.
<saved_rules_format>
Stored in history.md "Saved Rules" section, surfaced each run as:
"Previous rule found: '<rule>'. Apply? (Yes / No / Delete)" Common topics: subject-line preferences, CTA copy, do-not-send-to-X rules. </saved_rules_format>
<recovery_protocol>
If history.md shows status: scheduled for a broadcast that should have sent β verify in the
Resend dashboard. If a draft was interrupted mid-workflow β offer Resume from last phase / Start
fresh / Review.
</recovery_protocol>
<error_handling>
- Resend rate limit β sleep and retry; respect the free-tier limit.
- Test send doesn't arrive β wait, then check; if still missing, stop (don't proceed to the general send).
- Ambiguous approval phrase β re-ask explicitly: "Confirm: send to [N] contacts? Reply 'yes send it'." </error_handling>
<success_criteria>
- Audience count verified before the broadcast
- Test broadcast sent to the test segment FIRST
- User confirmed the test looked good
- Explicit "yes send it" (or "schedule it for X") before the general send
- history.md updated; last 5 full, older compacted
- Delivery verified after send
What ships with it: 3 files
1.7 KB alongside SKILL.md
.claude-plugin/
- plugin.json504 B
references/
- config.md723 B
- history.md547 B