Every job page (/portal/tech/[id] for the tech, /portal/schedule/[id] for the dispatcher) has a Photos card with four buckets: Before, During, After, Parts used. Each has an "Add photo" button.
On the tech's phone
Tapping Add Photo opens the back camera directly — no gallery picker, no extra steps. Photos compress client-side (1600px max edge, ~400KB) and EXIF metadata (including GPS) is stripped both on the device and again on the server. The compressed photo lands on the appointment in seconds.
What the customer sees
Photos surface on the customer's /me/[token] portal under each completed appointment, grouped by bucket. They can tap any photo to view full-size. The customer never sees the GPS coordinates or device serial that EXIF normally embeds.
Why this matters
- Roofers: storm-damage insurance claims need before / during / after.
- HVAC: warranty disputes ("we did install it level") get settled by photos.
- Plumbing: customer sees the corroded part you replaced — easier upsell next time something fails.
- Reviews: a 5-star review with a photo carries 3x the weight of a text-only review on Google.
Server-side: every JPEG passes through a strip pass that removes APP/EXIF/comment markers — including GPS coordinates, device IDs, software versions. Client-side compression drops EXIF as a side effect of canvas re-encoding. Defense-in-depth so a tech's home address never ends up embedded in a customer-facing photo.
Each photo caps at 8MB pre-compression and ~500KB stored. There's no monthly photo limit — but if you're shooting 100 photos a job across an entire fleet, talk to support about the storage budget so we can scale your bucket cleanly.