Home / Roofing Contractors / CompanyCam photo documentation packet: inspection photos in order, with captions and times, for office review
Roofing Contractors problem 3: Claim and inspection photos are scattered across phones and jobs
CompanyCam photo documentation packet
Inspection photos in order, with captions and times, for office review
From a JobNimbus job (or a small form), the workflow pulls the linked CompanyCam project's photos for the dates you pick, puts them in a fixed order by tag (elevations, roof overview, slopes, damage close-ups, interior), and builds a packet with capture time, photographer, caption and photo link. It leaves out internal photos and holds any caption or note that mentions coverage or deductibles for review. The packet is emailed to your office only, with a JobNimbus note and a CompanyCam comment. Nothing goes to the homeowner, the insurer or the adjuster automatically.
The problem
Carriers are asking for more documentation, and assembling photos by hand eats office time. The figures below are from trade press.
- Roofing Contractor, on Verisk's report: roof repair and replacement costs reached nearly $31 billion in 2024, almost 30% more than in 2022, and the Private Risk Management Association says carriers are tightening documentation requirements before paying roof claims. 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 own plans already 'turn job photos into reports' (Core) and 'auto-generate job reports' (Crew and above). If those reports cover you, you may not need this recipe; this one adds a fixed section order, holds for risky wording and a JobNimbus note in one step. Source: CompanyCam pricing and plan features (Vendor pricing page)
Who it's for
US roofing companies on JobNimbus and CompanyCam that put together photo documentation after storm inspections.
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 |
| 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 30 packets a month: 30 office emails fit Resend's free tier, and CompanyCam's API calls are included with your account (its documented limits are 240 reads and 100 writes a minute per company). About $0 a month on top of CompanyCam and JobNimbus, plus your n8n server.
Setup
- Read the 'Texting, insurance and storm rules we design around' section on the roofing hub first. The packet is an organized set of your photos, nothing more.
- In CompanyCam, create an access token for the API and set CC_ACCESS_TOKEN. Tag photos consistently (for example Front Elevation, Rear Elevation, Roof Overview, Hail Damage, Interior); F3_SECTION_ORDER sets the section order.
- 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 a JobNimbus job field 'CompanyCam Project ID' and fill it on each job; 'Insurance Company', 'Claim Number' and 'Date of Loss' are copied as recorded, if present.
- Host the small request form or call the 'mss-f3-packet' webhook with ROOF_FORM_KEY, the JobNimbus job id and a date range.
- 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.
- Build a packet for a finished job you know well and compare it with your photos before relying on it.
Download
Download roofing-companycam-inspection-report.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 | R1 | Wrong form key: nothing is read or sent |
| PASS | R2 | Delgado hail job, Oct 18-28 (CompanyCam answers 429 once, 4 photos per page): packet emailed to the office only, sections in order, internal photo and September photo left out, risky caption and rep note held for review, disclaimer, JobNimbus note and CompanyCam comment |
| PASS | R3 | Job with no photos in range (Becker, project 90002): office told why, no note, no comment |
| PASS | R4 | Job without a CompanyCam Project ID (Ortiz estimate): office told which field to fill, CompanyCam never called |
Actual output from the test run
Scenario R2: the packet emailed to the office (invented job, insurer and photos). Names and numbers are invented.
Subject: Photo packet ready for review: Delgado - Hail Damage (7 photos, 2 held)
PHOTO DOCUMENTATION PACKET - DRAFT FOR OFFICE REVIEW
Job: Delgado - Hail Damage (JobNimbus jnj-2006)
Property: 1418 Example Ridge Rd, Springfield, MO, 65804
CompanyCam project: Delgado - 1418 Example Ridge Rd https://app.companycam.com/projects/90001
As recorded in JobNimbus: Example Mutual (fictional), reference EX-2026-0418, date of loss 2026-10-18
Photos: 7 from Oct 18, 2026 to Oct 28, 2026 (1 internal-only photo(s) not included)
FRONT ELEVATION (1)
- Oct 20, 2026 10:05 AM, Luis Ramos: Front of house, east facing
https://img.companycam.example/p-1101/web.jpg
REAR ELEVATION (1)
- Oct 20, 2026 10:07 AM, Luis Ramos: Rear elevation
https://img.companycam.example/p-1102/web.jpg
LEFT ELEVATION (1)
- Oct 20, 2026 10:09 AM, Luis Ramos: (no caption)
https://img.companycam.example/p-1103/web.jpg
ROOF OVERVIEW (1)
- Oct 20, 2026 10:20 AM, Luis Ramos: South slope overview
https://img.companycam.example/p-1104/web.jpg
DAMAGE CLOSE-UP (1)
- Oct 20, 2026 10:24 AM, Luis Ramos: Bruised shingle, south slope, chalk circle
https://img.companycam.example/p-1105/web.jpg
GUTTERS (1)
- Oct 20, 2026 10:31 AM, Luis Ramos: Dents in gutter, rear
https://img.companycam.example/p-1107/web.jpg
UNTAGGED (1)
- Oct 20, 2026 10:44 AM, Luis Ramos: Ladder setup
https://img.companycam.example/p-1110/web.jpg
FIELD NOTES (JobNimbus)
- Oct 20, 2026, Casey Wynn: Homeowner says the leak in the back bedroom started after the Oct 18 storm.
HELD FOR REVIEW - NOT IN THE PACKET (2)
- Photo p-1106 caption "Hail hit - insurance will pay for a full replacement" (mentions: insurance will pay). Fix the caption in CompanyCam, then rebuild.
- JobNimbus note by Casey Wynn on Oct 20: "Told homeowner her deductible is covered if she signs today" (mentions: deductible). Left out of the packet; review it with the rep.
ABOUT THIS PACKET: it lists photos and field observations only. It is not an estimate, a coverage opinion or a damage determination, and it does not negotiate anything with an insurer. Several states limit what a roofing contractor may do on a homeowner's insurance claim (for example Texas Insurance Code 4102.163 and Florida Statutes 489.147); check your state's rules before you share it, and send it only if the homeowner asks you to.Verified with mocks
- Delgado hail job, Oct 18-28 (CompanyCam answers 429 once and returns 4 photos per page): sections in the configured order, the internal photo and a September photo left out, a caption and a rep note with claim wording held for review, the disclaimer at the end, emailed to the office only, plus a JobNimbus note and a CompanyCam comment.
- A job with no photos in the range: the office is told why; no note, no comment.
- A job without a CompanyCam Project ID: the office is told which field to fill; CompanyCam is never called.
- A wrong form key: nothing is read or sent.
- 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: GET projects and project photos with start_date / end_date and cursor paging, GET photo tags, POST project comments, rate limits (from CompanyCam's OpenAPI file and developer docs; not run against a live account).
- JobNimbus API: GET jobs, POST activities (from JobNimbus's API docs). Resend email API (from Resend's docs).
Limitations
- It is not an estimate, a coverage opinion or a damage determination, and it doesn't write supplements or Xactimate line items.
- Sharing documentation with an insurer can touch state public-adjuster rules (for example Texas Insurance Code 4102.163 and Florida Statutes 489.147). The packet's footer says so; share it only when the homeowner asks and your state allows it.
- Photo order depends on your tags. Untagged photos go in an 'Other photos' section at the end.
- The packet is a plain-text email with photo links, not a PDF.
- 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.