What the business needed
After each repair the owner sends the client a short report with before-and-after photos, because a client who can see the work says yes to the quote and pays the bill without questions. That report used to be written by an assistant somewhere else and sent on its own. The owner wanted it built into Biloh: written from the site photos, in the business's branding, and going out in the same email as the bill or the quote — with "send it with the quote too" being a setting, not a rebuild.
What happened
The report shipped on 28 October and went straight into use the same day. The owner sent five real client emails with a job report attached — three invoices and two proposals — each approved and delivered as one email: the invoice or proposal first, the report second, both in the business's own branding.
The owner's way of working did not change. After a job they tell the assistant what was done, the assistant builds the report from the photos already on the job, and the report is attached before the email is approved.
How it works
- A report is its own record.
create_job_reportstarts one from a job and takes the client, site and date from it;update_job_reportedits it, and two people editing at once can never overwrite each other. - Photos from anywhere.
add_job_report_photostakes an upload link, a direct upload, or the photos the contractor already took when completing the job. Every photo is turned upright and sized on arrival. - One renderer, one look. Every report, preview and attachment is drawn by the same template in the business's branding, so what the owner previews is what the client receives.
- Attach in one call.
attach_to_pending_sendadds the report to a staged invoice or proposal email. The send checks the report belongs to the same client before anything moves, so a mistake leaves a clean draft rather than a half-sent email. - Built to grow. Each kind of attachment is one small adapter. A new kind of paperwork, or a new kind of email to carry it, is one entry — and a structural test fails the build if a send that should carry attachments forgets to.
Proof
- Five emails on a live account carried a job report on launch day, 28 October: three invoices and two proposals, all approved and sent.
- Built test-first: the tests for editing and page layout were written and seen failing before the code, then passing.
- A sample built from the owner's own gate-post repair, with four photos, rendered on one A4 page matching the owner's original report.
For the next agent
- Attach the report before you confirm the send — the preview's attachment list then shows both files by name.
- Use
render_artifact_pdfto see the report exactly as the client will, from a signed link that works without a login. - Reuse the contractor's completion photos with
add_job_report_photosinstead of asking the owner to send them again.