More Features
Contracts and e-signature
Build contracts from templates, have clients sign online, counter-sign, and keep a sealed signed PDF that can never be changed.
Coming March 2027
This feature ships in March 2027. This page describes how it will work; details can change before release.
Contracts let you agree the terms of a job with your client before the work starts, entirely online. You build a contract from a template, your client's details are filled in, the client reads and signs it in the browser, you counter-sign, and the final PDF is sealed: it gets a signature certificate page and a SHA-256 fingerprint, and it never changes afterwards. Attach a contract to an estimate and your client can accept and sign in one step. Nothing needs printing, scanning or posting.
How it works
A contract is its own document type, alongside invoices, estimates, credit notes and receipts. It has its own number sequence per business and moves through these statuses:
| Status | Meaning |
|---|---|
draft | Being written. You can still change everything. |
sent | Sent to the client for signature. |
partially_signed | At least one signer has signed, others have not yet. |
signed | Every signer has signed. |
sealed | The final PDF has its certificate page and stored hash. It can no longer change. |
superseded | A newer version of this contract replaced it. |
Templates and variables
Contracts are built from templates, stored as data. When you create a contract for a client, the template's variables are filled in from the business and the client, so you do not retype names, addresses and other details each time. The filled-in text is saved with the contract as its content.
Signer order
Each contract has a fixed signer order, for example the client first and then your business. A signer who is not next cannot sign yet. When the last signer signs, the contract is complete.
What we record for each signature
When someone signs, we store:
- the signer's name and email;
- the method: a typed name or a drawn signature;
- the consent text exactly as it was shown;
- the IP address, browser (user agent) and time of signing.
This evidence goes on the signature certificate page of the sealed PDF and stays with the contract for the life of your account.
Sealing
When every signer has signed, the final PDF is produced with the certificate page, and its SHA-256 hash is stored. Every time anyone downloads the signed PDF, from the app, the API or the client portal, the file's hash is checked against the stored one. If they ever differed, the download would be blocked and an alert raised, so the PDF you or your client download is always the one that was signed.
A signed contract never changes. If the terms need to change, you create a new version, which must be signed again by every signer. The old version stays on record, marked as superseded.
Create and send a contract in the web app
Open Contracts
Contracts is in the app sidebar under Documents. Create a new contract and pick the client.
Choose a template
The business and client details are filled in. Review the text and adjust anything specific to this job while it is still a draft.
Attach it to an estimate (optional)
Attached to an estimate, the contract turns acceptance into accept and sign: the client accepts the estimate and signs the contract in one place. If the estimate has a deposit, signing creates the deposit invoice.
Send it
Send the contract like any other document. The client receives a single-purpose signing link at their email address.
Counter-sign
When it is your turn in the signer order, a member with permission to sign for the business counter-signs. The contract is then sealed.
How your client signs
Your client opens the signing link (the estimate page) or the client portal, reads the contract, ticks the consent text, and types or draws their signature. They never need an account or a password. After sealing, the client can download the signed contract from the portal at any time.
Through the API and MCP
Create a contract creates a draft. Sending it uses Send a document, the same call as for invoices.
curl -X POST "https://api.freeinvoiceautomation.com/v1/contracts" \
-H "Authorization: Bearer $FIA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: contract-website-redesign" \
-d '{
"business_id": "0193f2a1-7c4e-7b9a-9f10-3c2d1e0a4b51",
"client_id": "0193f2a1-0c11-7d2e-9a40-1b2c3d4e5f60",
"template_key": "services_agreement",
"estimate_document_id": "0193f2b4-5a6b-7c8d-9e0f-1a2b3c4d5e6f",
"signer_order": [{ "role": "client" }, { "role": "business" }]
}'template_key names one of your contract templates; estimate_document_id is optional and attaches the contract to an estimate. The full field list is on the endpoint page.
Other endpoints:
- List contracts and Get a contract.
- Counter-sign a contract for the business signature.
- Create a new contract version when the terms change.
- Download a signed contract: the hash is checked on every download.
- Sign a contract is the public call behind the client's signing page.
Over MCP, create_contract creates a draft contract for your assistant. As with every integration, a person confirms the send. See the MCP tool reference.
Webhooks report contract.sent, contract.signed and contract.sealed, so your own systems know when work can start.
Legal scope
Signatures made here are simple electronic signatures under the EU's eIDAS regulation, the US ESIGN Act and UETA, and Pakistan's Electronic Transactions Ordinance 2002. The contract screen states this too, so both you and your client know what kind of signature is being made.
Qualified or certified electronic signatures are not offered. Some documents in some countries require them, or require a handwritten signature or a notary. If you are unsure which kind your contract needs, ask a legal advisor before relying on an electronic signature.
Rules and edge cases
- Sealed means final. Content, signer order and the sealed file cannot change once sealed (API error
contract_sealed). Make a new version instead. - Out-of-order signing is refused. Only the next signer in the order can sign.
- Signing links are single-purpose. A link only lets its holder view and sign that contract, and is sent to the signer's own email address.
- Deposit invoice. On an estimate with a deposit, the client's signature creates the deposit invoice automatically. See Deposits and schedules.
- Evidence is kept. Signature evidence and sealed PDFs are kept for the life of the account. If you delete your account, you are warned to export them first.
Errors
| Code | When |
|---|---|
contract_sealed | You tried to change a signed contract. Create a new version. |
contract_hash_mismatch | The stored file does not match its hash. The download is blocked and we are alerted. |
conflict | The signer is not next in the signer order, or the contract is not in a state that allows the action. |
token_expired, token_revoked | The client's signing link expired or was revoked. |
confirmation_required | A send without "confirm": true from a draft_only key or token. |
permission_denied | Your role lacks the key for the action. |
Permissions
| Action | Permission key | Default roles |
|---|---|---|
| View contracts and download signed PDFs | contracts.view | Owner, Admin, Editor, Viewer, Accountant |
| Create contracts and new versions | contracts.manage | Owner, Admin, Editor |
| Counter-sign for the business | contracts.sign | Owner, Admin |
| Send a contract | documents.send | Owner, Admin, Editor |