How it works
What this workflow does
Turn an approved deal into a delivery handoff the project owner can act on. One authenticated webhook accepts the signed deal details, validates the intake, and upserts two Google Sheets records: a handoff summary and a kickoff checklist. When enabled, it also reserves and saves a Gmail welcome draft for the owner to review and send.
The workflow imports inactive and starts with a manual sample path. dryRun is enabled by default, so the preview uses fictional data and does not contact Google Sheets or Gmail.
This is the executable handoff layer described in the Commercial-to-Delivery Project Handoff blueprint; the Project Delivery QA & Completion blueprint covers the work that follows kickoff.
Validate before writing
Build handoff checks a stable handoff ID, client name and email, company, service, agreed scope, delivery owner, and a real calendar date. Missing or invalid values do not crash the run. They set the row to needs_review and list the reasons in Review Reasons, so incomplete intake stays visible in the same delivery queue.
The handoff and checklist use the same Handoff ID as the upsert key. A replay updates the existing rows instead of creating another handoff. A recorded Gmail draft ID prevents a second draft, and a draft_pending state blocks an unsafe retry until the owner checks Gmail.
Draft only after a ready handoff
The optional Gmail step runs only when createWelcomeDraft is true and the handoff is ready. The workflow writes a draft_pending reservation before calling Gmail, saves the draft, verifies the returned draft ID, and records it with a ready status. The owner reviews the greeting, kickoff date, and delivery contact in Gmail before sending. No email is sent automatically.
Validation scope
The supplied report confirms import into an isolated n8n 2.47.4 database, the inactive import, and the sample path. It also records structural checks, unique node IDs, intact connections, and Code-node syntax. Connected-account authentication, public webhooks, and live Google Sheets or Gmail calls require a staging test with your own accounts.
How to use
Before you start
- A current n8n instance.
- A Google spreadsheet with two tabs and the exact row-one headers below.
- A Google Sheets OAuth credential for both Sheets nodes.
- A Gmail OAuth credential only if you enable the welcome draft.
- A trusted server that can send the authenticated intake payload.
1. Import and run the sample
Download the complete package, extract the ZIP, and read the full setup guide. Import client-onboarding-handoff.n8n.json into n8n and save it. Keep the workflow inactive.
Open Run with sample data and choose Test workflow. The Handoff preview branch should return a ready handoff for DEAL-1042, with a delivery owner, kickoff checklist, and welcome copy.
2. Create the spreadsheet
Create one spreadsheet with these two tabs and the exact headers. Format the ID and date columns as plain text so retries can find the same deal.
| Tab | Headers |
|---|---|
Handoffs | Handoff ID, Client Name, Client Email, Company, Service, Agreed Scope, Delivery Owner, Kickoff Date, Status, Review Reasons, Welcome Draft, Draft ID |
Checklist | Handoff ID, Delivery Owner, Kickoff Date, Checklist |
3. Configure Setup and credentials
Open Setup and set spreadsheetId and an optional fallbackOwnerEmail. Leave createWelcomeDraft false until the handoff rows are correct. Set dryRun to false only when you are ready to write to the spreadsheet.
Select the Google Sheets OAuth credential on Find existing handoff, Save handoff, Save kickoff checklist, Reserve draft creation, and Record draft ID. For Gmail drafts, select the owner Gmail credential on Create welcome draft and set createWelcomeDraft to true.
Create a Header Auth credential on Receive event, such as X-Uptune-Webhook-Key with a randomly generated value. Forward the key from a trusted server together with handoffId, clientName, clientEmail, company, service, scope, kickoffDate (YYYY-MM-DD), and ownerEmail. The HTTP response acknowledges receipt; the n8n execution shows the actual outcome.
4. Test the failure paths
Use the supplied test payloads for a complete deal, a missing scope, and an impossible date. A complete deal produces one ready handoff and one checklist. Incomplete or invalid values produce a needs_review row with the reasons listed. Resend the same handoff ID and confirm the rows update instead of duplicating.
5. Go live
Set dryRun to false for a staging run with a fictional deal. Confirm the two rows and, if enabled, the Gmail draft. Then activate the workflow for the signed-deal event. Process events for the same handoff ID serially. Sheets lookups and writes are separate operations, so use an upstream queue or a database with a unique key if concurrent delivery is possible.
Related automations
Use the Proposal Draft & Slack Approval System to approve the commercial terms before this handoff starts. Use the Sales-Call Follow-Up Draft System to capture the next step from the sales call, and the Calendly Booking Sync System to keep the kickoff meeting visible in Airtable. Read the Commercial-to-Delivery Project Handoff blueprint for the wider process and ownership model.
Use the HubSpot Ghosted Proposal Follow-Up & Recovery System for the pre-close follow-up that precedes this handoff.