More FeaturesContracts and e-signature

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:

StatusMeaning
draftBeing written. You can still change everything.
sentSent to the client for signature.
partially_signedAt least one signer has signed, others have not yet.
signedEvery signer has signed.
sealedThe final PDF has its certificate page and stored hash. It can no longer change.
supersededA 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

1

Open Contracts

Contracts is in the app sidebar under Documents. Create a new contract and pick the client.

2

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.

3

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.

4

Send it

Send the contract like any other document. The client receives a single-purpose signing link at their email address.

5

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
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:

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.

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

CodeWhen
contract_sealedYou tried to change a signed contract. Create a new version.
contract_hash_mismatchThe stored file does not match its hash. The download is blocked and we are alerted.
conflictThe signer is not next in the signer order, or the contract is not in a state that allows the action.
token_expired, token_revokedThe client's signing link expired or was revoked.
confirmation_requiredA send without "confirm": true from a draft_only key or token.
permission_deniedYour role lacks the key for the action.

Permissions

ActionPermission keyDefault roles
View contracts and download signed PDFscontracts.viewOwner, Admin, Editor, Viewer, Accountant
Create contracts and new versionscontracts.manageOwner, Admin, Editor
Counter-sign for the businesscontracts.signOwner, Admin
Send a contractdocuments.sendOwner, Admin, Editor

See Roles and permissions.