If you’ve ever onboarded a new client, you know the drill: collect their info, send a welcome email, set up a folder, create a task list. It’s repetitive, prone to errors, and eats an hour you could spend on actual work. A few months ago, I decided to automate it with a Google Apps Script, and now the whole process takes zero minutes.
The idea is simple: every time a new client fills out a form, it lands in a Google Sheet. My script watches that sheet, grabs the new row, and fires off a series of actions. It sends a personalized welcome email from Gmail, creates a shared drive folder with the client’s name, and adds tasks to my project management tool via its API. The result? I get a notification, and everything is already set up.
**Why Google Sheets?** Because it’s free, accessible, and has built-in triggers. You don’t need a server or a database. If you’re an indie hacker or a solo consultant, you probably live in Google’s ecosystem anyway. And Apps Script gives you enough power to integrate with almost any API out there.
Here’s how I built it:
1. Create a Google Sheet with columns for name, email, company, and a status column.
2. Open Extensions > Apps Script and write a function that reads the last row.
3. Use the MailApp service to send a template email.
4. Use DriveApp to create a folder.
5. Use UrlFetchApp to hit your project management tool’s API and create a task.
6. Set an installable trigger to run the function every minute.
That last step is key. Installable triggers run in the background, so you don’t need to open the sheet. I set mine to run every minute, which is fine for low volume. If you get more than a few clients a day, you might want to use a time-driven trigger every 5 minutes, but for most of us, a minute is enough.
Let me show you a snippet that sends the email:
“`javascript
function sendWelcomeEmail(row) {
const name = row[0];
const email = row[1];
const subject = “Welcome to the team!”;
const body = `Hi ${name},nnWe’re excited to work with you. Here’s what to expect…`;
MailApp.sendEmail(email, subject, body);
}
“`
You can customize the subject and body as much as you want. I’ve used HTML bodies with links to my invoice page and a scheduling link for the kickoff call. It makes the client feel like you’ve got your act together.
What about the task creation? I use Todoist, so I hit their API:
“`javascript
const todoistToken = “YOUR_TOKEN”;
const projectId = “YOUR_PROJECT_ID”;
function createTask(clientName) {
const payload = {
content: `Onboard ${clientName}`,
project_id: projectId,
};
options = {
method: “post”,
headers: { “Authorization”: `Bearer ${todoistToken}` },
contentType: “application/json”,
payload: JSON.stringify(payload),
};
UrlFetchApp.fetch(“https://api.todoist.com/rest/v2/tasks”, options);
}
“`
You can do the same with Asana, Trello, or Notion—they all have APIs. The script becomes a tiny integration layer that keeps your stack in sync.
One thing I learned the hard way: always handle errors. If the email fails to send because the address is invalid, you don’t want the whole script to crash. Wrap each step in a try-catch and log to a separate ‘errors’ tab. That way, you can review and fix manually if needed.
Another tip: use the onFormSubmit trigger instead of time-based if you’re using a Google Form. That fires the script instantly when a new submission comes in, so it’s even faster. I switched to that and now there’s zero delay.
This script has saved me at least 10 hours a month. For a solo consultant, that’s a full day and a half of billable time. If you’re tired of the same onboarding dance, try it. You’ll wonder why you didn’t do it sooner.
