# Turn new client intake into a project handoff

Turn a signed deal into a delivery record and a kickoff checklist your project owner can act on. Incomplete intake lands in the same handoff sheet with the fields to review. An optional Gmail welcome draft gives the owner a message to check before sending.

**Category** Revenue Operations  
**Tools** n8n, Google Sheets, Gmail (optional)  
**Trigger** Authenticated POST from a CRM, contract tool, or internal intake service  
**Package** [Workflow JSON](client-onboarding-handoff.n8n.json) · [Test payloads](test-payloads.json) · [Validation report](validation-report.txt)

## How it works

1. Validate the signed deal ID, client details, agreed scope, delivery owner, and kickoff date.
2. Upsert the handoff and checklist by the same stable **Handoff ID**. Rows with missing information get `needs_review` and a list of reasons.
3. If enabled, reserve a draft for a ready handoff, save it in Gmail, and record the draft ID. The owner reviews and sends it from Gmail.

## How to use

1. Import the workflow and run **Run with sample data**. Open **Handoff preview** and check the owner, checklist, and draft text.
2. Create one Google spreadsheet with these two tabs. Use the exact row-one headers below. Format the ID and date columns as plain text so a retry can find the same deal ID.

   | 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. Select the Google Sheets OAuth credential on each Sheets node. Enter the spreadsheet ID and optional `fallbackOwnerEmail` in **Setup**. For Gmail drafts, select the owner's Gmail credential and set `createWelcomeDraft` to `true`.
4. Create a **Header Auth** credential on **Receive event**, such as `X-Uptune-Webhook-Key` with a randomly generated value. Use the test webhook first. Forward the key from a trusted server, along with `handoffId`, `clientName`, `clientEmail`, `company`, `service`, `scope`, `kickoffDate` (YYYY-MM-DD), and `ownerEmail`. The HTTP response acknowledges receipt. Check the n8n execution for the actual outcome.
5. 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.

## Test and operate

| Scenario | Expected result |
| --- | --- |
| A complete signed deal arrives | One ready handoff and one checklist. Gmail draft only when enabled. |
| An intake is missing its scope or has an invalid date | The row is marked `needs_review`, with the missing information listed. |
| The same deal ID arrives again | The two rows are updated. A recorded draft ID prevents a second draft. |
| A Gmail attempt stops after reservation | The handoff stays `draft_pending`. Check Gmail, fill in the draft ID if present, and restore `ready` before processing the event again. |

Process events for the same handoff ID serially. Sheets lookups and writes are separate operations. Use an upstream queue or database with a unique key if concurrent delivery is possible. Use the handoff sheet as the delivery team’s review queue.

[Community source by Faraz Shoaib](https://n8n.io/workflows/19014-manage-client-onboarding-and-project-handoff-with-google-sheets-and-gmail/)
