Milestone payment plan
Split a quote into several payments, each with its own amount, date or condition and, if your client is a business, with financing interest.
This feature is new and may not be enabled on your account yet. If you don’t see it, write to us.
What it is
A milestone plan splits a quote’s total into 2 to 24 payments. Each payment (a milestone) has a name, an amount and a due date, and can carry a condition your client sees, for example “When the approved design is delivered”. Your client approves the quote once and pays each milestone from the same link when it’s due.
When to use each way of getting paid:
| Option | What it’s for |
|---|---|
| Single payment | Your client pays the total at once, upfront or on a credit term. |
| Deposit and balance | Two parts: a percentage on approval and the rest according to the terms. See Upfront and balance. |
| Milestone plan | Projects, construction or implementations paid in stages, with your own dates or with payments that open when you complete a delivery. |
You define the milestone plan when you quote. It’s different from installment payment plans, which the AI collections agent proposes on a balance that’s already overdue and which only exist if your client accepts them.
Requirements
| Requirement | Detail |
|---|---|
| Plan | All plans, including Free. |
| Permission | Quotes to build the plan; Quotes or Collections to mark a payment as completed, undo it or reschedule; Settings for templates and interest values. |
| Country | Cord’s 12 countries. Financing interest only with clients you declare a business, and not with sales tax calculated from the client’s address in the United States. |
| Online payments | Optional. With Cord Payments or Mercado Pago, your client pays each milestone from the link; without online payments, they see the plan and pay you outside Cord. |
| Combinations | A plan replaces the deposit and can’t be combined with a monthly retainer. |
How to build one
- Open the quote editor and add the lines as usual.
- In step 3, Terms, find How it’s paid and choose Milestone plan (the other options are Single payment and Deposit and balance).
- Add one row per milestone: name, condition (optional), amount and due date. Mark No interest on a milestone that shouldn’t carry it. You can add, remove and reorder rows, or start from Use template.
- If you’ll charge interest, check The client is a business, turn interest on and choose the rate, whether it’s monthly or yearly, and the tax of the interest line.
- Check the preview: each milestone with its principal, interest, total and due date and, with interest, the cash price, the interest, the total to pay and the effective annual rate.
- Save or send. Cord validates the plan on the server and recalculates every amount: what the editor shows and what is saved come from the same calculation.
While the quote is a draft, the plan is recalculated with the date of each save and, when you send it, with the sending date, checking the interest against your current Settings. A new version (Modify and resend) recalculates it with the new lines and the resend date. Interest terms, however, don’t run from sending, but from the day your client approves.
Duplicate quote copies the plan if it still fits the new quote. If it no longer does (for example, a date that has passed), the copy comes out without a plan so you can rebuild it.
Amounts: percentage, amount or the remainder
Each milestone is defined in one of three ways:
- Percentage of the cash price, from 0.01 to 100, with up to two decimals.
- Fixed amount in the quote’s currency, with its decimals.
- The remainder: whatever is left to complete the total. Only one milestone can be the remainder.
Rules:
- Without “the remainder”, milestones must add up to exactly the cash price: percentages that add up to 100, amounts that add up to the total, or an exact mix. If they don’t, the editor says “The payments don’t add up to the quote total”.
- With “the remainder”, the other milestones must leave something for it.
- Whatever percentage rounding doesn’t allocate goes to the last percentage milestone, so the sum is exact to the currency’s smallest unit.
- Each milestone must be at least the currency’s minimum charge (for example, MXN 10.00, USD 0.50, EUR 0.50 or GBP 0.30).
The cash price is the quote total with its taxes, withholdings and discount, without interest.
When each payment is due
| Due date | How your client reads it before approving | When it can be paid |
|---|---|---|
| On approval | “On approval” | As soon as they approve. |
| Days after approval (1 to 1,825) | “30 days after approval” | From that day, counted from approval. |
| On a date | “On December 15, 2026” | From that date. If it has already passed when your client approves, it’s due on approval and carries no interest. |
| On completion (+0 to 365 days) | “On completion (+5 days)” | Only once you mark it as completed; it’s due that many days later. |
Dates are your business’s days, in its time zone: “today” is the day in your city, not the server’s. When you save, a date can’t be earlier than today or more than 1,825 days (5 years) away.
Conditions and completed milestones
The condition is text your client sees next to the milestone (“When the approved design is delivered”). On its own it doesn’t stop payment: what keeps a milestone from being paid early is its due date. A milestone with a date can be paid when its date arrives; an On completion milestone can’t be paid by any means until you mark it as completed.
- Open the detail of the approved quote. Each On completion milestone shows as Awaiting completion.
- When the delivery is done, click Mark as completed next to the milestone. You can leave a note of up to 500 characters for your team.
- Cord opens the milestone and sets its due date to today plus the agreed days. Your client gets an email with the subject “You can now pay “[milestone]” — [quote number]” and a button to pay it.
The action is recorded in the quote’s timeline (“Payment “Design delivery” marked as completed; due on…”), in the audit log and in your integrations through the quote.milestone_completed event.
If you marked it by mistake, Undo returns it to “Awaiting completion” and your client can no longer pay it. If your client opened that milestone’s payment page without paying, Cord cancels that attempt and undoes it anyway. It doesn’t go through if the milestone is already paid, if money already came in or a payment is in process, or if your client opened the payment with Mercado Pago, because then Cord can’t tell whether they already paid; in those cases it says “Your client already started paying this payment; it can’t be undone.”
Rescheduling midway
Projects change schedule. With Reschedule, in the detail of the approved quote, you change, on pending milestones:
- the date of a milestone that already has one (with a date, by days or already completed), not earlier than today or more than 5 years away;
- the visible condition (leave it empty to remove it);
- the days after completion of a milestone not yet completed, from 0 to 365.
The change is all or nothing: if one milestone doesn’t accept the change, none is applied. Paid milestones aren’t touched, and amounts and interest can’t be rescheduled: they are what your client approved. Your client gets an email (“The dates of your payment plan changed — [quote number]”) with a button to see the plan, and the timeline says how many payments were updated.
Financing interest
You can charge interest for paying over time. It isn’t late interest on an overdue payment: it’s agreed in the quote, your client sees it before approving and it’s part of the price.
Business clients only
Interest is offered only when you check The client is a business. With a consumer, a plan with interest is consumer credit, with its own rules in each country, and it shows as Coming soon. A plan without interest works for any client.
Before using it, turn it on in Settings › Quotes › Payment plans: it’s off by default.
How it’s calculated
It’s simple interest on each payment for its own term:
- a milestone’s interest = its principal × the rate × the days of its term ÷ 30 (monthly rate) or ÷ 365 (yearly rate);
- days run from the day your client approves the quote to the milestone’s due date: 0 for one due on approval, N for one due in N days, the days until the date for one with a date (0 if it has passed), and the days until the estimated date plus the agreed days for one due on completion (with interest, the estimated date is required);
- a milestone marked No interest, or due on approval, carries no interest.
Interest on an on-completion milestone is set on approval with its estimated date: if the delivery comes earlier or later, the amount doesn’t change.
Until your client approves, their link shows the plan calculated with your business’s today. For a milestone with a date or an estimated date, each day that passes shortens its term, so its interest and the total can go down from one day to the next; they never go above what you sent. On approval, Cord calculates it with the approval date, and that’s what stays on the quote.
The rate takes up to two decimals and is capped at 10% per month (120% per year) in every country, to prevent typing mistakes. Below that cap you can set your own in Settings.
The interest line
The total interest enters the quote as a Financing interest line, with the tax you choose in the plan (by default, the one in Settings; without it, your catalog’s main rate). Cord generates the line and recalculates it on every save: it can’t be edited by hand, it doesn’t receive the document discount and a partial approval doesn’t remove it. What that line adds to the total, with its tax, is split among the milestones in proportion to their interest.
Example with a sale of MXN 10,000.00 plus 16% VAT, approved on November 2, and a rate of 2% per month with VAT on the interest:
| Milestone | Due | Days | Principal | Interest with VAT | Payment total |
|---|---|---|---|---|---|
| Kickoff, 40% | On approval | 0 | MXN 4,640.00 | MXN 0.00 | MXN 4,640.00 |
| Design delivery, 30% | On completion (+5 days), estimated November 27 | 30 | MXN 3,480.00 | MXN 80.73 | MXN 3,560.73 |
| Go-live, the remainder | 60 days after approval | 60 | MXN 3,480.00 | MXN 161.48 | MXN 3,641.48 |
The interest line is MXN 208.80 plus MXN 33.41 of VAT. Cash price: MXN 11,600.00; interest: MXN 242.21; total to pay: MXN 11,842.21; effective annual rate: 31.91%.
What your client accepts
With interest, the link shows the full disclosure: Cash price, Interest, Total to pay, number of payments, the nominal rate with its period and the Effective annual rate, the real cost of the financing calculated with each payment’s actual days, and the notice that interest, with its tax, runs from the day they approve until each payment is due. To approve, your client checks a box with the plan’s text: the total, the cash price, the interest with its tax, the rates, when interest starts to run (and that interest on a payment due on completion is calculated to its estimated date) and the statement that they’re contracting on behalf of a business.
Cord stores the acceptance in the same operation as the approval: the text with its version and fingerprint, the plan’s fingerprint, the signer’s name and email, the IP address, the browser and the date. That record can’t be edited or deleted while the quote exists. That’s why only your client approves a plan with interest, from their link: in the detail, instead of Mark approved, you see “This plan includes interest: your client approves it from their link, where they accept the plan.”, and approving it through the API responds 409 aprobacion_solo_cliente. A plan without interest can be marked approved from the detail; its terms count from that day, just like in the link.
On the invoice
The quote’s invoice carries the interest line as one more item, with its tax. In Mexico it’s stamped in the CFDI with product key 84101700 (“Manejo de deuda”, debt management) and unit E48, with the VAT you chose (interest on an installment sale carries VAT); confirm the treatment with your accountant before stamping the first one.
What your client sees
The quote link shows the Payment plan block with each milestone in order: its name, its condition, when it’s due in words (“On approval”, “30 days after approval”, “On December 15, 2026”, “On completion (+5 days)”) and its amount. With interest, it also shows the disclosure and the box to accept it.
After approval, each milestone shows its status: Awaiting completion while it waits for its condition, Ready to pay when it can be paid and Paid.
If your client approves only some lines (partial approval), the plan is recalculated with the new cash price: percentages stay the same, fixed amounts are scaled proportionally and the interest line is recalculated. Your client sees the result before confirming. If any payment would fall below the minimum charge, that partial approval can’t go through. The fingerprint that signs the approval includes the plan’s.
When approving, the link sends the fingerprint of the plan your client is seeing, and Cord compares it with the plan calculated that day. If they don’t match (for example, they opened the link one day and approved the next), the approval doesn’t go through: the page says the proposal changed and reloads with today’s amounts so they can approve again.
How each payment is collected
- The payment button collects the next payable milestone: pending, open and due today, on your business’s calendar day. Never the full balance or a future milestone.
- A milestone that hasn’t reached its date, or that’s waiting for you to mark it as completed, can’t be collected by any means: not by card, not by bank transfer, not with Mercado Pago, not with a direct link to that payment.
- Each milestone is paid with your account’s active methods: card, SPEI (quotes in MXN), bank transfer with a reference or Mercado Pago.
- Each milestone is a separate transaction for fees: on charges in MXN, Cord Payments applies its fee to each one.
- The quote becomes Paid when the last milestone is paid. Each earlier payment emits
payment.partialwith typehitoand its name.
Without online payments, your client sees the plan with its dates and pays you outside Cord. Record payment, in the detail, marks the whole quote as paid: use it once everything has come in.
Reminders, receivables and invoice
- Reminders per milestone. Cord emails your client 3 days before and on the day each open, pending milestone is due (“Payment reminder: [milestone] — [quote number]”), and notifies you the day after if a milestone went unpaid. They follow the switch and the per-client pause of Automatic reminders. A milestone waiting for its condition gets no reminders. If you reschedule its date, it gets the reminders for the new date. They keep going out even after you issue the quote’s invoice, until that invoice is paid or uncollectible. Neither these reminders nor the notices of a completed milestone or a rescheduled plan reach a client on Never email.
- Receivables. Everything that measures your receivables counts only what’s payable, in your business’s day: a milestone waiting for its date or for you to mark it completed isn’t overdue. In Collections, the row shows what’s left to pay on the whole plan and is due with the oldest open, unpaid milestone; if the remaining ones are waiting for their condition, it says Awaiting completion. The overdue total, the Receivables age and the overdue counter in the sidebar only add milestones that are already overdue, and the cash forecast puts each milestone on its date (one due on completion, on its estimated date). Reports, the client’s account statement and, in Workflows, Remind the client to pay and the receivables lists of For each read it the same way. The AI collections agent only asks your client for what’s payable today; while no milestone is overdue and unpaid, the account is “Plan on track” and it doesn’t email. It also doesn’t propose an installment plan on a quote that already has a milestone plan.
- Invoice. If you issue the quote’s invoice, it includes the interest line and is due with the last milestone only if all milestones have a date; if any is waiting for its condition, it’s due according to the quote’s payment terms. That invoice is collected only through its milestones, in the quote link: its link doesn’t offer to pay and links to the plan with View the payment plan, the client portal doesn’t include it when paying several invoices or in automatic payments, and it doesn’t get invoice reminders, only those of each milestone. What your client pays on the quote is applied to the invoice.
Templates and defaults
In Settings › Quotes › Payment plans (Settings permission):
- Templates: you save a plan you repeat (for example, “40% at kickoff, 30% on delivery, the remainder in 60 days”) with its milestones, conditions, due dates and interest, and load it in the editor with Use template. Up to 50 per organization. A template has no total or sending date: whether it adds up and its dates are still valid is checked when you use it in a quote, so it’s best defined with percentages and “the remainder”.
- Interest: whether it’s allowed (off by default), the rate and period a new plan starts with, your own rate cap (as its monthly equivalent) and the default tax of the interest line.
API and webhooks
GET /api/v1/cotizaciones/{id}returnsplan_pagos: the disclosure (contado,intereses,total,tasa_anual_efectiva, all inmoneda) and each milestone with its definition, its amount, itsvence, whether it’shabilitadoand whether it’sexigible. It’snullwithout a plan. The MCP tooldetalle_cotizacionreturns it the same way. Until your client approves, it carries the plan as saved; the link shows it calculated with today’s date and, on approval, the one for the approval date stays.POST /api/v1/cotizacionesacceptsplan_pagosfrom your server, with a Secret Key; a publishable key ignores it. You send the definition, never amounts: Cord validates it, calculates it and generates the interest line. If it doesn’t go through, it responds 400plan_invalidowith each reason inissues.POST /api/v1/cotizaciones/{id}withaction: "approve"responds 409aprobacion_solo_clienteif the plan carries interest: your client approves that quote from their link. See Errors.quote.milestone_completedis emitted when a milestone is marked as completed, withcobro_id,numero,etiqueta,montoandvence.payment.partialcarriestipo: "hito",numero_cuota(the milestone’s order) andetiqueta(its name). See Webhooks.
{
"plan_pagos": {
"hitos": [
{ "nombre": "Kickoff", "importe": { "tipo": "porcentaje", "valor": 40 }, "vence": { "tipo": "al_aprobar" } },
{ "nombre": "Design delivery", "condicion": "When the approved design is delivered", "importe": { "tipo": "porcentaje", "valor": 30 }, "vence": { "tipo": "al_cumplir", "dias_tras_cumplir": 5, "fecha_estimada": "2026-11-27" } },
{ "nombre": "Go-live", "importe": { "tipo": "resto" }, "vence": { "tipo": "dias", "dias": 60 } }
],
"intereses": { "tasa_pct": 2, "periodo": "mensual", "impuesto_id": null },
"cliente_empresa": true
}
}
Limits
- 2 to 24 milestones per quote, one plan per quote.
- Name of 1 to 80 characters; condition of up to 280; completion note of up to 500.
- Percentages with up to two decimals; amounts with the currency’s decimals; only one “the remainder”.
- Due dates: 1 to 1,825 days after approval, a date no more than 5 years away, or on completion plus 0 to 365 days.
- Interest only with business clients, up to 10% per month or 120% per year and your own cap; not with sales tax calculated by address in the United States.
- No deposit or retainer on the same quote.
- Up to 50 templates per organization.
Common problems
“The payments don’t add up to the quote total”. Adjust the percentages or amounts, or mark one milestone as “the remainder”.
I can’t turn interest on. Check that it’s allowed in Settings › Quotes › Payment plans, that you checked The client is a business and, in the United States, that the quote doesn’t use sales tax calculated from the client’s address.
Mark approved doesn’t appear on a quote with interest. Only your client approves a plan with interest, from their link, with the plan’s box.
The plan’s amounts changed in the link. Until your client approves, the plan is calculated with today’s date: for a milestone with a date or an estimated date, interest goes down as that date gets closer.
My client’s page reloaded when approving. The plan they saw was no longer the one for that day. With the page reloaded, they see today’s amounts and can approve.
I can’t send a quote with interest. When sending, Cord checks the interest against your current Settings: it must still be allowed in Settings › Quotes › Payment plans and the rate can’t exceed your own cap.
My client can’t pay a milestone. Its date hasn’t arrived yet, or it’s an on-completion milestone you haven’t marked as completed.
Undo doesn’t work. The milestone is already paid, money already came in or a payment is in process, or your client opened the payment with Mercado Pago.
I want to change a milestone’s amount on an approved quote. Rescheduling only changes dates, conditions and days; amounts and interest are what your client approved. For other amounts, duplicate the quote and send it again.