Work  /  Back Office  /  13

Client Onboarding — Signature to Kickoff without Chasing

Agencies · Consultancies · Professional services · Coaching

Built — counted from the workflow JSON in the repository; not yet run against live accounts

68nodes
5workflows
11sticky notes
65connections
Five rising steps — a signed contract, a payment, a folder, a channel — ending at a flag.

The problem

Between yes and the work starting, someone chases a signature, a deposit, an intake form, a folder, a kickoff call and a welcome email.

It is the least skilled work in the business, and it is done by the most expensive person in it — because they are the one who noticed it was stuck.

How it runs

  1. Contract from the deal

    01 / 06 Workflow 1 of 5 · Proposal Accepted to Contract · 12 nodes

    When a proposal is accepted, the contract is generated from the deal record’s real values and sent for signature — once.

  2. Signed, then a link

    02 / 06 Workflow 2 of 5 · Signature to Payment Link · 14 nodes

    The signature webhook creates the deposit link, carrying the deal’s ID in Stripe’s metadata.

  3. Claim the payment

    03 / 06 Workflow 3 of 5 · Payment to Provisioning · 20 nodes

    Stripe’s event ID is recorded before anything is provisioned, so a second delivery of the same event exits as already done.

  4. Provision

    04 / 06 Workflow 3 of 5 · Payment to Provisioning · 20 nodes

    Project folder, CRM stage, kickoff invite from real availability, internal channel — and the welcome email last.

  5. Chase the intake

    05 / 06 Workflow 4 of 5 · Intake Chaser · 11 nodes

    Each unanswered section chases itself after 2, 3, 4, 7, 7 and 7 days, and stops the moment it is answered.

    six chases → a person rings them

  6. One status line

    06 / 06 Workflow 5 of 5 · Status Record · 11 nodes

    Every client has one status line and every stage a patience budget, so the only rows anyone reads are the stuck ones.

The five workflows, as built

Every node with its icon, as on the n8n canvasstarts a runHover a node for its name and type

  • 01Proposal Accepted to Contract

    12 nodes · 11 connections · 2 notes

    Proposal Accepted Webhook · WebhookProposal AcceptedWebhookLoad Deal From CRM · Google SheetsLoad Deal FromCRMDeal Found? · IfDeal Found?Respond — Unknown Deal · Respond to WebhookRespond — UnknownDealBuild Contract Fields From The Deal · CodeBuild ContractFields From The…Contract Already Sent? · IfContract AlreadySent?Respond — Already Sent · Respond to WebhookRespond — AlreadySentGenerate Contract From Template · HTTP RequestGenerate ContractFrom TemplateSend For Signature · HTTP RequestSend ForSignatureWrite Onboarding Record · Google SheetsWrite OnboardingRecordNotify — Contract Out · SlackNotify — ContractOutRespond — Sent · Respond to WebhookRespond — Sent

    the real deal values, a send-once guard

  • 02Signature to Payment Link

    14 nodes · 13 connections · 2 notes

    E-Signature Webhook · WebhookE-SignatureWebhookVerify Signature Webhook · CodeVerify SignatureWebhookWebhook Authentic? · IfWebhookAuthentic?Refuse Unsigned · Respond to WebhookRefuse UnsignedIs It A Completed Signature? · IfIs It A CompletedSignature?Respond — Not A Completion · Respond to WebhookRespond — Not ACompletionLoad Onboarding Record · Google SheetsLoad OnboardingRecordPayment Link Already Made? · IfPayment LinkAlready Made?Respond — Link Already Sent · Respond to WebhookRespond — LinkAlready SentCreate Stripe Payment Link · HTTP RequestCreate StripePayment LinkSave Link And Advance Stage · Google SheetsSave Link AndAdvance StageEmail The Deposit Link · GmailEmail The DepositLinkNotify — Signed · SlackNotify — SignedRespond — Link Sent · Respond to WebhookRespond — LinkSent

    a signed webhook, the deposit link

  • 03Payment to Provisioning

    20 nodes · 19 connections · 3 notes

    Stripe Payment Webhook · WebhookStripe PaymentWebhookVerify Stripe Signature · CodeVerify StripeSignatureSignature Valid? · IfSignature Valid?Refuse Unsigned · Respond to WebhookRefuse UnsignedIs It A Successful Payment? · IfIs It ASuccessful…Respond — Not A Payment · Respond to WebhookRespond — Not APaymentClaim This Event Id · CodeClaim This EventIdRead Processed Events · Google SheetsFirst Time Seeing This Event? · IfFirst TimeSeeing This…Respond — Already Provisioned · Respond to WebhookRespond —Already…Record Event Id · Google SheetsRecord Event IdLoad Onboarding Record · Google SheetsLoad OnboardingRecordCreate Project Folder · Google DriveCreate ProjectFolderCreate Internal Slack Channel · HTTP RequestCreate InternalSlack ChannelOffer Kickoff From Real Availability · HTTP RequestOffer KickoffFrom Real…Start Intake Form Sequence · Google SheetsStart IntakeForm SequenceAdvance Stage To Onboarding · Google SheetsAdvance Stage ToOnboardingSend Welcome Email · GmailSend WelcomeEmailNotify — Client Live · SlackNotify — ClientLiveRespond — Provisioned · Respond to WebhookRespond —Provisioned

    the event-ID claim, then everything

  • 04Intake Chaser

    11 nodes · 13 connections · 2 notes

    Daily Chase Check · Schedule TriggerDaily Chase CheckRead Onboarding Records · Google SheetsRead OnboardingRecordsWhich Sections Are Still Missing? · CodeWhich SectionsAre Still…Anything Due? · IfAnything Due?Nothing Due · No OperationNothing DueOne Client At A Time · Loop Over ItemsOne Client At ATimeChase Or Escalate? · IfChase OrEscalate?Compose Chase For Missing Sections Only · CodeCompose Chase ForMissing Sections…Send The Chase · GmailSend The ChaseRecord The Chase · Google SheetsRecord The ChaseEscalate — Chased Enough · SlackEscalate — ChasedEnough

    the stop first, then the ladder

  • 05Status Record

    11 nodes · 9 connections · 2 notes

    Intake Section Submitted · WebhookIntake SectionSubmittedMark Section Answered · CodeMark SectionAnsweredSave Answered Sections · Google SheetsSave AnsweredSectionsRespond — Recorded · Respond to WebhookRespond —RecordedRebuild Status Board · Schedule TriggerRebuild StatusBoardRead All Onboarding Records · Google SheetsRead AllOnboarding…Compute One Status Line Per Client · CodeCompute OneStatus Line Per…Write Status Board · Google SheetsWrite StatusBoardAnything Stuck? · IfAnything Stuck?Post Stuck Clients · SlackPost StuckClientsNothing Stuck · No OperationNothing Stuck

    credit per section, a patience budget per stage

68 executing nodes, by type

Google Sheets 14Respond to Webhook 12If 11Code 8HTTP Request 5Slack 5Webhook 4Gmail 3Other 6

The gates, 11 If nodes, decide whether anything happens next: a countable part of the system, not a claim about it. The 11 sticky notes carry the reasoning on the canvas, at the point it applies.

The guards, and what each one prevents

HoverTap a card to read what it prevents.

  • The event ID is claimed before provisioning

    Stripe retries, and can deliver the same event twice when nothing is wrong. Without the claim, a client’s first impression is two folders, two channels and two welcome emails.

  • Signatures that survive key rotation

    During a rotation Stripe sends more than one signature; any match is accepted, inside a five-minute window, and a missing secret fails closed.

  • The contract is built from the deal

    The figure the client signs and the figure they are billed are the same figure by construction. A deal with no amount throws rather than produce a contract for zero.

  • Signature and payment are separate

    They are separate events, minutes or days apart. A client who signs and never pays should not have a folder, a channel and a kickoff invite waiting.

  • The stop is computed before the ladder

    Suppression is not a filter further down that someone can reorder: every section answered means the record exits.

  • Only the missing sections are named

    Someone who filled in three of four and gets the whole form again reads it as “you did not notice”.

Limits, stated plainly

  • Built, not yet deployed. Every file imports cleanly; no real signature and payment has flowed through it.
  • The e-signature vendor is PandaDoc. DocuSign means rewriting the first two workflows.
  • The event-ID claim is as atomic as a Google Sheet allows. On a busy account it belongs in PostgreSQL with a unique constraint — a one-node swap.
  • There is no refund or chargeback path yet: a refunded payment changes nothing.

Built with

  • n8n
  • PandaDoc
  • Stripe
  • Google Drive
  • Google Sheets
  • Gmail
  • Slack