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

Verified with mocksLast tested 2026-10-28 · pricing checked October 2026

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.

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

ToolOfficial 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
n8nCommunity 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

  1. 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.
  2. 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.
  3. Tell crews that photos marked internal in CompanyCam never go to homeowners, and that captions are visible to the homeowner when updates are on.
  4. 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.
  5. 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)

PASSP1CompanyCam webhook with a bad signature: ignored
PASSP2First photo on the Ortiz garage job (9:15 a.m.): one 'crew on site' JobNimbus note; duplicate delivery and later photos add nothing
PASSP36 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
PASSP4Second 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.