Client onboarding is where good agencies go to die. Not because it’s hard, but because it’s repetitive. You send the same welcome email, create the same folder structure, add the same tasks to your project tracker, and set up the same recurring invoice. Do that ten times a month and you’ve lost a full workday.
Most founders assume automation means hiring a developer or buying an expensive platform. It doesn’t. You can automate 80% of onboarding with a handful of scripts and a little glue. Here’s how.
## Step 1: Map the actual steps
Before you touch a script, write down every action you take from signed contract to kickoff call. Be granular. For example: create a Google Drive folder, copy the proposal into it, add client to Slack channel, create Asana project from template, send welcome email with questionnaire link, schedule kickoff call, create invoice in Stripe.
You’ll probably find 12–20 steps. Most are triggers followed by actions. That’s automation gold.
## Step 2: Identify your triggers
The trigger is the event that starts the chain. In most agencies, it’s one of: a new deal marked ‘Won’ in the CRM, a signed contract uploaded to a folder, or a payment received. Pick the one that happens earliest and most reliably.
For a lot of indie hackers, a Stripe payment is the cleanest trigger. It’s timestamped, has customer data, and fires a webhook. You can listen for that webhook with a 20-line script and kick off everything else.
## Step 3: Chain the actions with scripts
You don’t need Zapier for every step. Sometimes a simple Python script that calls the Google Drive API, then the Asana API, then the Stripe API is faster and cheaper. But if you want a visual builder, that’s fine too. The key is to avoid manual copying between tools.
Start with the highest-friction step. For most people, that’s creating the project folder and populating it with templates. A script can do that in two seconds. Write it once, run it forever.
## Step 4: Add error handling (or at least logging)
Automation that fails silently is worse than no automation. Add a simple log file or send yourself a Slack message when a step fails. You don’t need enterprise monitoring. A try/except block that pings a webhook is enough.
One client of ours runs a script that creates onboarding folders. When it fails, it sends a message to a dedicated Slack channel. That channel has become their early warning system for API changes.
## Step 5: Test with a fake client
Before you run it on a real customer, create a test client. Use a fake email you control. Run the entire flow. Fix what breaks. Then run it again. Only after two clean runs should you point it at production.
## Step 6: Document the handoff
Even if you’re a solo founder, write down how the automation works. Future you will forget. A one-page README with the trigger, the steps, and where to find logs is enough. If you ever hire, it’s ready to hand off.
## What this looks like in practice
A two-person design studio automated their onboarding with four scripts: one listens for Stripe payments, one creates a Notion project from a template, one sends a welcome email via Postmark, and one schedules a Calendly link. Total setup time: three hours. Time saved per client: 45 minutes. They onboard 15 clients a month. That’s 11 hours saved monthly, or roughly a full workday and a half.
The scripts cost them $79. The alternative was a $200/month SaaS tool that did less.
## The tools you actually need
You don’t need a platform. You need a way to listen for events (webhooks), a way to call APIs (HTTP requests), and a way to schedule recurring tasks (cron). That’s it. Python’s requests library and a cron job can replace most of your stack.
If you want to skip the setup, our automation library includes pre-built onboarding scripts for Stripe, Google Drive, Slack, and Notion. You just add your API keys and go.
## Start with one step
The biggest mistake is trying to automate everything at once. Pick the step that annoys you most. Automate that. Then pick the next one. In a week, you’ll have a workflow that runs itself. And you’ll wonder why you waited so long.
