User guide
Document Signing
Looking for what it does rather than how to use it? Read the Document Signing overview .
What it is
Document Signing lets an MSP keep a library of contract templates, assemble them into a package for one client, and email that client a link where they review and sign — or decline — without needing a Solidlio login. Every signature is stored with the signer, the time, the originating IP, the browser, and a one-way hash hash of the exact file bytes that were signed.
Concepts
| Noun | What it is |
|---|---|
| Document template | A reusable contract in your library. Either an uploaded PDF/DOCX or a rich-text document you write in Solidlio. |
| Starter template | A sample template Tridacom publishes (MSA, NDA, SOW, SLA, AUP, DPA). You copy it into your library and edit it. |
| Revision | A saved version of a rich-text template’s content. Every content save creates one; you can view and restore them. |
| Placeholder | A merge field like {{client.company_name}} inserted in the editor. Filled in when a package is built. |
| Document package | One or more documents assembled for a specific client, with a status of its own. |
| Document (item) | One document inside a package. Carries its own status and its own signatures. |
| Signing token | The secret in the emailed /sign/<token> link. Identifies the signer and opens the whole package for them. |
| Signature | One person signing one document. Records the signer, role, method, time, IP, user agent and document hash. |
Package statuses
DRAFT → SENT → PARTIALLY_SIGNED → COMPLETED
CANCELLED (you cancelled it, or a signer declined) and EXPIRED (the signing window elapsed) are terminal.
Document statuses
PENDING → VIEWED → PARTIALLY_SIGNED → SIGNED, or DECLINED.
SIGNED and DECLINED are one-way. A document that has been signed cannot afterwards be declined, and a declined document cannot be signed.
Roles and permissions
| Action | Who |
|---|---|
| Manage the template library | MSP technician and above (MSP technician, MSP administrator, platform administrator) |
| Copy a starter template | MSP technician and above |
| Create, send, cancel, resend packages | MSP technician and above |
| View a package’s audit trail | MSP technician and above, within the owning account only |
| Download an original or executed copy | MSP technician and above, within the owning account only |
| Publish/refresh starter templates | platform administrator, acting in the platform account |
| Sign or decline | Anyone holding a valid signing link — no login, no role |
A package belonging to another account returns 404, not 403 — there is no way to probe for the existence of another tenant’s documents.
Walkthroughs
Build your template library
- Go to MSP → Settings → Document Library.
- To start from a sample, open the starter templates and choose Copy. The copy lands in your library with a disclaimer appended to the description: “This is a sample template only and does not constitute legal advice. Have your legal counsel review and customize before use.”
- To upload your own, use Upload. Accepted types are PDF, DOCX and DOC, up to 25 MB. Anything else is rejected with
Unsupported file type: <type>. Accepted types: PDF, DOCX, DOC. - To write one in Solidlio, use Create Blank Template, give it a name and category, and you land in the editor.
- Click the eye icon on any template to open its stored file. A rich-text template that has never been rendered to a PDF opens in the editor instead — its content lives inline, so the editor is the preview.
Write a rich-text template with merge fields
- Open a rich-text template’s Edit page.
- Type
/in the body for the slash menu, or use the placeholder picker, to insert merge fields. - Save. Each save bumps the template version and writes a revision with your optional change note.
- Revision History lists every version with its author and note. Open one to read it, or restore it — restoring writes a new version rather than rewinding, so the history is never lost.
Which merge fields actually fill in:
| Field | Filled from |
|---|---|
msp.company_name, msp.address, msp.phone, msp.email, msp.website | Your account’s legal name, address and contact details |
msp.representative_name | The staff member who built the package |
client.company_name, client.address, client.phone, client.email | The client organization’s record |
client.contact_name | The client’s primary contact |
agreement.effective_date | The date the package is built |
Every other field — msp.representative_title, client.contact_title, the commercial terms under agreement.* (expiration date, term length, renewal terms, monthly fee, payment terms) and anything under custom.* — has no source of truth at build time and is deliberately left blank. It prints as a bracketed label such as [Payment Terms] for a person to complete. Solidlio does not invent values for a legal document.
Send documents to a client
- Go to MSP → Clients → client → Onboarding.
- Under Send documents, pick the templates you want and confirm.
- Solidlio creates the package, renders every rich-text document into a per-client PDF with the merge fields filled in, and emails the client’s primary contact a signing link.
- The response tells you how many signers were emailed and when their links expire.
If a document could not be rendered, the send is refused and names it: These documents have no file to sign and were not sent: <names>. Generate or upload their content first. Nothing is emailed until every signable document has a file behind it.
The default signer is the client organization’s primary contact, falling back to its earliest active member. If the organization has nobody with an email address you get At least one signer is required — this client has no contact with an email address.
What the signer sees
- The email carries a link to
/sign/<token>. No account, no password. - The page lists every document in the package, marks which ones are theirs to sign, and shows the sending company’s name and logo.
- Opening a document streams it inline from private storage and moves it from
PENDINGtoVIEWED. - Sign captures a typed name or a drawn signature. Solidlio computes the one-way hash of the document bytes server-side — the client never supplies it — and records the signature with the signer’s IP and user agent.
- Decline asks for a reason (required, up to 1000 characters). Declining any document cancels the whole package and closes the signer’s link.
- One link signs every document that signer was designated for. It is consumed only when they have nothing left to sign.
- After the last signature the page offers Download your signed copies. The link stays readable — but no longer signable — until its expiry, so the signer can come back for their copy.
Track and audit what is out for signature
- Go to MSP → Settings → Signature Tracking.
- Filter by status (Draft, Out for signature, Partially signed, Completed, Cancelled, Expired) or search by package name.
- Click a package to open its audit trail. For each document you see:
- its status, and the decline reason if it was declined;
- who was asked to sign, under which role, when they were invited, and whether their link has been used or is still valid;
- every signature, with the signer’s name and email, the capture method, the timestamp, the originating IP, the user agent, and the one-way hash the signature was bound to;
- an integrity check that re-hashes the stored file right now and compares. It reads Hash matches, Document changed since signing, or Not checkable right now if storage could not be read — that last state is not a claim that anything was altered.
- Download original and Download executed copy stream the files from private storage through an authenticated request.
- Resend signing links issues fresh links and invalidates the previous ones. Cancel package voids every outstanding link immediately.
Configuration
MSP → Settings → Onboarding holds every signing default:
| Setting | What it does | If unset |
|---|---|---|
| Default document set | Templates auto-selected for a new client’s onboarding package | Empty — you pick each time |
| Require all signatures | Whether the deferred portal invitation waits for every signature or goes out on the first | On (waits for all) |
| Reminder cadence | Days between reminders. A gentle reminder at day N, a final at 2N, then the onboarding tracker is flagged stalled at 3N | 5 (so 5 / 10 / 15) |
| Expiry | Days before an unsigned package is voided. never is allowed for the package; signing tokens still cap at 365 days | 30 days |
| Default signer role | client, msp or both — which side the package is delivered under | both |
An expired package flips to EXPIRED, its onboarding tracker to STALLED, and its signing links stop opening. Packages that are SENT or PARTIALLY_SIGNED are both swept, so a part-signed package expires on schedule like any other.
Reminders go to every signer who still owes a signature, not only the primary contact. Each reminder issues that signer a fresh link, which invalidates the one in their previous email.
Plan tiers
Document Signing is included on every plan. There is no entitlement gate on any template, package or signing route, and no signing feature flag in the plan catalog. Nothing here is metered or capped.
Troubleshooting
| What you see | What it means |
|---|---|
Signing link is invalid or expired | The token is unknown, past its expiry, already used for a write, or its package was cancelled or expired. |
Document is temporarily unavailable and could not be signed. No signature was recorded — please try again shortly. | The document bytes could not be read, so the content hash could not be computed. Solidlio refuses to record a signature it can never verify. Nothing was written. |
This signer has already signed this document | A signature already exists for this signer and role on this document. |
Document is already fully signed | Every required signer role is in. The document is closed. |
This document has already been signed and can no longer be declined (409) | Signed and declined are terminal states; neither overwrites the other. |
You are not a designated signer of this document (403) | The document is in your package but you were never given a token for it. |
These documents have no file to sign and were not sent: … | A signable document has no stored bytes — usually a rich-text template that never rendered. Fix it, then send. |
At least one signer is required — this client has no contact with an email address | The client organization has no active member with an email. |
One or more signers are not members of this account | A signer id in the request does not belong to your account or any account you service. |
Package has already been sent | Send only moves a DRAFT. Use resend for a package already out. |
Can only resend for sent or partially signed packages | Resend needs live signing tokens to rotate. |
Cannot cancel a completed package / Cannot cancel a cancelled package | Both are terminal. |
organizationId does not belong to this account | The client org is outside your account and outside the accounts you service. |
Content editing is only available for rich-text templates | An uploaded file has no editable content. Duplicate it as rich text, or upload a new version. |
Template has no HTML content to generate PDF from | The rich-text template is empty. Write something first. |
Unsupported file type: <type>. Accepted types: PDF, DOCX, DOC. | Template uploads accept those three types only, up to 25 MB. |
Invalid webhook signature (401) | An inbound e-signature provider callback failed signature verification or fell outside the 5-minute replay window. |
Limits and known behaviour
- Signing is invitation-only. There is no self-service way for someone to request a document to sign; a package is always pushed by MSP staff.
- Rich-text merge fields fill from account and organization records only. Commercial terms and custom fields print as bracketed blanks. See the table in walkthrough 2.
- Resending rotates tokens. Signing tokens are stored only as a one-way hash, so the raw value in a previously sent email cannot be recovered. Resend and automated reminders both issue a fresh link, and the older link stops working.
- Cadence is per account.
- A signing link stays readable after signing. Bounded by the token’s own expiry (your account’s expiry setting, capped at 365 days). Anyone with that URL inside that window can read the package and download its executed copies. Treat the link as a credential.
- Declining cancels the whole package, not just the document declined.
- Document Signing lives in the MSP portal. There is no org-portal or customer-portal screen for browsing signed agreements; clients retrieve their copies from their signing link.
- Signing runs entirely on Solidlio’s built-in capture.
- Statements of Work and quotes have their own acceptance flow, in Projects and Billing respectively. They record an acceptance name, signature, timestamp and IP against the accepting user, but they do not use document packages, signing tokens or content hashing.