Payments
Deposits and schedules
Ask for a deposit up front and split the rest into instalments, each with its own due date, reminders and late fees.
Coming the week of 25 January 2027
This feature ships in the week of 25 January 2027. This page describes how it will work; details can change before release.
A payment schedule splits one invoice or estimate into parts. You can ask for a deposit before you start work, then spread the rest into instalments, for example three monthly payments. Each part has its own due date, so reminders, late fees and (from March 2027) automatic card charges work part by part. The client always sees what is due now and can pay it in one click.
How schedules work
A schedule is attached to one invoice or estimate and is made of parts:
| Part | What you set |
|---|---|
| Deposit | A percent of the total or a fixed amount, due on acceptance (of an estimate) or on a date |
| Instalments | Equal splits such as 3 monthly payments, or custom dates and amounts |
Every part has a label, an amount, a due date (or "on acceptance") and its own status.
The parts always add up
Amounts are worked out in integer minor units by the same money engine that computes your totals, and the parts always add up exactly to the document total. When a split does not divide evenly, the last part absorbs the rounding.
For example, 1,000.00 USD in three equal instalments becomes 333.33 + 333.33 + 333.34. A schedule whose parts do not add up to the total is refused with schedule_total_mismatch.
Instalment statuses
| Status | Meaning |
|---|---|
pending | Not yet due |
due | Due now |
partially_paid | Part of this instalment is paid |
paid | Fully paid |
overdue | Past its due date and not fully paid |
void | The document was voided |
Paying a scheduled invoice
- The pay page and the client portal show the whole schedule and ask for the next amount due.
- The client may pay more than the next amount if they want to get ahead.
- Every payment, by card or recorded by you, is allocated to the parts oldest first. A payment that covers the deposit and part of the first instalment marks the deposit paid and the first instalment partially paid.
Deposits on estimates
Add a deposit to an estimate to be paid when the client agrees. When the client accepts the estimate online, a deposit invoice is created automatically and linked to the estimate, ready to pay. From March 2027 the same happens when a client signs a contract that has a deposit.
Reminders, late fees and auto-charge per part
Because each part has its own due date:
- Reminder sequences run against each instalment's due date and amount.
- Late fees are worked out per instalment.
- From March 2027, each instalment can be auto-charged to a client's saved card on its due date.
Add a schedule in the app
Open the invoice or estimate
Open the document in the editor. The schedule is part of the form, next to lines, taxes and notes.
Add a deposit
Enter a percent or a fixed amount and choose when it is due: on acceptance or on a date.
Add instalments
Split the rest into equal parts with a regular interval, or enter custom dates and amounts.
Check the parts
Review each part's amount before you continue. The last part includes any rounding so the total matches exactly.
Save or send
Save the draft or send it. The pay page and the portal show the schedule.
Through the API and MCP
| Action | REST | MCP tool | Permission |
|---|---|---|---|
| Set a payment schedule | PUT /v1/documents/{id}/payment-schedule | set_payment_schedule | documents.edit |
| Get a payment schedule | GET /v1/documents/{id}/payment-schedule | none | documents.view |
| Remove a payment schedule | DELETE /v1/documents/{id}/payment-schedule | none | documents.edit |
PUT replaces the whole schedule. Send the parts in order; for each part give either input_percent or amount_minor, and either a due_date or due_trigger: "on_acceptance".
curl -X PUT "https://api.freeinvoiceautomation.com/v1/documents/0193f2b4-5a6b-7c8d-9e0f-1a2b3c4d5e6f/payment-schedule" \
-H "Authorization: Bearer $FIA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: schedule-inv-0042-v1" \
-d '{
"installments": [
{ "kind": "deposit", "label": "Deposit", "input_percent": "30", "due_trigger": "date", "due_date": "2027-02-01" },
{ "kind": "installment", "label": "Instalment 1", "input_percent": "35", "due_trigger": "date", "due_date": "2027-03-01" },
{ "kind": "installment", "label": "Instalment 2", "input_percent": "35", "due_trigger": "date", "due_date": "2027-04-01" }
]
}'{
"data": {
"document_id": "0193f2b4-5a6b-7c8d-9e0f-1a2b3c4d5e6f",
"installments": [
{ "position": 1, "kind": "deposit", "label": "Deposit", "amount_minor": "36000", "due_date": "2027-02-01", "status": "pending", "paid_amount_minor": "0" },
{ "position": 2, "kind": "installment", "label": "Instalment 1", "amount_minor": "42000", "due_date": "2027-03-01", "status": "pending", "paid_amount_minor": "0" },
{ "position": 3, "kind": "installment", "label": "Instalment 2", "amount_minor": "42000", "due_date": "2027-04-01", "status": "pending", "paid_amount_minor": "0" }
]
}
}Field names follow the stored schedule parts; see the endpoint pages for the exact request shape. Your systems can follow parts with the installment.due and installment.paid webhook events. When a client pays on the pay page, the checkout request can name the instalment it pays (installment_id).
Rules and edge cases
- Exact totals. The parts must add up to the document total; the last part takes the rounding.
- Schedules on sent documents. A sent document changes only by revision, so changing the schedule of a sent invoice is recorded as a new revision (proposed).
- Paying more than the next amount is allowed by default; the extra goes to the next parts.
- Voiding the invoice voids its open parts.
- One schedule per document. Setting a new schedule replaces the old one.
What the client sees
- The schedule on the pay page and in the portal, with each part's label, amount, due date and status.
- The next amount due, preselected for payment.
- Reminders for each instalment as its due date comes.
Permissions
| Key | Needed for | Default roles |
|---|---|---|
documents.edit | Setting or removing a schedule | Owner, Admin, Editor |
documents.view | Seeing schedules | Owner, Admin, Editor, Viewer, Accountant |
Errors
| Code | When |
|---|---|
schedule_total_mismatch | The parts do not add up to the document total |
validation_failed | A part has neither a percent nor an amount, or no due date or trigger |
document_voided | The document is void |
permission_denied | Your role lacks documents.edit |