Holiday Joke & Fact Convo Starter
Sends a daily Christmas joke and interesting fact from a Google Sheet. Perfect for cheesy dad jokes your kids will love and conversation starters at holiday gatherings.
Workflow Overview
This workflow builds on the countdown bot, adding Google Sheets integration to pull a joke and fact for each day. It filters the sheet data to match the current countdown day, then sends a beautifully styled HTML email.
Step-by-Step Guide
Duplicate the Countdown Bot
Start by duplicating your Holiday Countdown workflow. Rename it to something like "Joke Facts Bot". Make sure is_test is set to true in Config for testing.
Add Xmas Fields Node
After Resolve Dates, add an "Edit Fields" node called "Xmas Fields". Create xmasDay (number: 25) and daysUntilXmas using the expression {{ $json.xmasDay - $json.currentDay }}.
Connect Google Sheets
Add a Google Sheets node. Select "Get Rows" operation. Connect your Google account, paste the spreadsheet URL, and select the sheet. This pulls all rows from your joke/fact sheet.
Add Filter Node
Add a Filter node to match the current day. Compare days_until_xmas (from sheet) equals daysUntilXmas (from Xmas Fields). Use number comparison, not string!
Structure Your Spreadsheet
Key insight: Put joke AND fact on the same row. Columns: days_until_xmas, joke, fact, fact_source. This ensures Filter returns ONE item, so Gmail sends ONE email.
Style Your Email
Update the Gmail node. Set type to HTML. Use an LLM to generate festive HTML/CSS, then paste expressions for {{ $json.joke }}, {{ $json.fact }}, and {{ $json.fact_source }}.
Dynamic Subject Line
Make the subject dynamic so each email is unique. Use an expression like {{ $("Xmas Fields").item.json.daysUntilXmas }} days to go! to show the countdown in the subject.
Test & Go Live
Test with different test_day values (try 15, 24, 25). Verify you get one email with both joke and fact. Set is_test to false and activate!
The Code
{{ $json.xmasDay - $json.currentDay }} {{ $json.days_until_xmas }} = {{ $('Xmas Fields').item.json.daysUntilXmas }} {{ $('Xmas Fields').item.json.daysUntilXmas }} days to go! {{ $json.joke }} Key Concepts
📬 Item Processing
Nodes process EACH item passed to them. 2 items = 2 emails. Structure data to return 1 item when you want 1 action.
🐫 Naming Conventions
Use camelCase for n8n variables, snake_case for external data (sheets). Helps identify data source when debugging.
🔍 Filter Node
Compares values to keep only matching items. Use number comparison (not string) when comparing numeric values.
📊 Spreadsheet Design
Structure matters! One row per day with all data keeps your workflow simple and ensures single-item output.
🎨 HTML Emails
Set email type to HTML. Use an LLM to generate styled templates, then insert n8n expressions for dynamic content.
You've completed this walkthrough!
Explore more holiday automations to level up your n8n skills.