Google Sheets + Gmail: birthday emails sent on cue
You mean to send birthday emails. Then the week gets busy, the spreadsheet gets buried, and you remember two days late (again).
This Sheets Gmail birthdays automation hits team leads first, but community managers and solo operators feel it too. You get consistent, on-time birthday notes without a daily “check the sheet” habit.
Below you’ll see how the workflow works, what it automates, and what you can change so the messages sound like you, not a template.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets + Gmail: birthday emails sent on cue
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n1@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter", pos: "b", h: 48 }
n3@{ icon: "mdi:robot", form: "rounded", label: "AI Agent", pos: "b", h: 48 }
n4@{ icon: "mdi:brain", form: "rounded", label: "OpenRouter Chat Model", pos: "b", h: 48 }
n5@{ icon: "mdi:message-outline", form: "rounded", label: "Send a message", pos: "b", h: 48 }
n6@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n2 --> n3
n3 --> n5
n0 --> n1
n1 --> n2
n4 -.-> n3
n6 -.-> n3
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0 trigger
class n3,n6 ai
class n4 aiModel
class n2 decision
class n1 database
The Problem: Birthday outreach slips through the cracks
Birthday emails are the kind of “small thing” that quietly becomes a big thing. You either check the sheet every morning (and still miss it when you’re traveling or buried in client work), or you rely on memory and send a rushed note at night. Then comes the awkward part: copying the same message to everyone because you don’t have time to personalize it. It’s not hard work. It’s just never the most urgent task, so it keeps losing.
It adds up fast. Here’s where it breaks down in real life:
- You spend about 10 minutes a day just checking dates and scrolling rows, even when nobody has a birthday.
- Manual copy-paste invites mistakes, like the wrong name in the greeting or last year’s subject line.
- When you’re sending to a list (students, members, clients), “personalization” turns into generic filler that doesn’t feel genuine.
- Someone always gets missed, which means you now have a relationship problem, not a spreadsheet problem.
The Solution: Daily birthday checks + AI-written emails in Gmail
This workflow runs on a simple rhythm. Every morning at 9 AM, n8n reads your Google Sheet (Name, Email, and DOB) and looks for anyone whose birthday matches today’s day and month. For each match, it asks an AI model (via OpenRouter, using an OpenAI-compatible chat model) to write a personalized subject line and email message. The workflow then cleans up that AI response so Gmail receives a proper subject and body, and sends the email automatically. You wake up looking consistent and thoughtful, without needing another recurring task on your calendar.
The workflow starts with a scheduled trigger, then pulls your contact rows from Google Sheets. After filtering for today’s birthdays, an AI agent generates a friendly message and Gmail sends it out to the right person. No tabs. No reminders. No last-minute scrambling.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you maintain a list of 120 clients and partners in Google Sheets and you do a “birthday check” every weekday. If it takes about 10 minutes to open the sheet, filter, and send any emails, that’s roughly 3 to 4 hours a month even when only a handful of birthdays happen. With this workflow, your time drops to basically zero on normal days, plus maybe 10 minutes once a month to tweak your prompt or scan a sent-email log. The emails still go out at 9 AM. You just stop being the delivery mechanism.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store Name, DOB, Email.
- Gmail to send the birthday messages.
- OpenRouter (or OpenAI-compatible) API key (get it from your OpenRouter dashboard).
Skill level: Intermediate. You’ll connect accounts, map fields, and adjust an AI prompt without touching code.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A daily schedule starts the run. The workflow fires every morning at 9 AM, so you’re not relying on anyone to remember. Set the timezone once and it stays consistent.
Google Sheets rows are pulled in. n8n reads your sheet and brings in the fields you care about (usually Name, Email, DOB). If your sheet has extra columns, that’s fine; you just ignore them.
Today’s birthdays are filtered. The workflow extracts day and month from DOB and keeps only the contacts that match today’s date. This is the quiet part that prevents accidental sends.
An AI agent writes the message, then Gmail sends it. The agent generates a subject plus body through OpenRouter’s chat engine, a parser splits that response into clean fields, and the Gmail node dispatches the email.
You can easily modify the tone and message format to match your brand voice based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Trigger
Set the workflow to run automatically every day at a specific hour.
- Add the Scheduled Automation Start node as the trigger.
- Set the schedule rule to run daily at
9(as configured under rule → interval → triggerAtHour). - Ensure Scheduled Automation Start connects to Retrieve Sheet Rows.
triggerAtHour value before going live.Step 2: Connect Google Sheets
Pull birthday records from your spreadsheet so the workflow can evaluate who should receive a greeting.
- Open Retrieve Sheet Rows and select the spreadsheet in documentId using the value
[YOUR_ID]. - Set sheetName to
Sheet1(valuegid=0). - Credential Required: Connect your
googleSheetsOAuth2Apicredentials. - Confirm the node outputs to Apply Date Filter.
name, DOB, and EMail exactly as referenced by later nodes.Step 3: Set Up Filtering Logic
Filter rows to keep only contacts whose birthday matches today.
- Open Apply Date Filter and set the date comparison condition.
- Set leftValue to
{{ $json.DOB.split('/').slice(0,2).join('-')}}. - Set rightValue to
{{ $now.toFormat("dd-MM") }}. - Keep the operator as equals for date match.
DOB values in dd/MM/yyyy or similar format where day and month are first.Step 4: Set Up the AI Greeting Generator
Generate a personalized subject and body using the AI agent.
- Open Compose Greeting Agent and set text to
=use below name for birthday wishes. name:{{ $json.name }} dob:{{ $json.DOB }} write email according to you and best regards.. - Confirm promptType is
defineand hasOutputParser is enabled. - Ensure OpenRouter Chat Engine is connected as the language model with model set to
openai/gpt-4o-mini. - Credential Required: Connect your
openRouterApicredentials in OpenRouter Chat Engine. - Verify Structured Result Parser is attached as the output parser with jsonSchemaExample matching the configured subject/body schema.
Step 5: Configure Email Delivery
Send the AI-generated greeting to the contact’s email address.
- Open Dispatch Email Notice and set sendTo to
{{ $('Apply Date Filter').item.json.EMail }}. - Set subject to
{{ $json.output.subject }}. - Set message to
{{ $json.output.body }}and keep emailType astext. - Credential Required: Connect your
gmailOAuth2credentials.
Step 6: Test and Activate Your Workflow
Validate the full flow and then activate it for daily automated use.
- Click Execute Workflow to run a manual test from Scheduled Automation Start.
- Confirm Retrieve Sheet Rows returns records and Apply Date Filter only passes birthdays that match today.
- Check that Compose Greeting Agent outputs
subjectandbodyfields. - Verify Dispatch Email Notice sends a message to the address from
EMail. - Turn the workflow Active to enable the scheduled runs.
Common Gotchas
- Google Sheets permissions can be deceptively strict. If things break, check the connected Google account access to the exact spreadsheet (and tab) in n8n credentials first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 30 minutes if your Google and OpenRouter accounts are ready.
No. You’ll mostly map fields like Name, Email, and DOB, then tweak the message prompt.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenRouter/OpenAI API costs, which are usually a few cents per batch of emails.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and it’s honestly the best part. Update the instructions inside the Compose Greeting Agent so it writes in your tone (formal, playful, short, “from the whole team,” and so on). You can also ask for a specific language, or include extra context from your Google Sheet like Company, Last purchase, or Class name. If you change the output format, make sure the Structured Result Parser still matches the subject/body structure.
Usually it’s expired OAuth access or the wrong Google account connected. Reconnect the Gmail credentials in n8n, then confirm the sender address matches the inbox you expect. If it still fails, check Google’s security prompts and make sure the account is allowed to send (some Workspace setups restrict this). Rate limits can also show up if you’re blasting a large list on the same day, so spacing sends or batching can help.
For most small teams, hundreds or even a few thousand contacts are fine, because you only send to the few that match today’s date. On n8n Cloud, your practical limit is monthly executions on your plan; if you self-host, it mostly depends on your server and Google API limits. If you expect many birthdays per day (large schools or communities), add a small delay between sends to keep Gmail happy.
It can be, especially if you want AI-generated content plus more control over filtering and formatting without paying extra for every branch. n8n also gives you a self-hosted path, which keeps costs predictable when you scale. Zapier or Make are simpler for very small “if date equals today then send” setups, but they get awkward once you want structured AI output and cleaner parsing. If you’re unsure, the quickest way is to decide if you want “set it once and forget it” or “review drafts before sending.” Talk to an automation expert and we’ll help you choose.
Set it up once and birthdays stop being a recurring worry. The workflow handles the repetitive part, and you keep the relationships.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.