Home / Roofing Contractors / Crew daily photo log: CompanyCam photos to a JobNimbus note and an optional homeowner update
Roofing Contractors problem 5: The office and the homeowner don't know what the crew did today
Crew daily photo log
CompanyCam photos to a JobNimbus note and an optional homeowner update
CompanyCam's photo.created webhook adds one 'crew on site' note to the JobNimbus job when the first photo of the day arrives. At 6 p.m. the workflow reads each in-progress job's photos for the day and posts a daily log note in JobNimbus with times, photographers, captions and links. If the job's 'Send Daily Updates' field is Yes, the homeowner gets a short email with the day's photos, leaving out internal photos and any caption that mentions insurance or deductibles; the office gets a text about held captions and a list of in-progress jobs with no photos today.
The problem
Homeowners want to see progress, and the office wants a record of each day. We found no reliable survey figure for this problem; the sources below are trade press and vendor docs.
- Roofing Contractor, on Verisk's report: carriers are tightening documentation requirements, so a dated photo record of each day's work is useful later. Source: Roofing Contractor: Insurers Further Tighten Grip Amid Surging Roof Losses (on Verisk's U.S. Roofing Realities report) (Trade press summarizing an analytics firm's report)
- CompanyCam's plans already include daily logs and 'send clients live job updates'. If you use those, you may not need this recipe; this one writes the log into JobNimbus and filters what the homeowner sees. Source: CompanyCam pricing and plan features (Vendor pricing page)
Who it's for
US roofing companies on JobNimbus and CompanyCam with crews that already photograph their work but whose office copies updates by hand.
Tools and monthly cost
| Tool | Official price |
|---|---|
| CompanyCam (job photos) | Listed at $63 / month (Core), $129 (Crew, 3 users included, extra users $29 each billed annually) and $199 (Scale); Enterprise by quote. Check the page for monthly vs annual billing pricing page |
| JobNimbus (CRM, if you use it) | Quote-based: plans Essentials (up to 3 users), Pro (up to 10), Premium (up to 19) and Enterprise; the plan table lists 'API & Webhooks' on every plan pricing page |
| Resend (sends the emails) | Free: 3,000 emails / month, 100 / day. Pro: $20 / month for 50,000 pricing page |
| Twilio US SMS, sent or received | $0.0083 per 160-character segment, plus carrier fees of about $0.0035-$0.005 per segment pricing page |
| n8n | Community Edition: free if you self-host (you pay for the server). n8n Cloud: from EUR 20 / month (Starter) or EUR 50 (Pro) pricing page |
Example month: Illustrative arithmetic. Assume 6 jobs in progress on 20 working days with 3 opted in to updates: about 60 homeowner emails and 120 JobNimbus notes, inside Resend's free tier, plus a few office texts for cents using the Twilio number from the other roofing recipes. About $0-$1 a month plus your n8n server.
Setup
- In CompanyCam, create an access token (CC_ACCESS_TOKEN) and a photo.created webhook pointing at 'mss-f5-photo'; copy the webhook's token into CC_WEBHOOK_TOKEN so the X-CompanyCam-Signature (Base64 HMAC-SHA1 of the raw body) is checked.
- In JobNimbus, create an API key (Settings > API) and set JN_API_KEY. The workflow reads jobs and contacts through the JobNimbus API (filters on status and date_status_change) and writes notes and tasks. JobNimbus's API docs we read don't document webhook events or rate limits, so the workflow polls and still waits and retries when it gets HTTP 429. Add the job fields 'CompanyCam Project ID' and 'Send Daily Updates' (Yes or No); F5_STATUS (default 'In Progress') names the status to watch.
- Tell crews that photos marked internal in CompanyCam never go to homeowners, and that captions are visible to the homeowner when updates are on.
- Set COMPANY_NAME, COMPANY_PHONE, COMPANY_ADDRESS, COMPANY_LICENSE, COMPANY_TZ, ROOF_EMAIL_FROM, ROOF_OFFICE_EMAIL and ROOF_OFFICE_PHONE from .env.example. Every message names your company; check what your state requires on written communications.
- Turn updates on for one friendly homeowner first. The workflow also has a manual 'run now' webhook used by our tests. Delete it, or put it behind n8n's header authentication, before you go live.
Download
Download roofing-crew-daily-photo-log.zip
Contains the n8n workflow, the mock data, the test runner with its last results, and the mock server we tested against. All keys in .env.example are fake.
Test result
Every workflow was imported into n8n 2.45.4 and run end to end on our test machine. JobNimbus (public API), AccuLynx (API v2 and webhooks), CompanyCam (Public API v1 and webhooks), Twilio, Google Sheets and the email sender (Resend) were replaced by a local mock server built from their official API docs: it checks the same request shapes, authentication headers and filters, pages results (CompanyCam cursors), signs webhooks the way Twilio and CompanyCam do, and returns HTTP 429 with Retry-After. A frozen test clock checks the 8 a.m.-9 p.m. texting window in the homeowner's time zone. These recipes use no AI model; every decision is a written rule. Homeowners, jobs and photos are invented. Verified with mocks; nothing was sent to a real person or account. How we test.
4/4 scenarios passed (run 2026-10-28)
| PASS | P1 | CompanyCam webhook with a bad signature: ignored |
| PASS | P2 | First photo on the Ortiz garage job (9:15 a.m.): one 'crew on site' JobNimbus note; duplicate delivery and later photos add nothing |
| PASS | P3 | 6 p.m. run (CompanyCam answers 429 once, 4 photos per page; one caption says insurance will pay): JobNimbus log with all 8 photos, homeowner email with 6 (internal photo and risky caption left out), office told about the caption and about Becker's job with no photos |
| PASS | P4 | Second run the same evening: nothing sent |
Actual output from the test run
Scenario P3: the homeowner's daily update email (invented job and photos). Names and numbers are invented.
Subject: Today's roof progress: Nov 5 Hi Megan, Here's today's progress on Garage Re-roof at 12 Example Ct: - 9:15 AM: Tear-off started https://img.companycam.example/p-1300/web.jpg - 10:15 AM: Decking checked https://img.companycam.example/p-1301/web.jpg - 11:15 AM: Underlayment down https://img.companycam.example/p-1302/web.jpg - 12:15 PM: Drip edge https://img.companycam.example/p-1303/web.jpg - 1:15 PM: Shingles going on https://img.companycam.example/p-1304/web.jpg - 3:15 PM: Cleanup, magnet sweep https://img.companycam.example/p-1306/web.jpg Questions? Reply to this email or call +15555550200. Ridgeline Roofing (example) +15555550200 200 Example Blvd, Springfield, MO 65804
Verified with mocks
- A CompanyCam webhook with a bad signature is ignored.
- The first photo on a job at 9:15 a.m. adds one 'crew on site' JobNimbus note; a duplicate delivery and later photos add nothing.
- 6 p.m. run (CompanyCam answers 429 once, 4 photos per page; one caption says insurance will pay): JobNimbus log with all 8 photos, homeowner email with 6 (internal photo and the risky caption left out), office texted about the caption and about a job with no photos today.
- A second run the same evening sends nothing.
- Verified with mocks; fictional homeowners and jobs only.
Documented from official API docs only
Built to the vendor's documentation but not run against a live account. Check these on yours.
- CompanyCam Public API v1 project photos with date filters and cursor paging; webhook envelope and signature (from CompanyCam's OpenAPI file and developer docs; not run against a live account).
- JobNimbus API: GET jobs and contacts, POST activities (from JobNimbus's API docs). Resend and Twilio send APIs (from their docs).
Limitations
- Captions are checked against a word list. It can miss unusual wording, so the office should still skim updates for the first weeks.
- Homeowner emails link to CompanyCam photo URLs; check your CompanyCam sharing settings before turning updates on.
- Built for JobNimbus. AccuLynx, Roofr and other CRMs are not built for this recipe, and we make no claim that it works with them.
- No message says anything about deductibles, coverage or filing a claim, and none goes to an insurer or adjuster. Several states bar contractors from acting as public adjusters or interpreting policies (for example Texas Insurance Code 4102.163, Florida Statutes 489.147, Minnesota 325E.66, Colorado 6-22-105); check your state's rules. A message lint blocks a list of claim and deductible words before anything is sent.