Build an employee onboarding system to replace BambooHR
· Avery NXR
A 50-person company pays BambooHR or Rippling somewhere between $300 and $700 per month for what is mostly a glorified employee database with a few workflows attached.
The HR team uses it daily. The employees touch it twice: on their first day and on their last. The cost compounds quietly. By year three, the company has paid more for an HR information system than it would have cost to hire a junior engineer for a quarter to build a custom replacement.
The math used to favor the SaaS. Building HR software from scratch was a year of engineering work nobody wanted to do. Now, with Avery, it is one focused week. The math has flipped for companies under 200 employees who don't need full HRIS complexity.
This post walks through what a real custom onboarding system looks like, what it can and cannot replace, and the actual CR-by-CR build.
What employee onboarding actually requires
A working employee onboarding system needs five things:
An employee record. Personal details, role, department, manager, start date, status (pre-boarding, active, on leave, departed).
A document checklist. Tax forms, NDAs, employee handbook acknowledgments. Tracked per employee, with status (sent, signed, acknowledged).
Task assignment. IT provisioning, desk setup, welcome calendar invites, manager-led intro meetings. Each task has an owner, a due date, and a status.
Email and calendar triggers. The day before start: welcome email. Day one: calendar invite for orientation. Day three: manager check-in reminder. Day seven: feedback survey.
Role-based access. HR sees everything. Managers see their direct reports. Employees see their own record.
That's the entire surface area of onboarding. Everything else is bells.
What this doesn't do: payroll, benefits administration, 50-state tax compliance, formal performance reviews. Those are separate problems with separate tools. Don't try to build them.
When to keep using BambooHR
Before talking about the build, name when you shouldn't.
If you have more than 200 employees, the data model gets harder. Compliance scales nonlinearly. The cost of a proper HRIS becomes justified.
If you operate in multiple countries with different employment laws, off-the-shelf HRIS handles localization that custom can't easily match.
If you need integrated payroll, get Rippling or Gusto. Don't build that.
If your CEO wants a "single source of truth" with vendor support, custom doesn't satisfy that requirement no matter how well it works.
For everything else: companies 5 to 200 people, single country, who need onboarding and access provisioning more than payroll integration, custom wins.
The Avery build
CR 1: Employee data model.
"Build an Employee model with id, first_name, last_name, email (unique), personal_email, phone, role, department, manager_id (self-FK), start_date, end_date (nullable), status (enum: pre_boarding, active, on_leave, departed), employee_type (enum: full_time, contractor, intern), location, created_at. Add migrations and types."
CR 2: Document checklist.
"Build a DocumentTemplate model: id, name, description, file_template_url, required (boolean), order. Build an EmployeeDocument model: id, employee_id (FK), template_id (FK), status (enum: pending, sent, signed, rejected), sent_at, signed_at, file_url. Build endpoints to assign templates to an employee on hire and update status."
CR 3: Task assignment.
"Build a TaskTemplate model: id, name, description, default_owner_role (enum: hr, manager, it, employee), days_relative_to_start, required (boolean). Build an EmployeeTask model: id, employee_id (FK), template_id (FK), owner_id (FK to User), status (enum: pending, in_progress, completed, blocked), due_date, completed_at. On employee creation, generate tasks from active templates."
CR 4: Onboarding workflow trigger engine.
"Build a workflow scheduler that runs daily. For each active Employee where start_date matches today, send welcome email. For start_date in 1 day, send pre-arrival email. For start_date 3 days ago, send manager check-in reminder. For start_date 7 days ago, send feedback survey link. Log every email sent to an EmailLog table to avoid duplicates."
CR 5: Document upload and e-signature.
"Allow employees to upload signed documents to their EmployeeDocument records. For documents requiring legal signatures, integrate with DocuSign (or HelloSign) API to send for signature and webhook back to update status. Store signed PDFs in S3."
CR 6: Role-based access.
"Add a UserRole model: user_id, role (enum: admin, hr, manager, employee). Update all routes to enforce: admin and hr see all employees. Manager sees employees where manager_id = self. Employee sees only own record. Block unauthorized access at the API and UI layers."
CR 7: Manager dashboard.
"Build /manager/dashboard showing manager's direct reports with onboarding progress (percent of tasks completed, percent of documents signed). Highlight overdue tasks. Link to each employee's detail page where manager can view (not edit) tasks and documents."
CR 8: HR admin panel.
"Build /admin/employees showing all employees with filters by status, department, start_date range. Allow creating new employees with start_date, role, manager, and the system auto-generates tasks and documents based on templates. Allow editing all fields. Show onboarding progress percent."
CR 9: Email and notification settings.
"Build a settings panel where HR admins can edit the welcome email template, pre-arrival template, manager check-in template, and feedback survey link. Use placeholders for first_name, role, start_date. Preview before saving."
CR 10: Integration with Google Workspace or Okta.
"On employee creation with employee_type = full_time, call the Google Workspace Admin API to create a user account with the company email. Set initial password. Add user to the company's main org unit. On status change to departed, suspend the account."
That is the entire build. Ten CRs, five focused days for the core flow.
Things that surprise people
The document checklist is harder than it looks. Real documents (tax forms, NDAs, offer letters) often need personalization (employee name, salary, start date) before they're sent. You either build a templating layer (extra CR) or you upload pre-personalized PDFs and skip the templating. For v1, skip templating. Personalize manually in Word or Google Docs and upload the result.
The Google Workspace integration is the biggest unlock. Most "HRIS magic" is "this tool can create email accounts and add users to groups." Avery wires up the API in one CR and you get the same magic for a one-time effort.
E-signature integration is doable but adds real complexity. If your team is comfortable emailing PDFs and having employees scan signed versions back, skip e-signature for v1. Add it in v1.1 if it becomes a friction point.
The manager dashboard is what HR teams actually want from BambooHR. Managers complain about not having visibility into onboarding. Building it custom means you can shape it to your org's specific manager workflow. Real win.
What this costs to run
Same stack as the previous internal tools.
Vercel or Railway: $20 to $40 per month.
Postgres via Supabase or Neon: $25 to $50 per month.
S3 for document storage: $5 to $20 per month depending on volume.
Resend for email: $0 to $25 per month.
DocuSign API (if you add e-signature): paid per envelope, varies.
Google Workspace API: free for existing Workspace customers.
Total: $50 to $135 per month for the system, plus DocuSign costs if you go that route.
Versus BambooHR at hundreds per month plus per-employee fees.
When this approach fails
If your team grows past 200, you'll start hitting limitations. The role-based access gets fiddly. The reporting needs get more complex. Compliance requirements (especially around employee data retention) get more formal.
At that point, you have two options: invest in extending the custom build (another month of CRs, doable), or migrate to a real HRIS (Rippling or BambooHR scale to thousands of employees).
The custom build buys you the first 200 employees. That's enough runway for most companies.
The v1.1 additions
Once v1 is live, the obvious follow-ons:
Org chart visualization. Tree view of the company hierarchy using manager_id relationships. One CR.
Performance review templates. Annual or quarterly review forms with feedback from manager, peers, and self. Two or three CRs.
PTO tracking. Request, approve, balance. Three or four CRs depending on PTO policy complexity.
Compensation history. Track salary changes over time per employee. One CR with proper audit log.
Each is a CR or two. None are urgent for the initial replacement. Ship v1 first.
The strategic decision
The real question isn't "can we build this?" It's "should we?"
The arguments for: cost savings, customization, data ownership, learning to use AI tooling in production. The arguments against: HR is a sensitive function, mistakes are expensive, and "good enough" software in HR can introduce real compliance risk.
The decision usually comes down to company size and HR sophistication. If you have one HR person managing 50 employees with a spreadsheet because BambooHR feels too expensive, custom is the answer. If you have a five-person HR team running payroll and compliance across multiple states, you need a real HRIS.
Most companies overestimate the second case and underestimate the first. Audit honestly. The custom path is more accessible than it used to be.