A bot that posts happy birthday and work anniversary messages in your team chat, pulling from wherever you already keep dates. With a personality, and a name.
If you've never built an automation, build this one first. Not because it's the most valuable. Because it's the safest possible place to learn the pattern that every other bot uses.
Think about what happens when it breaks. Somebody doesn't get a birthday message. That's it. Compare that to a finance bot getting a number wrong, or an invoice bot telling a contractor the wrong bank details. You want to make your beginner mistakes here.
A bot that reads a source, decides whether today is the day, posts something, and tells you when it can't. Swap the source and the message and you've got a renewals bot, a contract-expiry bot, a probation-review bot.
There's also a nice bit of history in this one. On the episode, Ceci built hers first, calling it the birthday dude. Bea copied it, merged the naming with Ceci's invoice fairy, and ended up with a birthday fairy:
"I took the birthday dude and the invoice fairy and merged it into the birthday fairy, which now congratulates employees on their birthday and pulls from our HR system. And it's beautiful and it has a great icon, it's a little fairy." Beatrice Aliprandi — EP 11
Steal it. That's what it's for.
| You need | Options that work |
|---|---|
| A list of dates | An HR system with an API (BambooHR, HiBob, Personio, Rippling, Deel), or a Google Sheet with two columns. The spreadsheet version works exactly as well. |
| A team chat | Slack, Microsoft Teams, Discord |
| An AI with a scheduler | Claude with scheduled tasks, or ChatGPT Tasks for the reminder version |
The spreadsheet route is not the lesser option. If your HR system has no API, or you don't have admin rights to it, a sheet with Name, Start date, Birthday is completely fine and takes two minutes to create. Most small companies should just do this.
This one has a genuine privacy dimension that people skip, and it's worth thirty seconds of thought.
Not everyone wants theirs announced. Some people actively hate it. Some don't want their age inferable. In some jurisdictions, storing and publishing birth dates without a clear basis is a GDPR problem, not just an etiquette one.
So: make it opt-out at minimum, opt-in ideally. In practice, add a column called Announce? (Y/N) and have the bot respect it absolutely. Then tell the team the bot exists and how to opt out. One Slack message.
Also: don't store the birth year if you only need the day. Store 14 March, not 14 March 1991. You cannot leak what you never held, and the bot doesn't need the year.
Work anniversaries are much less sensitive than birthdays. If you want the easiest version with the fewest issues, do anniversaries only.
As of August 2026:
| What you're doing | On Claude | On ChatGPT |
|---|---|---|
| Building it | Sonnet 5 | GPT-5.6 Terra |
| The daily run | Sonnet 5 | GPT-5.6 Terra |
| Auditing your bots | Fable 5, high effort | GPT-5.6 Sol |
This is the one workflow where you don't need the top tier to build. The task is small and well defined. Save Fable 5 and Sol for the audit.
If you're using a sheet, make it exactly this:
| Name | Slack handle | Birthday (day month) | Start date | Announce? |
|---|---|---|---|---|
| Priya Raman | @priya | 14 March | 2024-02-01 | Y |
| Tom Okafor | @tom | 2 September | 2022-11-15 | N |
That's the whole schema. Don't over-engineer it.
If you're using an HR system, connect it and ask the AI to confirm what it can see before you build anything else:
Connect to my HR system and tell me exactly which fields you can read for each employee. List the field names. Do not read or display anyone's actual data yet, just the schema.
Knowing what it can see before you point it at anything is a good habit that generalises well beyond this bot.
Build me a bot that posts birthday and work anniversary messages in our team chat. Give it a name and a personality. BOT NAME: [e.g. the Birthday Fairy] PERSONALITY: [e.g. warm, slightly over the top, uses one emoji, never cringe] WHERE IT POSTS: [e.g. #general in Slack] WHERE THE DATES LIVE: [the sheet, or the HR system] WHAT IT DOES, every weekday at [09:00]: 1. Read the date list. 2. Find anyone whose birthday is today AND who has Announce set to Y. 3. Find anyone whose work anniversary is today, counting whole years only. Ignore anyone at 0 years. 4. If there is nobody, post nothing. Do not post "no birthdays today." 5. If there is someone, write ONE message covering everyone. Never post separate messages for two people on the same day. 6. Tag them by their handle. MESSAGE RULES: - Vary the wording every time. Never send the same sentence twice in a month. - Birthdays: never mention age, never guess age, never reference a birth year. - Anniversaries: say the number of years plainly. "3 years today." - One or two sentences maximum. Nobody wants a paragraph. - No corporate language. Not "we value your contribution." - Never invent a fact about the person. No "the office wouldn't run without you" unless I have told you that is true. Warm and generic beats specific and wrong. WHEN IT CANNOT RUN: If you cannot reach the date list, do NOT stay silent and do NOT skip the day. Post in [my DM] saying: "[Bot name] here. I could not reach the date list today, so I have not posted anything. Someone's birthday may have been missed." Then tag me. Before you set this up as a scheduled task, show me: - five example messages, so I can check the tone - what will happen on a day with nobody - what will happen on a day with three people - exactly what happens if the date list is unreachable
A bot that tells a two-week-old hire that the team couldn't function without them is worse than no bot. Warm and slightly generic is the correct register for an automated message, and everyone knows it's automated anyway.
The dry-run request at the end is the habit to build. Never schedule something you haven't seen the output of. Five examples costs you thirty seconds and catches the tone problem before the whole company sees it.
This looks like a joke. It isn't, quite.
Ceci's framing: "I just like to give them personality." And her IT bot quotes a British sitcom back at people when they ask it something nonsensical: "it quotes the IT Crowd back at you when you say things that don't make sense." Bea's response on tape was "That's I might steal that."
There's a real argument underneath. Later in the episode Bea lands on the thing that stuck with her most from the whole season, which came from a guest: fractionally beautiful.
"I'm thinking, does this bring people joy? I did not think about that before. Before I was, is this efficient? And now I just add that into my consideration." Beatrice Aliprandi — EP 11
Ceci connects the two directly: "it's potentially one of the reasons why my army of bots has a personality. Because why not? Like every day maybe wanna interact with somebody that cracks a joke every now and then."
Practically:
The efficiency case is real too: an automation people find charming gets tolerated. One that feels like corporate spam gets muted, and a muted bot is a dead bot.
Ask in a chat with your chat tool and date source connected:
Set this up as a scheduled task, every weekday at 09:00 in my timezone, using the spec above. Run it once now as a dry run and post the output to me in a DM rather than to the channel, so I can check it before it goes live.
Always do the DM dry run for a week before you point it at a public channel.
As a reusable skill, folder birthday-bot, file SKILL.md:
--- name: birthday-bot description: Post birthday and work anniversary messages to the team chat, reading dates from a sheet or HR system, respecting opt-outs, varying the wording, and alerting the owner when the date source is unreachable. Use when the user asks about the birthday bot, anniversary messages, or wants to set up automated team celebrations. ---
Spec underneath, zip, rename to .skill, upload.
ChatGPT can't post into Slack on a schedule without additional wiring, so use Tasks as a prompt-you version:
"Every weekday at 08:45, check my birthday sheet and tell me if anyone has a birthday or anniversary today. If so, draft the message and I'll paste it."
Less magic, ten seconds of your morning, zero permissions to worry about. Honestly a reasonable place to start.
This bot is the canonical example of why the rule exists, and it's exactly the one Bea used to explain it on the episode:
"If they can't reach the information, make it say: Hi, I'm the fairy, I couldn't reach the information and tag you so that you actually know when it's failing. Otherwise, it's not a process that you are keeping." Beatrice Aliprandi — EP 11
Think about why this bot specifically. Most automations, you notice when they break, because you were waiting for the output. Nobody waits for a birthday message. If it silently stopped working in February you might discover it in July, and by then you've missed thirty people's birthdays and the team has quietly concluded that nobody cares.
That's the trap. So: two safeguards.
One, alert on failure, as in the spec above. Two, a weekly heartbeat:
Every Friday at 17:00, DM me one line: "[Bot name] ran [N] times this week and posted [M] messages." Send this even if both numbers are zero.
A zero-zero week in a 40-person company is a signal. Without the heartbeat you'd never see it.
Bots accumulate. Once you have three or four, run this monthly on your strongest model:
Go through every bot and scheduled task I have. For each: what data can it read, what can it post and where, whose credentials is it using, and what happens if a permission changes or a connector breaks. Flag anything where the access is broader than the job requires.
Does it have read access to your entire HR system when all it needs is names and dates? Very often the answer is yes, because that was the easy way to connect it. Narrow it. A birthday bot with visibility of salaries is an accident waiting for a prompt injection.
Every three prompts, check for bugs. Every ten, check for security.
It's a birthday bot. It is not going to transform your company.
But it teaches you the shape of every bot you'll build afterwards, in the one place where getting it wrong costs nothing. And it makes the case for the thing that's easy to sneer at: a small, warm, slightly silly automation that makes a Tuesday marginally better.
Does this bring people joy, or is it just efficient? Best question in the episode. Worth asking about everything you build.
The whole guide as a PDF, prompts included, in full colour — for reading offline or sending to the colleague who needs it most. The print option gives you an ink-friendly version instead.
This guide came out of Top of the Ops, Season 1 Bonus — "Ride or Die AI Workflows", where Bea and Ceci went through every automation they actually run. The rest of the Operator Field Guides live on the Free Guides page.
Built something better? Tell us. We'll publish the improved version and credit you.