By Sagar Shankaran, Founder of CallSphere
Build an AI onboarding agent that automates new hire document collection, generates personalized training schedules, manages task checklists, and facilitates buddy assignments for a seamless first-week experience.
Key takeaways
New hire onboarding involves dozens of tasks spread across HR, IT, facilities, and the hiring manager — and dropping any single item creates a poor first impression. Studies consistently show that structured onboarding improves retention by up to 82%, yet most organizations rely on scattered spreadsheets and email chains. An AI onboarding agent centralizes this process into a single conversational interface that tracks every task, reminds stakeholders, and adapts the schedule as things change.
The agent needs to track each new hire's onboarding progress across multiple categories: documents, equipment, training, and social connections.
flowchart LR
SIGNUP(["New signup"])
AGENT["AI onboarding agent"]
GOAL["Detect goal and<br/>persona"]
PATH{"Personalized path"}
ACT1["Activation step 1<br/>configure profile"]
ACT2["Activation step 2<br/>connect data"]
ACT3["Activation step 3<br/>first value moment"]
NUDGE["In-app and email<br/>nudges"]
CSM(["CSM handoff if<br/>account flagged"])
DONE(["Activated"])
SIGNUP --> AGENT --> GOAL --> PATH
PATH --> ACT1 --> ACT2 --> ACT3 --> DONE
AGENT --> NUDGE
AGENT --> CSM
style AGENT fill:#4f46e5,stroke:#4338ca,color:#fff
style DONE fill:#059669,stroke:#047857,color:#fff
style CSM fill:#f59e0b,stroke:#d97706,color:#1f2937
from dataclasses import dataclass, field
from datetime import date, timedelta
from enum import Enum
from typing import Optional
import json
class TaskStatus(Enum):
PENDING = "pending"
IN_PROGRESS = "in_progress"
COMPLETED = "completed"
BLOCKED = "blocked"
@dataclass
class OnboardingTask:
task_id: str
category: str # "documents", "equipment", "training", "social"
title: str
description: str
due_date: date
status: TaskStatus = TaskStatus.PENDING
assigned_to: str = ""
completed_date: Optional[date] = None
@dataclass
class NewHireOnboarding:
employee_id: str
name: str
role: str
department: str
start_date: date
manager: str
buddy: Optional[str] = None
tasks: list[OnboardingTask] = field(default_factory=list)
def completion_percentage(self) -> float:
if not self.tasks:
return 0.0
completed = sum(1 for t in self.tasks if t.status == TaskStatus.COMPLETED)
return round(completed / len(self.tasks) * 100, 1)
The document tool tracks required paperwork and generates reminders for outstanding items. Different roles and locations require different document sets.
Hear it before you finish reading
Talk to a live CallSphere AI voice agent in your browser — 60 seconds, no signup.
from agents import function_tool
REQUIRED_DOCUMENTS = {
"default": [
"W-4 Tax Withholding",
"I-9 Employment Eligibility",
"Direct Deposit Authorization",
"Emergency Contact Form",
"Employee Handbook Acknowledgment",
],
"engineering": [
"NDA / IP Assignment Agreement",
"Code of Conduct for Repository Access",
],
"healthcare": [
"HIPAA Acknowledgment",
"Background Check Consent",
"Professional License Verification",
],
}
ONBOARDING_DB: dict[str, NewHireOnboarding] = {}
@function_tool
def check_document_status(employee_id: str) -> str:
"""Check which onboarding documents are complete and which are pending."""
onboarding = ONBOARDING_DB.get(employee_id)
if not onboarding:
return json.dumps({"error": "Employee not found"})
doc_tasks = [t for t in onboarding.tasks if t.category == "documents"]
result = {
"employee": onboarding.name,
"total_documents": len(doc_tasks),
"completed": [t.title for t in doc_tasks if t.status == TaskStatus.COMPLETED],
"pending": [t.title for t in doc_tasks if t.status == TaskStatus.PENDING],
"overdue": [
t.title for t in doc_tasks
if t.status == TaskStatus.PENDING and t.due_date < date.today()
],
}
return json.dumps(result)
@function_tool
def mark_document_submitted(employee_id: str, document_name: str) -> str:
"""Mark a specific document as submitted by the new hire."""
onboarding = ONBOARDING_DB.get(employee_id)
if not onboarding:
return json.dumps({"error": "Employee not found"})
for task in onboarding.tasks:
if task.category == "documents" and task.title == document_name:
task.status = TaskStatus.COMPLETED
task.completed_date = date.today()
return json.dumps({"status": "success", "document": document_name})
return json.dumps({"error": f"Document '{document_name}' not found in checklist"})
The training schedule adapts based on the hire's role, department, and experience level. It slots mandatory sessions first, then fills available time with role-specific training.
@function_tool
def generate_training_schedule(
employee_id: str,
experience_level: str,
) -> str:
"""Generate a personalized first-week training schedule."""
onboarding = ONBOARDING_DB.get(employee_id)
if not onboarding:
return json.dumps({"error": "Employee not found"})
start = onboarding.start_date
schedule = []
# Day 1: Universal orientation
schedule.append({
"day": 1, "date": str(start),
"sessions": [
{"time": "9:00", "title": "Welcome & Office Tour", "duration": "1h"},
{"time": "10:00", "title": "HR Benefits Overview", "duration": "1h"},
{"time": "11:00", "title": "IT Setup & Security Training", "duration": "1.5h"},
{"time": "13:00", "title": "Meet Your Manager", "duration": "1h"},
{"time": "14:00", "title": "Team Introduction & Buddy Meet", "duration": "1h"},
],
})
# Days 2-5: Role-specific training
dept_sessions = {
"engineering": [
"Dev Environment Setup", "Codebase Walkthrough",
"CI/CD Pipeline Overview", "Architecture Deep-Dive",
"First Ticket Pairing Session", "Code Review Practices",
],
"sales": [
"CRM Training", "Product Demo Certification",
"Sales Playbook Review", "Pipeline Management",
"Objection Handling Workshop", "Shadow a Sales Call",
],
}
role_sessions = dept_sessions.get(
onboarding.department.lower(),
["Department Overview", "Process Training", "Tools Training",
"Stakeholder Introductions", "First Assignment", "Week Recap"],
)
for day_offset in range(1, 5):
day_date = start + timedelta(days=day_offset)
day_sessions_list = role_sessions[
(day_offset - 1) * 2 : day_offset * 2
]
schedule.append({
"day": day_offset + 1,
"date": str(day_date),
"sessions": [
{"time": "9:30", "title": s, "duration": "2h"}
for s in day_sessions_list
],
})
return json.dumps({"employee": onboarding.name, "schedule": schedule})
AVAILABLE_BUDDIES: dict[str, list[dict]] = {
"engineering": [
{"name": "Sarah Chen", "role": "Senior Engineer", "capacity": True},
{"name": "Marcus Webb", "role": "Staff Engineer", "capacity": False},
],
"sales": [
{"name": "Jordan Ali", "role": "Account Executive", "capacity": True},
],
}
@function_tool
def assign_buddy(employee_id: str) -> str:
"""Assign an onboarding buddy from the same department."""
onboarding = ONBOARDING_DB.get(employee_id)
if not onboarding:
return json.dumps({"error": "Employee not found"})
dept = onboarding.department.lower()
candidates = AVAILABLE_BUDDIES.get(dept, [])
available = [b for b in candidates if b["capacity"]]
if not available:
return json.dumps({"status": "no_buddy_available",
"message": "All buddies at capacity. HR notified."})
buddy = available[0]
onboarding.buddy = buddy["name"]
buddy["capacity"] = False
return json.dumps({"status": "assigned", "buddy": buddy["name"],
"buddy_role": buddy["role"]})
from agents import Agent, Runner
onboarding_agent = Agent(
name="OnboardBot",
instructions="""You are OnboardBot, an employee onboarding assistant.
Help new hires with: document submissions, training schedules,
buddy introductions, and first-week logistics. Be welcoming and clear.
Proactively check for overdue items and suggest next steps.""",
tools=[
check_document_status, mark_document_submitted,
generate_training_schedule, assign_buddy,
],
)
Add a location flag to the onboarding record and adjust both the document requirements (remote employees may need shipping addresses for equipment) and training sessions (replace office tours with virtual workspace walkthroughs). The agent checks this flag when generating schedules and document checklists.
Still reading? Stop comparing — try CallSphere live.
CallSphere ships complete AI voice agents per industry — 14 tools for healthcare, 10 agents for real estate, 4 specialists for salons. See how it actually handles a call before you book a demo.
The agent stores the schedule in a mutable data structure. When notified of a conflict, the reschedule tool shifts the affected session to the next available slot, updates the employee's calendar integration, and notifies both the trainer and the new hire.
Track the completion percentage over time, time-to-productivity metrics (first meaningful contribution), and a satisfaction survey at the end of week one. The agent can surface these metrics to HR through a reporting tool that aggregates data across all active onboardings.
#EmployeeOnboarding #HRAutomation #Training #AgenticAI #WorkforceManagement #LearnAI #AIEngineering

Written by
Sagar Shankaran· Founder, CallSphere
LinkedInSagar Shankaran is the founder of CallSphere, where he builds production AI voice and chat agents deployed across healthcare, hospitality, real estate, and home services. He writes about agentic AI, LLM engineering, and shipping voice agents that handle real calls in production.
See how AI voice agents work for your industry. Live demo available -- no signup required.
The 2026 desktop AI agent landscape — ServiceNow Project Arc, Anthropic Claude offerings, OpenAI agents, and Google Mariner. A buyer's map.
An agentic-AI perspective on Anthropic Skills system, covering orchestration patterns, tool use, and how agent tooling fits production agent stacks.
Enterprise CIO Guide perspective on Comet's general-availability launch put an agentic browser in front of millions of consumers, and it works better than the demos suggested.
Enterprise CIO Guide perspective on Harvey AI's enterprise rollout numbers show legal agents have moved past the pilot stage at AmLaw 100 firms.
Enterprise CIO Guide perspective on Hippocratic AI's deployment numbers show healthcare voice agents are moving from pilot to production across major US health systems.
An agentic-AI perspective on Claude Agent SDK loops, covering orchestration patterns, tool use, and how agent orchestration fits production agent stacks.
© 2026 CallSphere Inc. All rights reserved.
Made within San Francisco