AI BUILDERS STACK
Build Logn8n

We rebuilt our client onboarding as one n8n flow — here's every node

From signed proposal to kickoff call in 4 minutes, fully automated. The full workflow, the two dead ends we hit, and the JSON to import it yourself.

K

Kaan · Founder

Jul 10, 2026 · 9 min read

The onboarding automation flow — trigger fanning out through enrich, score and docs nodes into a kickoff

Every new client used to cost us about three hours of admin before any real work started: contract filing, folder setup, Slack channel, kickoff scheduling, CRM updates. Multiply that by four or five new projects a month and it's a part-time job nobody applied for.

So we did what we tell clients to do: picked the most boring, most repetitive process we own, and automated the whole thing end to end. This post is the complete build — every node, both mistakes, and the exported JSON at the bottom.

What the flow actually does

The trigger is a signed proposal webhook from our e-signature tool. From there, one flow fans out into four branches that run in parallel:

  • CRM: deal moved to "Active", project record created, contact roles assigned.
  • Workspace: Drive folder from template, Slack channel with client + team invited.
  • Scheduling: kickoff invite sent with three slots pulled from the lead engineer's calendar.
  • Billing: deposit invoice generated and queued for approval — the one step we kept human.

The goal was never to save three hours. It was to make the first day of every project feel instant.

The two dead ends

Dead end #1: creating the Slack channel first. If any later branch failed, the client was sitting in an empty channel wondering what's going on. Channel creation moved to the very last step, gated on everything else succeeding.

Dead end #2: trusting the webhook payload. Our e-signature tool occasionally fires the signed event twice. Without an idempotency check we created duplicate folders, channels, and — worse — invoices. One dedupe node fixed it:

DEDUPE.NODE

const key = $json.envelope_id;
const seen = await this.getWorkflowStaticData('global');

if (seen[key]) {
  return []; // duplicate event — stop here
}
seen[key] = Date.now();
return $input.all();
!

Rule of thumb: any webhook that can create money-adjacent records (invoices, orders, refunds) gets an idempotency gate. No exceptions, even for "reliable" providers.

Results after eight weeks

4 min

signature → kickoff invite

11 hrs

admin saved per month

0

duplicate invoices since dedupe

The flow has run 14 times in production. The only manual touch left is approving the deposit invoice — deliberately. Everything else happens before we've finished reading the "we signed!" email.

Get the workflow JSON

Free for community members — import it into n8n, swap your credentials, and it runs.

Join free & download
K

Written by Kaan

Founder of AI Builders Stack. Builds automations for clients by day, writes up what broke by night.