{{estimate.payment_schedule}} renders as a markdown bullet list of the job's stages: name, percent, and dollar amount (computed from the percent against the grand total when no amount is stored). Stages come from the estimate snapshot when present, otherwise from job_meta.payment_stages for that job. Only when both are empty does the hardcoded 50% framing / 50% completion fallback appear.
Also called: payment schedule in contract · draw schedule · 30/60/10 · deposit terms · progress payments
- 1Look for paymentStages on the estimate snapshot.
- 2If empty and the link has a job_id, read job_meta.payment_stages for that org + job.
- 3Render each stage as '- **<name>:** <pct>% — $<amount>', filling the amount from percent × grand total when needed.
- 4Fall back to 50/50 only if there are genuinely no stages anywhere.
This is one of the sharpest bug notes in the codebase: 'This used to read snap.paymentStages off the ESTIMATE SNAPSHOT, a key that snapshot has never contained — so `stages` was always empty and every contract silently fell through to the hardcoded 50/50 below. Barnhouse's actual terms are 30% down / 60% delivery / 10% final. Their contracts have been stating 50% at framing and 50% at completion. On a $34,000 job that is a first payment overstated by nearly $7,000, in a document the customer signs.'
- Contracts stating payment terms the builder does not actually use
- First payment amounts overstated or understated in a signed document
- Payment stages living only in the estimate and never reaching the contract
See it on your own jobs
Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.
or keep browsing features →