It is the Thursday before a long weekend, and your operations lead has three tabs open: a hiring board, a spreadsheet of candidate project managers, and a Slack channel where four account managers are asking the same question. "Where are we on the IJmuiden rebuild?" None of this is a hiring problem. It is a process-automation problem, and the cost stays invisible until you go looking for it.
The instinct is to hire. Another PM would absorb the chase. But a project manager costs €4,000 to €6,000 a month, and most of what they would absorb is not management. It is collection. Copying a number from one tool into another. Asking a designer for an update that already exists in the task board. A recent r/webdev thread made the wider point well: headcount layered onto a weak process does not fix the process, it hides it.
This is a field guide to the six tasks worth automating before you write that job description. None of them need a model fine-tune or a six-week project. Most are a scheduled script and a webhook.
The hire that hides the process
A PM dropped onto a broken process becomes a human integration layer. They spend the day moving data between systems that should already talk to each other, and because they are good at it, nobody notices the systems never got fixed. Six months later you have the same problem plus another salary.
So before automating anything, write down the actual sequence of a task: who triggers it, where the data starts, where it ends, who gets nagged. Half the time the map alone shows you the fix.
Automating a broken process only makes the breakage faster and harder to see. Map the steps on paper first. If you cannot draw it, you are not ready to script it.
Project kickoff intake
A deal closes. Someone then creates the project in the task tool, opens a Slack channel, makes the drive folder, copies in a task template, invites the team, and pastes the budget somewhere. Thirty to forty-five minutes, and a step gets missed often enough that you have all seen a project run for a week with no budget recorded.
Trigger it from the CRM instead. When a deal moves to "won", a webhook builds the skeleton:
# intake.py - turn a closed deal into a project skeleton
from fastapi import FastAPI, Request
app = FastAPI()
HOURLY_RATE = 95
@app.post("/intake")
async def intake(req: Request):
deal = await req.json()
project = create_project(
name=deal["client"],
budget_hours=deal["amount"] / HOURLY_RATE,
channel=create_slack_channel(deal["client"]),
)
seed_tasks(project, template=deal["service_type"])
notify(project.lead, f"{deal['client']} is live: {project.url}")
return {"project_id": project.id}
The win is not the saved half hour. It is that every project now starts the same way, so every later automation can assume the same shape.
Status chasing across the team
"Where are we on X" is the single most expensive sentence in an agency. Answering it pulls a PM into five DMs, each of which interrupts someone whose update already exists: in the git history, the task tool, the time tracker.
Pull it instead of asking for it. A script reads the three sources every morning and posts one line per active project to a single channel: last commit, open tasks, hours burned against budget. No DMs, no standup that exists only to collect what a query could.
Keep the digest short. One line per project, with the change since yesterday. A status update that runs 400 words gets skimmed and then ignored.
Timesheet and WIP reconciliation
Every project has a budget and a burn. The gap between them is where margin quietly dies. Most agencies discover a project is 130% over only when someone finally adds up the timesheets, which is to say too late.
Run the reconciliation nightly. Sum approved time entries per project, compare against budget hours, and flag anything past 80%. The output goes to the project lead, not a report nobody opens. The point is to catch the overrun while there are still levers to pull.
Client status reports
The weekly client update is real work, and it is also the same three questions every week: what shipped, what is blocked, what is next. That is structured data, and you already have it from the status digest above.
Generate the draft, then have a human edit and send. Do not automate the send. The draft saves the blank-page tax; the human keeps the judgment. And resist the temptation to let a model pad it. A recent Hacker News thread caught the mood exactly: people are tired of AI-generated walls of text dropped into conversations. Clients feel that instantly. They want three short sections, not an essay that took longer to read than the work took to do.
Invoice chasing
Somewhere there is a spreadsheet of unpaid invoices, 400 rows deep, colour-coded, maintained by hand. It is the clearest automation candidate in the building, because the logic is a query:
-- invoices past due that still need a nudge
SELECT id, client_email, amount, due_date
FROM invoices
WHERE status = 'sent'
AND due_date < CURRENT_DATE - INTERVAL '3 days'
AND reminders_sent < 3;
Schedule that, send a templated reminder, increment the counter. If you bill through a payment provider, you may not need to build it at all: Stripe's automatic reminders cover this from the dashboard. The trap is reconciliation, and we will come back to it.
Meeting notes and action items
Client calls end with commitments, and commitments decay if they live only in someone's notebook. A transcript can be turned into a list of action items with an owner and a due date, written straight into the task tool.
One rule: a human reviews the list before it is assigned. Transcripts mishear names and misread tone, and an action item invented by a model and silently assigned to a developer is worse than no automation at all.
The tasks worth leaving alone
Scoping a project, having the hard conversation when a client is unhappy, deciding which of two late projects gets the senior developer this week. These are judgment, and judgment is the actual job of a PM. Automating the collection work does not replace the role, it clears the desk so the role can be done.
For the plumbing, you do not have to start from scratch. Open-source tools such as n8n give you a self-service workflow runner, so the six tasks above become configuration rather than a fresh codebase. Use them for the wiring. Keep the judgment human.
When we built a process-automation setup for a Rotterdam recruitment agency, invoice chasing was the first task we took on, and the thing we ran into was reconciliation: "paid" lived in their bank feed, not their invoicing tool, so a naive reminder would nag clients who had already settled up. We solved it by matching the bank export against open invoices before any reminder left the building, which is the kind of unglamorous detail that decides whether process automation earns trust or loses it.
Here is the five-minute version. Open your last five "where are we on X" threads in Slack. For each answer, ask where that fact lived before a human retyped it into the thread. Every one that already existed in a tool is a line on your backlog, and that backlog is shorter than a job description.




