Contact_documents rows carry a name, url, type and size against a contact. The contracts flow files a 'Project Agreement — Fully Executed (<date>)' row pointing at the portal URL; sending a change order attaches a row pointing at the change order; staff can upload arbitrary files from the contact's Documents panel.
Also called: customer documents · where are my signed contracts · document storage · paperwork for this customer
- 1sendContractToCustomer() resolves the contact (directly, or via the estimate link) and inserts the document row.
- 2sendChangeOrder() attaches a row 'so it appears in the customer's Documents tab as a record of what was sent' — best-effort, because 'the CO row's status flip is the source of truth — the doc row is a convenience surface'.
- 3Manual uploads post the file to media storage and insert a row with its returned URL.
- 4The panel lists documents newest first for the selected contact.
The change-order attachment comment sets the model: the document row is a convenience surface over the record of truth, and it exists so a builder can answer 'what have we sent this customer?' from one place instead of three systems. The contract path deliberately refuses to file anything that isn't fully executed.
- Signed paperwork living in inboxes
- No single per-customer document list
- Half-executed documents filed as final
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 →