User guide
Client Onboarding
Looking for what it does rather than how to use it? Read the Client Onboarding overview .
Last verified against the codebase: 2026-07-27.
What it is
Client onboarding is the path from “we won the account” to “the client is working in their portal”: create the company, send the agreements for signature, invite their people, and confirm they arrived.
It has two halves. The onboarding tracker follows one client through seven steps, and the Getting Started checklist follows one workspace — yours or theirs — through the setup that makes the product useful. Both are progress surfaces; neither is a wizard you have to finish in one sitting.
Concepts
| Concept | What it is |
|---|---|
| Onboarding tracker | One row per client organization, with seven step flags and their timestamps, an overall status, and free-text notes. Created automatically when the client is created. |
| Document package | The set of agreements a client signs, assembled from your document templates. One package per onboarding; it moves DRAFT → SENT → PARTIALLY_SIGNED → COMPLETED. |
| Signing token | A per-signer, per-document bearer link. Hashed at rest, rotated whenever a reminder or resend is emailed, so an old link stops working. |
| Portal invitation | A PORTAL_ACTIVATION magic link, valid 7 days, that lets the client’s contact set a password and sign in. |
| Setup checklist | The “Getting Started” hub. Two definitions: an MSP one (40 items, 6 groups) and an organization one (34 items, 6 groups, plus 4 items only the servicing MSP sees). |
| Detector | A read-only query that decides whether a checklist item is done. 59 of them. Completion is derived on every request, never stored, so progress cannot drift from reality. |
| Manual item | A checklist item with no detector — you tick it yourself. Items with a detector cannot be hand-ticked. |
| Activation nudge | An email sent to a workspace that started setup and stalled below 100%, naming its single next step. |
| Activation snapshot | A daily per-subject record of checklist completion, used for the platform activation funnel. |
Roles and permissions
The role hierarchy is platform administrator > MSP administrator > MSP technician > organization administrator > power user > CUSTOMER`.
Note that MSP technician outranks organization administrator. Every rank floor below is “this role or higher” against that order.
| Action | Minimum role | Extra requirement |
|---|---|---|
| See a client’s onboarding progress | MSP technician | The client is one you service |
| See the onboarding pipeline | MSP technician | — |
| Override a tracker step / status / notes | MSP administrator | — |
| Create a client | MSP administrator | The account is an MSP partner |
| Send / resend / cancel a document package | MSP technician | The package belongs to your account |
| Send or resend a portal invitation | MSP administrator | The client is one you manage |
| Open the MSP Getting Started hub | MSP administrator | — |
| Open the organization Getting Started hub | organization administrator | — |
| View a client’s Getting Started as their MSP | organization administrator | Your account services that client’s account |
| Edit client-onboarding defaults | MSP administrator | — |
Reading a tracker sits at MSP technician — the same floor as the client list and client detail pages — so a technician sees the same progress bars everyone else does. Writing one is MSP administrator, and the page hides the write controls from anyone below that rank rather than showing a button that fails.
Targeting another organization’s checklist is authorized against the servicing relationship: your account must be the client’s primary manager or hold an ACTIVE management link. An organization you do not service answers 404, not 403 — a 403 would confirm the identifier exists.
Walkthrough — onboarding a new client
MSP portal: Clients → Onboard Client. Six steps.
- Company — name, subdomain slug, industry, size, website and address.
- Primary contact — the person who will receive the welcome email, the documents and the portal invitation. Their email must not already exist.
- Services — the managed services this client buys, with quantity and price. These become the contract lines.
- Billing — cycle and contract length. A contract is created when services are selected.
- Legal & Compliance — the documents to send. This step opens with your saved default document set already selected (Settings → Client Onboarding), and Require signing before portal access pre-set from the same place. You must accept the platform terms once before any documents can go out.
- Review — confirm and create.
What happens on create, in one transaction: a client Account (managed by yours), an Organization, the contact Person with an organization administrator membership, the contract if any, the document package if any, and the onboarding tracker. A failure anywhere rolls all of it back — there is no half-created client.
After the transaction commits, emails go out:
- The client gets a welcome email, always.
- If documents were selected, the package is sent immediately to the primary contact with a signing link, and the tracker moves to
AWAITING_SIGNATURES. - If no documents were selected, the portal invitation goes out right away and the tracker sits at
AWAITING_ACTIVATION. - If documents were selected, the portal invitation is deliberately held back and released automatically when the package completes.
An email failure never rolls back the client. If the package could not be sent, it stays DRAFT and the client’s onboarding page offers Send documents.
Walkthrough — sending documents to an existing client
You can skip documents at onboarding time and send them later, or send a second package after the first completes.
- Open Clients → client → Onboarding.
- The No documents in flight panel offers Send documents.
- Pick templates from your library, grouped by category.
- Send to client. The package is created and delivered in one move, to the client’s primary contact, with the signer role from your onboarding defaults.
While a package is in flight the panel is replaced by the tracker’s own actions: Resend documents (rotates each unsigned signer’s link and emails it again) and Cancel package.
The onboarding tracker
Seven steps, in order:
| Step | Completes when |
|---|---|
| Client Created | The client is provisioned. Always true. |
| Documents Sent | The onboarding package moves to SENT. |
| Documents Signed | Every required signature is captured and the package completes. |
| Portal Invitation Sent | A PORTAL_ACTIVATION link exists for someone in the client organization. |
| Portal Activated | That link was redeemed, or a member has a verified email and a credential. |
| First Login | Any member of the client organization has signed in. |
| Setup Complete | You mark it. This step is judgement, not observation. |
The last three are derived, not written by the event: reading a tracker reconciles it against live portal state — magic links, verified emails, last login — and persists what it observes, with the real timestamp.
Reconciliation only ever moves steps forward. A step you ticked by hand is never un-ticked.
Overall status is one of six values and follows the steps:
| Status | Meaning |
|---|---|
NOT_STARTED | Nothing has happened yet. |
IN_PROGRESS | Created, documents assembled but not yet out. |
AWAITING_SIGNATURES | Documents sent, signatures outstanding. |
AWAITING_ACTIVATION | Documents done (or skipped); waiting on the client to come in. |
ACTIVE | The client has logged in, or you marked setup complete. |
STALLED | Signatures are past the third cadence window, or the package expired. |
Actions on the page reflect what is actually possible right now, not the status label: Send documents (a DRAFT exists), Resend documents (one is in flight), Cancel package, Send/Resend invitation (nobody has activated yet), Mark setup complete / Reopen onboarding. MSP administrator also gets a per-step Mark done / Mark not done override on every one of the seven steps, and the Notes field.
The onboarding pipeline
MSP portal: Clients → Onboarding pipeline (/msp/clients/onboarding).
Every client currently being onboarded, one row each: name, primary contact, a progress bar, the step they are waiting on, the stage badge and when it last moved. Filter by stage — including Stalled, which is what the reminder engine writes when a client stops responding — or search by client name. Clicking a row opens that client’s onboarding page.
Getting Started hubs
Two hubs, one component, one engine:
- MSP portal → Getting Started (
/msp/getting-started) — 40 items in 6 groups: Company foundation, Your team, Service desk, Clients, Billing & finance, Operations & growth. - Organization portal → Getting Started (
/org/getting-started) — 34 items in 6 groups: Workspace foundation, Your team, Service desk & knowledge, Billing & subscription, Power features, Operations.
Each item carries a one-line summary, why it matters, what you will need, an estimated time, and a Set it up deep link into the page that does it. Three items (invite-team, queues, email-to-ticket) additionally offer Show me, a guided in-app tour of the target page — offered only in the portal the tour was written for.
Item states:
| State | What it means |
|---|---|
| Incomplete | Not done. Counts against your percentage. |
| Complete | A detector observed it, or you ticked a manual item. |
| Skipped | You dismissed it. Excluded from the denominator — skipping never lowers the score. |
| Locked | Your plan does not include it. Excluded from the denominator, with an upgrade CTA and the real price. |
| Managed | Organization portal only: your provider handles it. Read-only, excluded from the denominator. |
applicable = total − locked − skipped, and the percentage is round(100 × completed / applicable), or 100 when nothing applies.
Dismissing the checklist hides the nav entry, its progress pill and the dashboard card, and stops nudges. The hub itself stays reachable from Settings, and offers Restore it.
For a managed client
Three items are provider-owned on a managed client’s own hub and render as read-only “Handled by your provider”: sender identity, payment method, and invoice & billing settings. Everything else — including the plan, branding, custom domain, SSO and claiming an email domain — stays self-serve, because a managed client can upgrade its own plan.
The MSP’s view of a client’s hub
Open Clients → client → Onboarding. Below the tracker, the client’s own checklist appears with a group only you can see: Onboard this client, with four items — send onboarding documents, invite their portal users, confirm the client is in, and set up their service contract. Their overall completion percentage is shown underneath. On that view the three provider-owned items stop being read-only, because you are the provider.
Nudges and reminders
Three separate mechanisms, easy to confuse:
Signing reminders (per document package)
For each package that is SENT and not complete, timed by your Reminder cadence setting (default “every 5 days”):
- day N — a gentle reminder to the outstanding signer
- day 2N — a final reminder
- day 3N — no more email; the tracker is flagged
STALLED
Exactly two emails per package. Each reminder rotates the signing token, so the link in the newest email is the only one that works.
If the package passes its expiry date first, it is retired to EXPIRED, the tracker is flagged STALLED, and its signing links stop opening.
Activation nudges (per workspace)
It scans up to 500 subjects per scope and emails each stalled one its single next step.
- Organizations — recipient is the primary active organization administrator; the link goes to
/org/getting-started. - MSP partner accounts — recipient is the primary active MSP administrator in the MSP’s own organization; the link goes to
/msp/getting-started. An MSP’s own organization is excluded from the organization scan so it is never nudged about the wrong checklist.
A subject is skipped for a named reason: dismissed, complete, capped, too_soon, no_recipient, opted_out, no_next_step or send_failed. Cadence: at most 3 nudges ever, at least 3 days apart. The next step is always the first incomplete item, so a locked or provider-owned item is never the thing you are chased about. A failed send does not advance the cadence — it retries on the next run.
{ dryRun: true } runs the identical scan, sends nothing, writes no state and echoes the flag back; the job fails loudly if that echo is missing.
Activation snapshots
Runs daily at 02:00 UTC, on by default (analytics rows only, no email).
Every client-onboarding setting
MSP portal: Settings → Client Onboarding (/msp/settings/onboarding).
| Setting | What it does | If unset |
|---|---|---|
| Default document set | Templates pre-selected on the new-client wizard’s Legal step, and the set used when a client is created through the API with no documents. Templates deleted or deactivated since you saved are skipped. | No documents pre-selected |
| Require all documents signed | On: the portal invitation waits for every required signature. Off: it is released as soon as the first signature lands. | On |
| Reminder cadence | “Every N days” — gentle reminder at day N, final at 2N, STALLED at 3N. Accepts 3, 5 or 7. | 5 days (→ 5 / 10 / 15) |
| Auto-expire unsigned documents after | Stamps a new package’s expiry. When it passes, the package moves to EXPIRED, its signing links stop opening, and the tracker is flagged STALLED. Accepts 14, 30, 60 or Never. | 30 days |
| Default signer role | The role a package is delivered under when you do not name a signer: msp sends as msp_signer, client and both as client_primary. | Both |
Never still bounds a signing token at 365 days. A bearer link that lives forever is a security hole, not a setting.
Two settings are per-package rather than per-account and override the defaults: an explicit expiresInDays when creating a package, and an explicit signers list when sending one.
Plan tiers
Client onboarding itself carries no plan gate. The tracker, the pipeline, the document packages, the signing flow, the portal invitation, both Getting Started hubs, the nudges and the snapshots are available on every tier including Free.
What is gated are individual items inside the checklists, which is exactly what the locked state exists to show:
| Checklist item | Requires |
|---|---|
| Set your brand colors | customBranding at FULL |
| Remove Solidlio branding | whiteLabel |
| Use a custom portal domain | customDomains |
| Enable single sign-on | ssoEnabled |
| Define SLA policies | slaManagement at BASIC or above |
| Connect your support email | emailIntegration at BASIC or above |
| Route email into a queue | emailIntegration at BASIC or above |
| Connect accounting (QuickBooks Online) | quickbooks in integrations |
| Set up change management | changeManagement |
| Create a project | projectManagement |
| Explore roll-up reporting | rollUpReporting at BASIC or above |
| Create an API key | apiAccess at READ_ONLY or above |
A locked item shows the tier that unlocks it, its monthly price, and — when your account can self-serve — an Upgrade button that runs the prorated upgrade in place. Trying to tick a locked item through the API returns the same upgrade envelope rather than silently succeeding.
Activation reporting
Platform portal: Activation (/platform/activation). Built from the daily snapshots, per scope:
- total subjects, how many are fully activated, how many dismissed
- a distribution across five completion bands (0–25%, 26–50%, 51–75%, 76–99%, 100%)
- per checklist item, in configuration order: how many subjects it applied to, how many completed it, and the completion rate — the “where they stall” view
Items only the servicing MSP sees are excluded: the funnel measures activation, not the MSP’s per-client work.
Troubleshooting
“At least one signer is required — this client has no contact with an email address” You sent a package with no signers and the client organization has no active member with an email. Add a contact to the client, or name a signer explicitly.
“One or more signers are not members of this account” A signer you named is not in your account or in any account you service. Signer identity is validated against your servicing relationships, so the client’s own contact is accepted, but a person from an unrelated tenant is not.
“organizationId does not belong to this account” The organization you are creating a package for is neither yours nor one you service. Check you are using the client’s organization id, not its account id.
“Package has already been sent” /send only moves a DRAFT. To chase an in-flight package use /resend.
“Can only resend for sent or partially signed packages” The package is DRAFT (use /send), or it is already COMPLETED, CANCELLED or EXPIRED.
“This item is completed automatically and cannot be marked done manually” The checklist item has a detector. Do the underlying thing and it completes on its next load. This is deliberate: hand-ticking a detected item would make the percentage a fiction.
“This item is managed by your provider.” A managed client tried to change a provider-owned checklist item. Only three items are: sender identity, payment method, and invoice & billing settings.
“Onboarding tracker” (404) No tracker exists for that organization. Trackers are created with the client; a client imported by another route (an accounting import, for instance) may not have one.
The client says they never got the documents. Check the package status on the client’s onboarding page. DRAFT means it was never sent — use Send documents. EXPIRED means it passed the expiry window; send a new package. In development, outbound mail is redirected to an allowlist, so a redirected message is not a bug.
The signing link says it is invalid. Signing tokens are single-use, expire on the account’s schedule, and are rotated by every reminder and resend — so only the newest email works. A cancelled or expired package rejects all its links regardless of the token’s own clock.
A step on the tracker is wrong. Open the client’s onboarding page as MSP administrator and use the per-step Mark done / Mark not done override. Reconciliation never reverses a manual override.
The Getting Started entry disappeared from the nav. It was dismissed. The hub is still linked from Settings, and the page offers Restore it.
Then check the run’s skip reasons — capped (3 already sent), too_soon (inside the 3-day gap), opted_out (the recipient disabled email notifications), or no_recipient (no active organization administrator / MSP administrator with an email).
Limits and known behaviour
- The tracker is one per organization. A client cannot have two concurrent onboardings.
- “Setup Complete” is a human judgement. Nothing infers it; an admin marks it, or it follows first login into
ACTIVE. - Reconciliation is organization-wide, not contact-specific. If any member of the client organization has logged in, First Login is complete — the tracker measures whether the client arrived, not whether a particular person did.
- Signing reminders stop after two emails per package, whatever the cadence. The cadence changes the timing, not the count.
- Nudges stop after three, ever. There is no reset; a workspace that ignores three nudges is not nudged again.
- The nudge job is opt-in and the snapshot job is not. One sends mail; the other writes analytics rows.
- Package expiry is enforced by the 6-hourly sweep, so an expired package can look SENT for up to 6 hours. Its signing links stop working immediately regardless, because the tokens carry their own expiry.
- The client’s Getting Started hub is a view, not a remote control. From the client’s onboarding page an MSP can tick manual items and see progress; the client’s own gated features still require the client’s plan.
- Checklist item keys are permanent. Renaming one would orphan stored manual completions and skips, and break the funnel’s history.
- Onboarding is web-only. The mobile app lists clients but has no tracker, checklist or document-signing surface.
- There is no bulk onboarding. Clients are created one at a time through the wizard or the API.