Skip to content
StackQuay

Playbook · n8n

n8n: create a Resend Broadcast draft on a schedule

Schedule Trigger, then Google Sheets, then Resend Create only. Never auto-send.

2026-10-16

Draft only

This is a thin outline of a scheduled draft. It uses Schedule Trigger, Google Sheets, and Resend Broadcast Create. Do not add a Send step.

One-line promise: on a schedule, read one ready row from an issue sheet and create a Resend Broadcast draft only (send false or omitted). STOP: never auto-send. This recipe must not include Resend Broadcast → Send, and must not set send: true. Documented nodes only — Schedule Trigger, Google Sheets, and the official Resend node (Broadcast → Create).

If you only need the API create-draft path without n8n, use Resend Broadcast drafts. You press Send there too.

Who it’s for / not for

ForNot for
People who already have a verified domain, a Segment, and the human Send habit from the Resend playbooksAnyone who wants n8n to press Send on a schedule — out of scope. STOP
Operators mirroring newsletter issue rows into a Google Sheet the workflow can readReaders who only need the API create-draft path → Resend Broadcast drafts
Agent-led ops: bot drafts this outline; human owns n8n credentials, the Sheet, and Resend SendInvented custom nodes or unofficial community forks — stick to the documented nodes below

Stack (documented nodes only)

API truth, same as the human-gate playbook: Create Broadcast defaults send to false (draft). send: true, with optional scheduled_at, sends or schedules without a separate send call (create-broadcast, send-with-api). Both are forbidden on this recipe.

Content-queue bridge: markdown under a content queue is not an n8n node. You (or a sync you own) mirror issue rows into a Google Sheet. Suggested columns: status, segment_id, from, subject, html (or html_en / html_zh), optional topic_id, name, reply_to.

StepNode (official)Why
1Schedule Trigger (docs)Run weekly / cron. You must save and publish the workflow or the schedule will not fire.
2Google Sheets → Get Row(s) (Sheets, sheet ops)Read one issue-sheet row. Filter example: status = ready_draft.
3Resend → Broadcast → Create (n8n Resend, KB, README)Create the campaign with subject, HTML, and segment. Draft only.
4 (optional)Google Sheets → Update RowWrite back broadcast_id and set status=draft_created.
Forbidden in this recipeResend Broadcast → Send (listed on n8n Resend)Human Send gate — Dashboard, or a deliberate send outside this workflow.

Bot vs human

Bot doesHuman must do
Draft this outlineOwn the n8n instance; install the official Resend node; store the Resend API or OAuth2 credential in n8n — never paste keys in chat or git (KB credentials)
Suggest the Sheet column map and expressionsCreate the Sheet; fill only consented Segment IDs; set the workflow timezone to HKT (Asia/Hong_Kong)
Flag STOP before any Send nodePublish the Schedule workflow only after reviewing the Create-as-draft mapping
Never add Broadcast → Send to this flowOpen the draft in the Resend Dashboard, test, and Send yourself

Numbered recipe outline

  1. Prerequisites. Verified sending domain, Resend API key in n8n credentials, and at least one Segment with opted-in Contacts (Resend bilingual newsletter, Segments + Contacts). Consent and records stay on HK PDPO newsletter consent — that page is not legal advice.
  2. One sheet, one issue per row. One tab, header row. Only rows with status=ready_draft are eligible. Put a real segment_id, from, subject, and HTML. Include {{{RESEND_UNSUBSCRIBE_URL}}} per create-broadcast.
  3. Schedule Trigger. Example: every 1 week, on a weekday and hour inside your review window. Set the workflow or instance timezone so HKT is correct (Schedule Trigger). Save and publish, or the schedule will not run.
  4. Google Sheets → Get Row(s). Document + sheet. Filters: column status, value ready_draft. Under Options, set When Filter Has Multiple Matches to Return All Matches only if you want every ready row in one run (sheet ops).
  5. Resend → Broadcast → Create (draft only). Map sheet fields into Create parameters: segment, from, subject, html / text, optional name / reply-to / topic. Do not enable send or schedule-send on this node. Confirm in the node UI that you are not calling Send. The official node also lists Update, Send, Cancel, and Duplicate (n8n Resend, README) — this recipe uses Create only.
  6. Optional: Update Row. Write broadcast_id from the Create response and set status=draft_created so the next schedule does not recreate the same row.
  7. STOP — human Send gate. Open the draft in the Resend Dashboard, or use an API send outside this workflow after an explicit OK. This recipe must not include Broadcast → Send. Creating with send: true is also forbidden here.

Failure modes

  • Send node accidentally added — a real list blast. Delete Send and treat it as an incident.
  • send: true on Create — same risk (create-broadcast).
  • Wrong timezone on Schedule — drafts appear at the wrong hour. Fix the workflow or instance timezone (Schedule Trigger).
  • Filter returns the wrong rows — check status values. Use Return All Matches only when that is intentional.
  • Secrets in the Sheet or chat — API keys never go in cells. Credentials live only in n8n.
  • Unverified domain or wrong Segment — verify before the first Dashboard Send.
  • Doc gap: exact n8n Resend Create field labels can differ by node version. Confirm against the installed n8n-nodes-resend UI. Do not invent fields. Audiences are deprecated; use Segments (README). Make.com twin and a Code-node bilingual HTML assembly are deferred.

Human must verify

  1. Schedule is published. Timezone is Asia/Hong_Kong (or the zone you chose).
  2. Sheet columns match the Create mapping. Only ready_draft rows fire.
  3. Resend credential scope is correct. No key in the Sheet.
  4. The Create node has no Send and no send: true.
  5. The workflow graph contains no Broadcast → Send node.
  6. Segment consent is real, and the HTML includes the unsubscribe token.
  7. You press Send yourself. This recipe stops at the draft.

Newsletter

This flow only creates a draft. Do not auto-send.

Docs cited

Related playbooks