Back to Employee Onboarding

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

Employee Onboarding Automation

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

This document is the primary technical reference for the FullSpec team building the three-agent Employee Onboarding automation. It covers the current-state process map, full agent specifications with IO contracts, the end-to-end data flow, and the recommended build stack. The FullSpec team uses this document to guide every build decision. Your team's responsibility is limited to confirming tool access, approving offer letter templates for new role types, and validating test hire outcomes during the QA phase.

01Process snapshot

Step
Name
Description
1
Log Offer Acceptance
HR manually updates the candidate status in BambooHR and records the start date. Often delayed by a day or more. Time cost: 10 min/hire.
2
Prepare and Send Offer Letter
HR opens a Word template, fills in name, role, salary, and start date, then sends via DocuSign manually. Copy-paste errors in pay rate and title are common. Time cost: 25 min/hire.
3
Send New Hire Information Pack
HR emails the new hire a PDF pack covering company policies, benefits, and a document return checklist. Time cost: 15 min/hire.
4
Chase Outstanding Documents
HR follows up by email every few days until signed contracts, ID, and tax forms are returned. No tracking system exists. Time cost: 30 min/hire.
5
Create Google Workspace Account
IT manually creates the new hire's email account and adds them to relevant Google Groups and shared drives. Time cost: 20 min/hire.
6
Provision Additional Software Access
IT manually adds the new hire to Slack channels and any other software required for the role. Time cost: 20 min/hire.
7
Brief Hiring Manager
HR sends the hiring manager a Slack message with new hire details and requests a day-one schedule. Frequently skipped or late. Time cost: 10 min/hire.
8
Add New Hire to Payroll
HR manually re-enters personal and banking details into the payroll system, duplicating data already in BambooHR. Time cost: 20 min/hire.
9
Create Onboarding Notion Page
HR duplicates an onboarding template in Notion, customises it for the role, and shares the link with the hire and manager. Time cost: 20 min/hire.
10
Schedule Orientation Sessions
HR manually books orientation calls and team introductions by checking calendars and sending individual invites. Time cost: 25 min/hire.
11
Send Day-One Welcome Message
HR or the hiring manager sends a welcome email and a final checklist of what to bring and expect on day one. Time cost: 10 min/hire.
12
Confirm Completion and File Records
HR checks all documents are signed, marks the onboarding record complete in BambooHR, and files paperwork. Often done days after day one. Time cost: 15 min/hire.
Time cost summary: Total manual time per hire cycle is 220 minutes (approximately 3 hours 40 minutes of active work per hire, spread over 2 to 3 weeks). At 3 hires/month this equals approximately 660 minutes (11 hours) of manual HR and IT time per month, or roughly 5.5 hours/week annualised. Steps replaced by automation: 2, 3, 4, 5, 6, 7, 9, 11, 12. Steps retained as manual: 1 (BambooHR status update, which also serves as the automation trigger), 8 (payroll data entry, out of scope unless a separate integration is scoped), and 10 (orientation scheduling, retained by design).
Developer Handover PackPage 1 of 4
FS-DOC-04Technical

02Agent specifications

Document Agent

Handles all document generation and collection tasks for each hire. The agent fires immediately when BambooHR emits an 'Offer Accepted' webhook, maps the hire's role to a pre-configured DocuSign template, populates the template fields from the BambooHR record, and sends the envelope for e-signature. It then dispatches the new hire information pack via Gmail. After sending, the agent enters a polling loop: it checks DocuSign envelope status on a configurable interval (default 48 hours) and sends reminder emails via Gmail until all documents are signed and returned. On completion it writes a status flag back to BambooHR and emits a completion event consumed by downstream agents. This agent is rated Complex due to the template-matching decision gate, the reminder loop with configurable wait windows, and the DocuSign API polling requirement.

Trigger
BambooHR webhook: employee status changes to 'Offer Accepted'
Tools
BambooHR, DocuSign, Gmail
Replaces steps
2 (Prepare and Send Offer Letter), 3 (Send New Hire Information Pack), 4 (Chase Outstanding Documents), 12 (Confirm Completion and File Records)
Estimated build
14 hours / Complex
// Input (from BambooHR webhook payload)
employee.id           : string   // BambooHR employee record ID
employee.firstName    : string
employee.lastName     : string
employee.jobTitle     : string   // used for DocuSign template lookup
employee.employmentType: string  // 'full-time' | 'part-time' | 'contractor'
employee.salary       : number
employee.startDate    : date     // ISO 8601
employee.managerId    : string   // BambooHR manager record ID
employee.department   : string
employee.personalEmail: string   // pre-company email for DocuSign

// Decision gate
// IF jobTitle + employmentType maps to a known DocuSign templateId -> proceed automatically
// ELSE -> pause, alert HR via Slack/Gmail, await manual template creation, then resume

// Output (on successful document completion)
docusign.envelopeId   : string
docusign.status       : 'completed'
docusign.completedAt  : datetime
bamboohr.field[onboarding_docs_status]: 'complete'
event.emitted         : 'documents_complete' // consumed by Provisioning Agent
  • DocuSign tier must be Business Pro or above to support template population via API (templateId field mapping). Confirm the account tier before build begins.
  • Each distinct employment type (full-time, part-time, contractor) requires a separate DocuSign template with named fields: {{employee_first_name}}, {{employee_last_name}}, {{job_title}}, {{start_date}}, {{salary}}, {{manager_name}}. HR must supply and validate these templates before the Document Agent can go live.
  • The template-matching lookup table must be maintained as a configuration object (job_title + employment_type -> docusign_template_id). Seed with all current active roles at build time. New role types trigger the manual exception path until HR approves and adds the mapping.
  • The document-chase reminder loop must be configurable: default interval 48 hours, maximum 3 reminders, then escalate to HR via Slack. Hard-code these defaults but expose them as environment variables for the owner to adjust without a rebuild.
  • DocuSign webhook (Connect) should be configured to push envelope status events back to the automation platform endpoint, avoiding constant polling. Fallback to polling every 4 hours if Connect is not available on the current DocuSign tier.
  • The BambooHR status write-back (onboarding_docs_status) uses the BambooHR API PATCH /v1/employees/{id} endpoint. Confirm the API key has write permissions on custom fields before build.
  • Gmail sender must be a shared HR inbox (e.g. hr@[YourCompany.com]), not a personal account, to ensure continuity if the HR Manager changes. Confirm OAuth credentials are issued for this shared inbox.
Provisioning Agent

Creates and configures all system accounts the new hire needs before day one. The agent fires on two conditions: five business days before the hire's start date, or immediately if the start date is fewer than five business days away (calculated at the moment the 'documents_complete' event is received). It provisions a Google Workspace account via the Admin SDK, assigns the correct organisational unit based on the department field, and adds the hire to the relevant Google Groups. It then invites the hire to Slack via the Slack API and adds them to the standard company channels plus the role-specific channels defined in the job record. On completion it writes a provisioning confirmation log entry to BambooHR and emits an event for the Onboarding Coordinator Agent. This agent is rated Moderate due to the timing logic and the two-tool provisioning sequence, but the Google Workspace Admin SDK setup adds initial configuration complexity.

Trigger
Event: 'documents_complete' emitted by Document Agent, then timer fires 5 business days before employee.startDate (or immediately if startDate is within 5 business days)
Tools
Google Workspace (Admin SDK), Slack, BambooHR
Replaces steps
5 (Create Google Workspace Account), 6 (Provision Additional Software Access), 8 (Add New Hire to Payroll — provisioning log entry only; payroll data entry remains manual)
Estimated build
12 hours / Moderate
// Input (from Document Agent completion event + BambooHR record)
employee.id           : string
employee.firstName    : string
employee.lastName     : string
employee.jobTitle     : string
employee.department   : string   // maps to Google OU and Slack channel list
employee.startDate    : date
employee.personalEmail: string   // used as recovery email in Google Workspace
employee.managerId    : string

// Derived at runtime
google.primaryEmail   : string   // constructed: firstname.lastname@[YourCompany.com]
google.orgUnitPath    : string   // e.g. '/Engineering' or '/Sales', from department map
google.groupMemberships: string[]// from department-to-group config map
slack.channelIds      : string[] // from role-to-channel config map

// Output
google.workspace.userId    : string   // Google account ID
google.workspace.email     : string   // provisioned company email
slack.userId               : string
slack.inviteStatus         : 'ok' | 'error'
bamboohr.field[it_provisioning_status]: 'complete'
bamboohr.field[company_email]         : string   // written back for downstream use
event.emitted              : 'provisioning_complete' // consumed by Onboarding Coordinator
  • Google Workspace provisioning requires a service account with domain-wide delegation enabled. IT must create this service account in Google Cloud Console and grant the following OAuth scopes: https://www.googleapis.com/auth/admin.directory.user, https://www.googleapis.com/auth/admin.directory.group.member. Confirm this is in place before Week 3 build begins.
  • The department-to-Google-OU mapping and the role-to-Slack-channel mapping must be documented and provided by IT Admin (Daniel Tran) before build. Store both as config objects, not hard-coded values.
  • Email address collision handling: if firstname.lastname@[YourCompany.com] already exists, append a numeral (e.g. firstname.lastname2@). Log the collision and alert HR via Slack.
  • Slack invitation via API uses the admin.users.invite method, which requires a Slack admin token with the users:write and channels:manage scopes. Confirm the Slack plan supports admin API access (Business+ or Enterprise Grid).
  • The 5-business-day timer must exclude weekends and public holidays. Use a configurable holiday calendar or a standard business-day calculation function in the orchestration layer. Default to UTC unless the owner specifies a timezone.
  • If the start date is fewer than 5 business days away at the time the event is received, the agent fires immediately without waiting. Log this as an 'expedited provisioning' flag in BambooHR.
  • Google Workspace password and recovery options: set a temporary password following the company's naming convention (e.g. Welcome + last 4 digits of employee ID) and force a password reset on first login. Confirm the convention with IT before build.
Onboarding Coordinator Agent

Builds the new hire's onboarding workspace and keeps the hiring manager and the hire informed. The agent fires once the Provisioning Agent logs a successful account creation, ensuring the hire's company email and Slack user ID exist before any communications reference them. It duplicates the correct role-based onboarding template in Notion and personalises the page header with the hire's name, role, start date, and manager. It then sends the hiring manager a structured Slack message containing the hire's details and a checklist of pre-day-one manager tasks. Finally, it dispatches a personalised day-one welcome email to the hire's new company Gmail address three days before the start date, summarising their schedule, login instructions, and any outstanding document items. This agent is rated Moderate due to the Notion API duplication logic and the date-triggered email dispatch.

Trigger
Event: 'provisioning_complete' emitted by Provisioning Agent
Tools
Notion, Slack, Gmail
Replaces steps
7 (Brief Hiring Manager), 9 (Create Onboarding Notion Page), 11 (Send Day-One Welcome Message)
Estimated build
10 hours / Moderate
// Input (from Provisioning Agent completion event + BambooHR record)
employee.id            : string
employee.firstName     : string
employee.lastName      : string
employee.jobTitle      : string
employee.department    : string
employee.startDate     : date
employee.companyEmail  : string   // provisioned in previous agent step
employee.managerId     : string
slack.managerId        : string   // Slack user ID of hiring manager
notion.templatePageId  : string   // from role-to-template config map

// Output
notion.onboardingPageId  : string   // newly duplicated and personalised page ID
notion.pageUrl           : string   // shared with hire and manager
slack.managerMessageId   : string   // Slack message ts confirming briefing sent
gmail.welcomeEmailId     : string   // Gmail message ID of day-one email
gmail.scheduledSendTime  : datetime // 3 days before startDate, 09:00 hire timezone

// On approval (offer letter template exception path, Document Agent gate)
// HR approves template mapping via Slack interactive message or manual config update
// Coordinator Agent does not have an approval gate itself; approval lives in Document Agent
  • Notion integration requires a Notion internal integration token with access to the HR workspace. The onboarding template database must be shared with the integration in Notion settings before build.
  • Each department or role type must map to a specific Notion template page ID. Build a config map (job_title or department -> notion_template_page_id) and seed it from the existing Notion workspace structure. Confirm with HR which templates are current and approved.
  • Notion page duplication uses the pages.create API endpoint with parent.page_id set to the HR onboarding database. Personalisation is achieved by updating the page title property and the Name, Role, Start Date, and Manager properties on the new page.
  • The day-one welcome email must be scheduled, not sent immediately, so it arrives 3 days before the start date at approximately 09:00 in the hire's local timezone. Use Gmail's scheduled send feature via the API (message with sendAt timestamp). If timezone is not captured in BambooHR, default to the company's primary timezone and log this assumption.
  • The Slack manager briefing message must include: hire name, role, start date, company email, Notion onboarding page link, and a numbered checklist of 3 to 5 manager pre-day-one tasks. Store the checklist as a configurable template, not a hard-coded string.
  • Confirm the Slack API token has chat:write and users:read scopes. The manager lookup from managerId to Slack user ID should use the Slack users.lookupByEmail method against the manager's company email from BambooHR.
  • If the Notion page creation fails, the agent must retry once after 5 minutes, then alert HR via Slack and log the failure to the error log table. The agent should not block the Slack manager message or the welcome email if Notion fails independently.
Developer Handover PackPage 2 of 4
FS-DOC-04Technical

03End-to-end data flow

Full trigger-to-output data flow with field names at each agent handoff
// ─────────────────────────────────────────────────────────────────────
// TRIGGER
// ─────────────────────────────────────────────────────────────────────
BambooHR webhook (POST /webhook/offer-accepted)
  -> payload.employee.id
  -> payload.employee.firstName
  -> payload.employee.lastName
  -> payload.employee.jobTitle
  -> payload.employee.employmentType
  -> payload.employee.salary
  -> payload.employee.startDate
  -> payload.employee.managerId
  -> payload.employee.department
  -> payload.employee.personalEmail

// ─────────────────────────────────────────────────────────────────────
// DOCUMENT AGENT
// ─────────────────────────────────────────────────────────────────────
Step 1: Template lookup
  input : employee.jobTitle + employee.employmentType
  output: docusign.templateId (from config map)
  branch: templateId found     -> proceed to Step 2
          templateId NOT found -> alert HR (Slack + Gmail), await manual mapping, resume

Step 2: DocuSign envelope creation
  POST /v2.1/accounts/{accountId}/envelopes
  body.templateId          = docusign.templateId
  body.templateRoles[0].tabs.textTabs:
    employee_first_name    = employee.firstName
    employee_last_name     = employee.lastName
    job_title              = employee.jobTitle
    start_date             = employee.startDate
    salary                 = employee.salary
    manager_name           = <resolved from employee.managerId via BambooHR GET /v1/employees/{managerId}>
  body.templateRoles[0].email = employee.personalEmail
  output: docusign.envelopeId

Step 3: Gmail information pack
  POST Gmail API /users/me/messages/send
  from    : hr@[YourCompany.com]
  to      : employee.personalEmail
  subject : 'Welcome to [YourCompany.com] — your pre-start checklist'
  body    : templated HTML (company policies PDF attached, document upload link)
  output  : gmail.infoPackMessageId

Step 4: DocuSign status polling loop
  GET /v2.1/accounts/{accountId}/envelopes/{envelopeId}
  check   : envelope.status == 'completed'
  if NOT completed after 48h: send reminder via Gmail (max 3 reminders)
  if max reminders exceeded : escalate to HR via Slack
  output  : docusign.status = 'completed', docusign.completedAt

Step 5: BambooHR write-back
  PATCH /v1/employees/{employee.id}
  field: onboarding_docs_status = 'complete'
  output: confirmed write-back

// HANDOFF: Document Agent -> Provisioning Agent
// event.emitted = 'documents_complete'
// payload carries: employee.id, employee.startDate, employee.department,
//                  employee.jobTitle, employee.personalEmail, employee.managerId

// ─────────────────────────────────────────────────────────────────────
// PROVISIONING AGENT
// ─────────────────────────────────────────────────────────────────────
Step 6: Start-date proximity check
  input : employee.startDate, current date
  calc  : business_days_until_start
  if >= 5 business days : schedule agent execution for (startDate - 5 business days)
  if <  5 business days : execute immediately, set flag expedited_provisioning = true

Step 7: Google Workspace account creation
  POST Admin SDK Directory API /admin/directory/v1/users
  body.primaryEmail     = firstName.toLowerCase() + '.' + lastName.toLowerCase() + '@[YourCompany.com]'
  body.name.givenName   = employee.firstName
  body.name.familyName  = employee.lastName
  body.orgUnitPath      = department_to_ou_map[employee.department]
  body.password         = temporary password (env var pattern)
  body.changePasswordAtNextLogin = true
  body.recoveryEmail    = employee.personalEmail
  output: google.workspace.userId, google.workspace.email
  on collision (409): append numeral suffix, retry, log collision alert

Step 8: Google Group membership
  POST /admin/directory/v1/groups/{groupKey}/members
  for each groupKey in department_to_groups_map[employee.department]:
    body.email = google.workspace.email
    body.role  = 'MEMBER'

Step 9: Slack invitation
  POST Slack API admin.users.invite
  body.email      = employee.personalEmail
  body.channel_ids = role_to_slack_channels_map[employee.jobTitle]
  output: slack.userId

Step 10: BambooHR provisioning write-back
  PATCH /v1/employees/{employee.id}
  field: it_provisioning_status = 'complete'
  field: company_email          = google.workspace.email

// HANDOFF: Provisioning Agent -> Onboarding Coordinator Agent
// event.emitted = 'provisioning_complete'
// payload carries: employee.id, employee.firstName, employee.lastName,
//                  employee.jobTitle, employee.department, employee.startDate,
//                  employee.companyEmail (= google.workspace.email),
//                  employee.managerId, slack.managerId (resolved from managerId)

// ─────────────────────────────────────────────────────────────────────
// ONBOARDING COORDINATOR AGENT
// ─────────────────────────────────────────────────────────────────────
Step 11: Notion page creation
  POST Notion API /v1/pages
  body.parent.page_id       = role_to_notion_template_map[employee.jobTitle]
  body.properties.title     = employee.firstName + ' ' + employee.lastName + ' — Onboarding'
  body.properties.Name      = employee.firstName + ' ' + employee.lastName
  body.properties.Role      = employee.jobTitle
  body.properties.StartDate = employee.startDate
  body.properties.Manager   = <manager name resolved from employee.managerId>
  output: notion.onboardingPageId, notion.pageUrl
  on failure: retry once after 300s, then Slack alert to HR, continue remaining steps

Step 12: Slack manager briefing
  POST Slack API chat.postMessage
  channel : slack.managerId (resolved via users.lookupByEmail on manager company email)
  text    : structured message template (hire name, role, startDate, companyEmail,
            notion.pageUrl, manager pre-day-one checklist)
  output  : slack.managerMessageId

Step 13: Scheduled day-one welcome email
  POST Gmail API /users/me/messages/send (with scheduledSendTime)
  from             : hr@[YourCompany.com]
  to               : employee.companyEmail
  scheduledSendTime: (employee.startDate - 3 calendar days) at 09:00 company timezone
  subject          : 'See you on [startDate] — everything you need for day one'
  body             : templated HTML (schedule summary, login instructions,
                     notion.pageUrl, any outstanding document items from docusign.status)
  output           : gmail.welcomeEmailId, gmail.scheduledSendTime

// ─────────────────────────────────────────────────────────────────────
// TERMINAL STATE
// ─────────────────────────────────────────────────────────────────────
All outputs confirmed:
  bamboohr.onboarding_docs_status    = 'complete'
  bamboohr.it_provisioning_status    = 'complete'
  bamboohr.company_email             = google.workspace.email
  notion.onboardingPageId            = <page ID>
  slack.managerMessageId             = <ts>
  gmail.welcomeEmailId               = <message ID>
  error_log_table                    = 0 unresolved errors (or HR alerted for each)
Developer Handover PackPage 3 of 4
FS-DOC-04Technical

04Recommended build stack

Orchestration layer
A workflow automation tool hosting one workflow per agent (Document Agent, Provisioning Agent, Onboarding Coordinator Agent) plus one shared trigger workflow that receives the BambooHR webhook and routes the initial payload. All three agent workflows share a single credential store so that API keys and tokens are managed in one place and rotated without editing individual workflows. Inter-agent handoffs use internal events or a lightweight message queue within the platform.
Webhook configuration
BambooHR webhook configured to POST to the automation platform's inbound webhook URL on the employee status field change event (status = 'Offer Accepted'). The endpoint must be publicly accessible with HTTPS. Validate incoming payloads using a shared secret header (X-BambooHR-Signature) and reject any request that fails HMAC verification. DocuSign Connect (envelope status push) configured to POST completed/declined events to a second inbound endpoint in the Document Agent workflow, avoiding polling where the DocuSign tier supports it.
Templating approach
All outbound email bodies (information pack, reminder emails, day-one welcome) stored as HTML templates with {{mustache}}-style variable substitution. DocuSign field names use the DocuSign tab label convention (e.g. employee_first_name). Notion page properties use the Notion property name as defined in the template database. Slack message text uses Slack Block Kit JSON for structured formatting. All templates stored as environment-level variables or a configuration file, not embedded in workflow nodes, so the HR team can update copy without a code change.
Error logging
All agent errors (API failures, missing config map entries, DocuSign escalations, Notion failures) written to a Supabase table: error_log (id, timestamp, agent_name, employee_id, error_code, error_message, resolved boolean). On any unresolved error, the orchestration layer sends an immediate Slack alert to the HR Manager's direct Slack channel and cc's support@gofullspec.com. Resolved errors are marked in the table; unresolved errors are surfaced in a weekly digest if they remain open after 24 hours.
Testing approach
All three agents built and tested in a sandbox environment first: BambooHR sandbox account, DocuSign developer sandbox, Google Workspace test domain (a separate organisational unit designated 'Automation Test'), and Slack test workspace. Each agent tested in isolation before end-to-end runs. Two full test hires run against the complete flow (one standard hire, one expedited same-week start date) before go-live. Test hire records are marked with a test flag in BambooHR and cleaned up after QA is signed off.
Estimated total build time
Document Agent: 14 hours. Provisioning Agent: 12 hours. Onboarding Coordinator Agent: 10 hours. End-to-end integration testing and error logging setup: 6 hours (included in the 38-hour build effort total). Discovery, credential setup, and handover documentation: counted in the Week 1 discovery stage. Total: 38 hours across a 4 to 5 week delivery window.
Pre-build blockers: the following must be confirmed before the relevant agent build begins. (1) DocuSign account tier confirmed as Business Pro or above, and existing offer letter templates structured with named fillable fields (required before Week 2). (2) Google Workspace service account created with domain-wide delegation and the Admin SDK scopes granted by IT Admin (required before Week 3). (3) Slack admin token with admin.users.invite, users:write, and channels:manage scopes issued (required before Week 3). (4) Notion internal integration token created and shared with the HR onboarding database (required before Week 4). (5) BambooHR API key confirmed with read and write permissions on custom fields (required before Week 2). Contact support@gofullspec.com immediately if any of these cannot be confirmed within the expected timeframe.
Developer Handover PackPage 4 of 4

More documents for this process

Every document generated for Employee Onboarding.

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