Operator Field Guide No. 04 Free — no sign-up wall

The Birthday Bot
Cancel the software you're paying for, and build your first bot in twenty minutes

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.

20 minutesTime to build
A subscriptionWhat it replaces
No codeSkill level
Free tierCost
Contents
  1. Start here
  2. What you need
  3. The consent bit
  4. Pick your model
  5. 1 · Get your dates together
  6. 2 · The build prompt
  7. 3 · Name and face
  8. 4 · Install it
  9. 5 · Make it fail loudly
  10. 6 · Audit it
  11. When not to do this
  12. Troubleshooting
  13. The point of this
Start here

Even though it's the smallest

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.

The pattern you learn

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.

What you need

Three things, and a spreadsheet counts

You needOptions that work
A list of datesAn 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 chatSlack, Microsoft Teams, Discord
An AI with a schedulerClaude 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.

Pick your model

The one build you don't need the top tier for

As of August 2026:

What you're doingOn ClaudeOn ChatGPT
Building itSonnet 5GPT-5.6 Terra
The daily runSonnet 5GPT-5.6 Terra
Auditing your botsFable 5, high effortGPT-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.

Step 1

Get your dates in one place

If you're using a sheet, make it exactly this:

NameSlack handleBirthday (day month)Start dateAnnounce?
Priya Raman@priya14 March2024-02-01Y
Tom Okafor@tom2 September2022-11-15N

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:

Check the schema first
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.

Step 2

The build prompt

The build prompt
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
The "never invent a fact" rule matters more than it looks

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.

Step 3

Give it a name and a face

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:

  • Give it a name. People forgive a named bot for being a bot.
  • Give it an icon. Slack and Teams both let you set one. Takes ten seconds.
  • Give it one running joke. One. A bot with too many jokes is exhausting.

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.

Step 4

Install it

On Claude

Ask in a chat with your chat tool and date source connected:

Schedule it
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:

SKILL.md frontmatter
---
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.

On ChatGPT

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.

Step 5

Make it fail loudly

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.

Silence looks identical to a quiet week

That's the trap. So: two safeguards.

One, alert on failure, as in the spec above. Two, a weekly heartbeat:

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.

Step 6

Audit it

Bots accumulate. Once you have three or four, run this monthly on your strongest model:

Security audit
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.
The specific question for this bot

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.

The general cadence

Every three prompts, check for bugs. Every ten, check for security.

Honest limits

When not to do this

  • If your team would find it naff, don't. Culture varies. A birthday bot in a team of eight who all sit together is worse than a human saying it. This is for teams big enough that people genuinely get forgotten.
  • Don't extend it to sensitive dates. Birthdays and work anniversaries, fine. Not probation end dates, not visa expiries, not performance review dates. Those need to be private, and a bot that posts them publicly is a serious incident.
  • Don't let it infer. No "congratulations on your promotion" from a job-title change it spotted. Title fields change for all sorts of reasons and getting that wrong publicly is genuinely painful for someone.
  • Cancel the old subscription. Genuinely. The saving only exists if you actually turn the paid tool off, and this is the step people forget.
Troubleshooting

When it misbehaves

"It posted twice."
Two runs, or a retry. Add: "Before posting, check whether you already posted about this person today. If so, do nothing."
"The messages are all identical."
It's ignoring the variation rule. Give it fifteen approved variants to rotate through, rather than asking it to be creative daily.
"It mentioned someone's age."
Delete the birth year from your source entirely. This is a data problem, not a prompt problem, and the data fix is permanent.
"It posted for someone who left."
Your source is stale. Add: "Skip anyone whose end date is in the past or who is marked inactive."
"It went quiet and I didn't notice."
You skipped Step 5. Go back and add the heartbeat.
The point of this

Does this bring people joy?

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.

Take it with you

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.

Download PDF

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.

More from Top of the Ops

05
The Invoice Fairy
A Slack bot that answers the same finance question for the fortieth time.
11
Our Ride or Die AI Workflows
The episode this guide came from. Every automation we actually run.
All Free Guides
The rest of the Operator Field Guides.