Back to New Client Onboarding Handoff

Developer Handover Pack

Everything needed to build the automation from scratch: current state, full agent specs, data flow, and the build stack.

4 pagesPDF · Technical
FS-DOC-04Technical

Developer Handover Pack

New Client Onboarding Handoff

[YourCompany.com] · Sales Department · Prepared by FullSpec · [Today's Date]

This document is the complete technical handover for the New Client Onboarding Handoff automation. It covers the current-state step map with identified bottlenecks, full specifications for each of the three agents the FullSpec team will build, the end-to-end data flow across all tool integrations, and the recommended build stack with estimated effort. The FullSpec team owns all build, configuration, and testing activity described here. Your team's responsibility is to confirm prerequisites, validate data quality in HubSpot, and provide OAuth access for Gmail accounts before build begins.

01Process snapshot

Step
Name
Description
1
Confirm Contract Is Signed
Sales rep checks DocuSign or email to confirm full execution by both parties. Often done reactively when the client follows up. Time cost: 10 min.
2
Update CRM Deal Stage
Rep opens HubSpot and manually moves the deal to Closed Won, fills in close date, contract value, and ops-required custom fields. Time cost: 15 min.
3
Create Client Folder Structure
Rep or ops admin duplicates a Google Drive folder template, renames it for the new client, and shares it with the delivery lead. Frequently skipped or duplicated. Time cost: 20 min. BOTTLENECK.
4
Write and Send Internal Handoff Brief
Sales rep composes a Slack handoff note covering client background, scope, key contacts, and sales promises. Longest manual step; most likely to be delayed or skipped entirely. Time cost: 40 min. BOTTLENECK.
5
Create Client Record in Project Tool
Ops admin manually creates a new Notion page, copies details from the handoff brief, and sets up the project workspace. Time cost: 25 min.
6
Assign Delivery Team Members
Delivery lead reviews availability and manually assigns team members in Notion, then notifies them individually via Slack. Time cost: 15 min.
7
Send Client Welcome Email
Account manager pulls a saved Gmail draft, personalises it, and sends it. Timing varies widely between reps; often delayed by hours or days. Time cost: 20 min. BOTTLENECK.
8
Schedule Kickoff Call
Account manager emails the client to propose dates, books the call manually, and creates a calendar invite and Zoom link. Time cost: 15 min.
9
Log Signed Contract in Shared Drive
Ops admin downloads the signed PDF from DocuSign and uploads it to the client folder in Google Drive. Time cost: 10 min.
10
Confirm Handoff Is Complete
Delivery lead checks all setup tasks and replies to the handoff thread or updates a checklist. Often done informally or not at all. Time cost: 10 min.
Time cost summary: Total manual time per onboarding cycle is 180 minutes (3 hours). At a run volume of 18 new clients per month and 4.2 hours of manual effort per week, the cumulative cost at $50/hour is approximately $10,920 per year. The automation replaces steps 1, 2, 3, 4, 5, 7, 9, and 10 entirely. Steps 6 (delivery team assignment) and 8 (kickoff call scheduling) remain human-owned by design.
Developer Handover PackPage 1 of 4
FS-DOC-04Technical

02Agent specifications

Handoff Trigger Agent

Watches DocuSign for a fully executed contract event and immediately initiates the onboarding sequence. On receipt of the webhook payload, the agent parses client name, deal value, signer email, and document ID from the envelope data, then writes those values to the corresponding HubSpot deal record, advancing the deal stage to Closed Won and stamping the close date. This agent acts as the single source of truth handoff: nothing downstream fires until this agent confirms a clean HubSpot write. If the HubSpot deal cannot be located by the DocuSign envelope reference, the agent halts and posts an alert rather than continuing with incomplete data.

Trigger
DocuSign Connect webhook: envelope status = 'completed' (both parties signed)
Tools
DocuSign, HubSpot
Replaces steps
Steps 1 and 2
Estimated build
10 hours, Moderate complexity
// Input
DocuSign envelope webhook payload {
  envelope_id: string,
  status: 'completed',
  signer_email: string,
  signer_name: string,
  completed_date_utc: ISO8601,
  document_name: string,
  custom_fields: { deal_value: number, hs_deal_id: string }
}

// Output
HubSpot deal record update {
  hs_deal_id: string,
  dealstage: 'closedwon',
  closedate: ISO8601,
  contract_value: number,
  docusign_envelope_id: string,
  onboarding_status: 'triggered'
}
  • DocuSign Connect must be configured at the DocuSign account level to POST to the automation platform's inbound webhook URL. This requires DocuSign Business Pro tier or above. Confirm tier before build.
  • HubSpot deal matching relies on a custom property 'docusign_envelope_id' or a contact email match. The hs_deal_id must be embedded as a DocuSign envelope custom field at contract creation time, or a fallback lookup by signer email must be implemented with a uniqueness check.
  • If the HubSpot deal match returns zero results or more than one result, the agent must halt the sequence and post an error message to a nominated Slack alert channel rather than proceeding with ambiguous data.
  • The 'contract_value' field must map to the HubSpot standard property 'amount'. Confirm whether a separate custom property is also required by the ops team before mapping.
  • Idempotency: the agent must check whether the deal stage is already 'closedwon' before writing. If so, it should log a duplicate event and skip the write to prevent timeline noise.
  • DocuSign webhook retries on non-200 responses. The automation platform endpoint must return 200 immediately and process asynchronously to avoid timeout-induced duplicate triggers.
Workspace Provisioning Agent

Fires immediately after the Handoff Trigger Agent confirms the HubSpot deal is updated to Closed Won. This agent handles all digital workspace creation for the new client: it duplicates the master Google Drive folder template into the designated client accounts directory, names the folder using the pattern '[ClientName] - [CloseYear]', and shares it with the delivery lead's Google account. Simultaneously, it creates a new Notion page from the standard client onboarding template, populates all structured fields with HubSpot deal data, and embeds links to both the Google Drive folder and the signed contract PDF. The signed PDF is retrieved from DocuSign via the Envelopes:documents endpoint and uploaded directly to the new Drive folder. All three outputs (Drive folder URL, Notion page URL, signed PDF Drive link) are stored back on the HubSpot deal record for downstream agents to consume.

Trigger
Handoff Trigger Agent emits confirmed HubSpot deal update event with hs_deal_id and onboarding_status = 'triggered'
Tools
Google Drive, Notion, HubSpot, DocuSign
Replaces steps
Steps 3, 5, and 9
Estimated build
16 hours, Complex complexity
// Input
Internal trigger payload from Handoff Trigger Agent {
  hs_deal_id: string,
  client_name: string,
  signer_email: string,
  contract_value: number,
  closedate: ISO8601,
  docusign_envelope_id: string,
  delivery_lead_email: string    // pulled from HubSpot deal owner mapping
}

// Output
Google Drive {
  drive_folder_id: string,
  drive_folder_url: string,
  signed_pdf_file_id: string,
  signed_pdf_url: string
}
Notion {
  notion_page_id: string,
  notion_page_url: string
}
HubSpot deal update {
  hs_deal_id: string,
  drive_folder_url: string,       // written to custom property
  notion_page_url: string,        // written to custom property
  signed_pdf_url: string,         // written to custom property
  onboarding_status: 'workspace_ready'
}
  • Google Drive: the master template folder ID must be confirmed and hardcoded in the agent config before build. The service account or OAuth user performing the copy must have 'Editor' access on the template folder and write access to the parent client directory.
  • Google Drive folder naming convention must be agreed before build. Proposed default: '[ClientName] - [YYYY]'. If the client name contains characters invalid in Drive names (slashes, colons), the agent must sanitise the string.
  • Notion integration requires a Notion internal integration token with 'Insert content' and 'Read content' capabilities on the parent database. The parent database ID must be confirmed and stored as an environment variable.
  • Notion page creation must map the following HubSpot fields to Notion properties: client_name to 'Client Name' (title), contract_value to 'Contract Value' (number), closedate to 'Start Date' (date), signer_email to 'Primary Contact Email' (email), drive_folder_url to 'Drive Folder' (URL), and signed_pdf_url to 'Signed Contract' (URL).
  • DocuSign PDF retrieval uses the Envelopes:documents GET endpoint. The envelope_id from step one is required. The agent must handle the case where the document is not yet available (DocuSign processing lag) by retrying up to three times with a 30-second interval before posting an alert.
  • HubSpot custom properties 'drive_folder_url', 'notion_page_url', and 'signed_pdf_url' must be created on the Deal object before build begins. Confirm property internal names with the HubSpot admin.
  • If the Drive folder copy or Notion page creation fails, the agent must not proceed to update HubSpot onboarding_status. The error must be logged and an alert posted. The Communications Agent must not fire until onboarding_status = 'workspace_ready'.
Communications Agent

Fires once the Workspace Provisioning Agent confirms both the Drive folder and Notion page are created, signalled by onboarding_status = 'workspace_ready' on the HubSpot deal record. The agent simultaneously dispatches two communications: an internal Slack handoff brief posted to the designated delivery channel, and an external client welcome email sent via Gmail. The Slack message is structured with the client name, contract value, key contact details, links to the Drive folder and Notion workspace, and a prompt for the delivery lead to assign team members. The Gmail welcome email is composed from a stored template, personalised with the client name, account manager name, and outlined next steps, and sent from the account manager's authenticated Gmail address. After both sends are confirmed, the agent writes a completion note to the HubSpot deal timeline, setting onboarding_status to 'handoff_complete'.

Trigger
HubSpot deal onboarding_status updates to 'workspace_ready', confirming Drive and Notion assets are ready
Tools
Slack, Gmail, HubSpot
Replaces steps
Steps 4, 7, and 10
Estimated build
8 hours, Moderate complexity
// Input
HubSpot deal record (polled or event-triggered) {
  hs_deal_id: string,
  client_name: string,
  signer_email: string,
  contract_value: number,
  closedate: ISO8601,
  account_manager_email: string,  // HubSpot deal owner email
  drive_folder_url: string,
  notion_page_url: string,
  signed_pdf_url: string,
  onboarding_status: 'workspace_ready'
}

// Output
Slack message to #delivery channel {
  channel: string,               // confirmed delivery channel name
  blocks: [
    header: 'New Client Handoff: [client_name]',
    fields: { contract_value, closedate, signer_email },
    links: { drive_folder_url, notion_page_url, signed_pdf_url },
    action_prompt: 'Please assign delivery team members'
  ]
}
Gmail message to client {
  from: account_manager_email,
  to: signer_email,
  subject: 'Welcome to [YourCompany.com] - Next Steps',
  body: personalised_template { client_name, account_manager_name, next_steps }
}
HubSpot deal timeline note {
  hs_deal_id: string,
  note: 'Onboarding handoff complete. Slack brief sent. Welcome email sent.',
  onboarding_status: 'handoff_complete'
}
  • Gmail OAuth must be completed individually for each account manager who owns client relationships. The OAuth scope required is 'https://www.googleapis.com/auth/gmail.send'. Shared inboxes or alias addresses require the Gmail delegation API and additional configuration; confirm sending setup per account before build.
  • Slack app must have 'chat:write' and 'chat:write.public' scopes and must be installed to the workspace. The delivery channel name must be confirmed and stored as an environment variable. Do not hardcode channel IDs without confirming they match the live workspace.
  • Gmail welcome email template must be finalised and approved by the account management team before the agent is built. The template must use merge fields: {{client_name}}, {{account_manager_name}}, and {{next_steps_text}}. The next_steps_text value is a static string confirmed by the ops team.
  • If the Gmail send fails (auth error, rate limit, or invalid recipient), the agent must not write onboarding_status = 'handoff_complete'. An alert must be posted to the Slack error channel so a human can send manually.
  • Slack message delivery should be confirmed via the Slack API response. If the channel post fails, the agent must retry once after 60 seconds before alerting.
  • The HubSpot timeline note must use the Engagements API (POST /crm/v3/objects/notes) associated to the deal record, not a deal property update, to preserve the audit trail in the deal timeline view.
Developer Handover PackPage 2 of 4
FS-DOC-04Technical

03End-to-end data flow

End-to-end data flow: DocuSign trigger through HubSpot audit log. Field names reflect confirmed tool API schemas.
// ═══════════════════════════════════════════════════════════════
// NEW CLIENT ONBOARDING HANDOFF: END-TO-END DATA FLOW
// Trigger to completion across three agents and six tools
// ═══════════════════════════════════════════════════════════════

// ── TRIGGER ─────────────────────────────────────────────────────
DocuSign.envelope.status == 'completed'
  → POST to automation_platform.inbound_webhook_url
  → payload {
      envelope_id: string,
      status: 'completed',
      signer_name: string,
      signer_email: string,
      completed_date_utc: ISO8601,
      custom_fields.hs_deal_id: string,
      custom_fields.deal_value: number
    }

// ── AGENT 1: HANDOFF TRIGGER AGENT ──────────────────────────────
// Receives DocuSign webhook, validates envelope, updates HubSpot

Step 1.1: Parse envelope payload
  envelope_id       = payload.envelope_id
  signer_email      = payload.signer_email
  signer_name       = payload.signer_name
  deal_value        = payload.custom_fields.deal_value
  hs_deal_id        = payload.custom_fields.hs_deal_id
  completed_date    = payload.completed_date_utc

Step 1.2: Validate HubSpot deal lookup
  HubSpot.GET /crm/v3/objects/deals/{hs_deal_id}
    → IF deal not found OR dealstage == 'closedwon':
        → log duplicate/error, POST Slack alert, HALT
    → ELSE: proceed

Step 1.3: Update HubSpot deal to Closed Won
  HubSpot.PATCH /crm/v3/objects/deals/{hs_deal_id}
    body {
      dealstage:              'closedwon',
      closedate:              completed_date,
      amount:                 deal_value,
      docusign_envelope_id:   envelope_id,
      onboarding_status:      'triggered'
    }
  → confirmed_deal_id = hs_deal_id

// ── AGENT 1 → AGENT 2 HANDOFF ───────────────────────────────────
// HubSpot onboarding_status = 'triggered' fires Workspace Provisioning Agent

// ── AGENT 2: WORKSPACE PROVISIONING AGENT ───────────────────────
// Creates Drive folder, Notion page, uploads signed PDF

Step 2.1: Pull full deal data from HubSpot
  HubSpot.GET /crm/v3/objects/deals/{confirmed_deal_id}
    → client_name          = deal.properties.dealname
    → signer_email         = deal.properties.signer_email
    → contract_value       = deal.properties.amount
    → closedate            = deal.properties.closedate
    → delivery_lead_email  = deal.properties.hubspot_owner_email
    → envelope_id          = deal.properties.docusign_envelope_id

Step 2.2: Copy Google Drive master template folder
  GoogleDrive.POST /drive/v3/files/{MASTER_TEMPLATE_FOLDER_ID}/copy
    body {
      name: sanitise('[client_name] - [YYYY]'),
      parents: [CLIENT_ACCOUNTS_PARENT_FOLDER_ID]
    }
  → drive_folder_id  = response.id
  → drive_folder_url = 'https://drive.google.com/drive/folders/' + drive_folder_id

Step 2.3: Share Drive folder with delivery lead
  GoogleDrive.POST /drive/v3/files/{drive_folder_id}/permissions
    body { type: 'user', role: 'writer', emailAddress: delivery_lead_email }

Step 2.4: Retrieve signed PDF from DocuSign
  DocuSign.GET /v2.1/accounts/{account_id}/envelopes/{envelope_id}/documents/combined
    → signed_pdf_bytes = response.binary
    → RETRY up to 3 times at 30s intervals on failure

Step 2.5: Upload signed PDF to Drive folder
  GoogleDrive.POST /upload/drive/v3/files
    metadata { name: '[client_name] - Signed Contract.pdf', parents: [drive_folder_id] }
    media: signed_pdf_bytes
  → signed_pdf_file_id = response.id
  → signed_pdf_url = 'https://drive.google.com/file/d/' + signed_pdf_file_id

Step 2.6: Create Notion client page from template
  Notion.POST /v1/pages
    body {
      parent: { database_id: NOTION_CLIENT_DB_ID },
      properties: {
        'Client Name':             { title: client_name },
        'Contract Value':          { number: contract_value },
        'Start Date':              { date: closedate },
        'Primary Contact Email':   { email: signer_email },
        'Drive Folder':            { url: drive_folder_url },
        'Signed Contract':         { url: signed_pdf_url }
      }
    }
  → notion_page_id  = response.id
  → notion_page_url = response.url

Step 2.7: Write asset URLs back to HubSpot deal
  HubSpot.PATCH /crm/v3/objects/deals/{hs_deal_id}
    body {
      drive_folder_url:   drive_folder_url,
      notion_page_url:    notion_page_url,
      signed_pdf_url:     signed_pdf_url,
      onboarding_status:  'workspace_ready'
    }

// ── AGENT 2 → AGENT 3 HANDOFF ───────────────────────────────────
// HubSpot onboarding_status = 'workspace_ready' fires Communications Agent

// ── AGENT 3: COMMUNICATIONS AGENT ───────────────────────────────
// Posts Slack brief and sends Gmail welcome email simultaneously

Step 3.1: Pull enriched deal data from HubSpot
  HubSpot.GET /crm/v3/objects/deals/{hs_deal_id}
    → client_name           = deal.properties.dealname
    → signer_email          = deal.properties.signer_email
    → contract_value        = deal.properties.amount
    → closedate             = deal.properties.closedate
    → account_manager_email = deal.properties.hubspot_owner_email
    → drive_folder_url      = deal.properties.drive_folder_url
    → notion_page_url       = deal.properties.notion_page_url
    → signed_pdf_url        = deal.properties.signed_pdf_url

Step 3.2: POST Slack handoff brief to delivery channel
  Slack.POST /api/chat.postMessage
    body {
      channel: DELIVERY_SLACK_CHANNEL_NAME,
      blocks: [
        header_block:  'New Client Handoff: [client_name]',
        section_block: { contract_value, closedate, signer_email },
        links_block:   { drive_folder_url, notion_page_url, signed_pdf_url },
        action_block:  'Please assign delivery team members'
      ]
    }
  → slack_ts = response.ts    // timestamp confirms delivery

Step 3.3: Send Gmail welcome email to client
  Gmail.POST /gmail/v1/users/{account_manager_email}/messages/send
    body {
      to:      signer_email,
      from:    account_manager_email,
      subject: 'Welcome to [YourCompany.com] - Next Steps',
      body:    render_template(welcome_email_template, {
                 client_name:          client_name,
                 account_manager_name: lookup_name(account_manager_email),
                 next_steps_text:      STATIC_NEXT_STEPS_STRING
               })
    }
  → gmail_message_id = response.id

Step 3.4: Log handoff completion on HubSpot deal timeline
  HubSpot.POST /crm/v3/objects/notes
    body {
      associations: [{ to: { id: hs_deal_id }, types: [{ associationTypeId: 214 }] }],
      properties: {
        hs_note_body: 'Onboarding handoff complete. Slack brief sent (ts: [slack_ts]). Welcome email sent (id: [gmail_message_id]).',
        hs_timestamp: now_utc
      }
    }

Step 3.5: Update HubSpot deal onboarding status
  HubSpot.PATCH /crm/v3/objects/deals/{hs_deal_id}
    body { onboarding_status: 'handoff_complete' }

// ── SEQUENCE COMPLETE ────────────────────────────────────────────
// Total automated elapsed time: < 3 minutes from DocuSign webhook receipt
// Remaining human steps: Step 6 (team assignment), Step 8 (kickoff scheduling)
Developer Handover PackPage 3 of 4
FS-DOC-04Technical

04Recommended build stack

Orchestration layer
A workflow automation platform managing one workflow per agent (Handoff Trigger, Workspace Provisioning, Communications). A shared credential store holds all OAuth tokens and API keys so no credential is duplicated across workflows. Agent-to-agent handoffs are event-driven via HubSpot property updates (onboarding_status field) rather than direct workflow chaining, so each agent can fail and recover independently.
Webhook configuration
DocuSign Connect webhook: POST to the automation platform's static inbound URL on envelope status = 'completed'. The endpoint must respond with HTTP 200 within 5 seconds and queue processing asynchronously. A shared secret header (X-DocuSign-Signature-1) must be validated on receipt to reject spoofed payloads. HubSpot property-change webhooks (onboarding_status transitions) trigger Agents 2 and 3; HubSpot webhook subscriptions must be registered via the HubSpot Private App settings for the Deal object.
Templating approach
Slack messages are built using the Slack Block Kit JSON structure, defined as a static template in the workflow with dynamic field substitution at runtime. Gmail welcome emails are stored as an HTML template string within the workflow credential/environment config, with merge tags ({{client_name}}, {{account_manager_name}}, {{next_steps_text}}) resolved at send time. Notion page structure is defined by the parent database schema; no separate template file is required. Google Drive folder duplication uses the Drive copy API against the fixed master template folder ID stored as an environment variable.
Error logging
All agent errors (webhook parse failures, API write failures, retry exhaustion) are written to a dedicated Supabase table 'onboarding_errors' with columns: id (uuid), agent_name (text), hs_deal_id (text), error_type (text), error_detail (text), created_at (timestamptz). On any insert to this table, an alert is posted to a nominated Slack channel (#automation-alerts) via a Supabase database webhook. The FullSpec team reviews alert volume weekly during the first 30 days post-launch.
Testing approach
All three agents are built and tested in a sandbox environment first. DocuSign sandbox envelopes are used for trigger testing. HubSpot sandbox account (separate from production) is used for deal record writes. Google Drive test folder and Notion test database are provisioned in dedicated test workspaces. Gmail sends during testing use a FullSpec test inbox, not live account manager addresses. No production credentials are used until UAT sign-off. A minimum of five full end-to-end runs with varied client data are completed before go-live.
Estimated total build time
Handoff Trigger Agent: 10 hours. Workspace Provisioning Agent: 16 hours. Communications Agent: 8 hours. End-to-end integration testing and error-handling configuration: 4 hours. Total: 38 hours across a 3 to 4 week delivery window.
Prerequisites that must be confirmed before build begins: (1) HubSpot custom properties 'drive_folder_url', 'notion_page_url', 'signed_pdf_url', 'docusign_envelope_id', and 'onboarding_status' created on the Deal object with agreed internal names. (2) DocuSign Connect configured with the automation platform's webhook URL and the shared secret recorded. (3) Gmail OAuth completed for every account manager who sends welcome emails. (4) Master Google Drive template folder ID and parent client accounts folder ID confirmed. (5) Notion integration token issued and parent client database ID confirmed. (6) Slack app installed with required scopes and delivery channel name confirmed. Build cannot start on any agent until its prerequisites are met.
For build, integration, or configuration questions, contact the FullSpec team at support@gofullspec.com. Reference your process name 'New Client Onboarding Handoff' in the subject line for fastest routing.
Developer Handover PackPage 4 of 4

More documents for this process

Every document generated for New Client Onboarding Handoff.

Launch Plan
Operations · Owner
View
ROI and Business Case
Finance · Owner
View
Process Runbook / SOP
Operations · Owner
View
Integration and API Spec
Technical · Developer
View
Test and QA Plan
Quality · Developer
View