Home / Roofing Contractors / AccuLynx milestone updates for homeowners, then one review request after completion
Roofing Contractors problem 4: Homeowners call to ask where their job stands, and nobody asks for a review
AccuLynx milestone updates for homeowners, then one review request after completion
When an AccuLynx job moves to Approved or Completed, AccuLynx's job-milestone-changed webhook triggers a short status update to the homeowner: a text to their mobile if they haven't opted out, otherwise an email, otherwise an alert to the office. It re-reads the job's current milestone first, so late or repeated events don't send anything. Two days after completion, at 10 a.m., the homeowner gets one review request by email with your review link: no gating, no incentive. If the job is reopened first, it doesn't send. Every message is also logged on the AccuLynx job.
The problem
'Where are we?' calls and forgotten review requests cost office time and reputation. We found no reliable survey figure for this problem; the source below is the AccuLynx documentation the recipe is built on.
- AccuLynx sends a job-milestone-changed webhook whenever a job moves from one milestone to another, with the job id, milestone name and time, so updates can go out without anyone copying them by hand. Source: AccuLynx API: webhooks listener documentation (Vendor API documentation)
- CompanyCam's Marketing Suite add-on lists 'send review requests after jobs'. If you use it, you may not need the review part of this recipe. Source: CompanyCam pricing and plan features (Vendor pricing page)
Who it's for
US roofing companies on AccuLynx that want homeowners kept in the loop and a consistent review request without adding office work.
Tools and monthly cost
| Tool | Official price |
|---|---|
| AccuLynx (CRM, if you use it) | Quote-based (pricing request form); API keys are created by AccuLynx customers in their account 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 |
| Twilio US local phone number | $1.15 / month pricing page |
| A2P 10DLC registration (required to text US customers from a local number) | One-time: $4.50 brand + $15 campaign vetting (Standard brands add $41.50 vetting). Monthly campaign fee: $1.50 (low-volume mixed) to $10 (Standard) pricing page |
| Resend (sends the emails) | Free: 3,000 emails / month, 100 / day. Pro: $20 / month for 50,000 pricing page |
| Google Sheets (opt-out list, missed-call log, storm queue) | Free with a Google account or your existing Google Workspace plan 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 20 jobs a month: about 40 status texts (2 segments each = 80 x $0.0083 = $0.66 plus carrier fees) and 20 review emails inside Resend's free tier, using the Twilio number from the other roofing recipes. About $1-$2 a month plus your n8n server.
Setup
- In AccuLynx, create an API key (AL_API_KEY). The AccuLynx API allows 10 requests a second per key; AL_REQUEST_INTERVAL_MS paces calls and 429 replies are retried.
- Subscribe to the job-milestone-changed webhook topic with the URL 'mss-f4-milestone?key=' plus a long random AL_WEBHOOK_KEY. AccuLynx's docs don't describe a signature header, so the key in the URL and the re-read of the job's current milestone are the checks.
- Texts need a Twilio number with an approved A2P 10DLC campaign (US carriers block unregistered business texts). Point the number's incoming-SMS webhook at the recipe's SMS webhook and set TWILIO_AUTH_TOKEN and PUBLIC_WEBHOOK_BASE so X-Twilio-Signature is checked. ROOF_TEXT_START_HOUR / ROOF_TEXT_END_HOUR (default 8 and 21) set the window, applied in the homeowner's time zone (from the job's state).
- 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. ROOF_REVIEW_URL is your review link. F4_REVIEW_DELAY_DAYS (default 2) sets the delay; set F4_REVIEW_BY_TEXT=1 only if you want review requests by text when a homeowner has no email.
- Move a test job through Approved and Completed before switching on. 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-milestone-updates-review-request.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.
6/6 scenarios passed (run 2026-10-28)
| PASS | M1 | Webhook with the wrong URL key: AccuLynx is never called, nothing sent |
| PASS | M2 | Fenn job completed (AccuLynx answers 429 once): milestone re-read, completion text to her mobile, logged on the AccuLynx job; the same eventId again does nothing |
| PASS | M3 | Stale event (says Completed, AccuLynx says Approved) is ignored; real Approved event at 10 p.m. waits for 8 a.m. |
| PASS | M4 | Hale (home phone only) gets the completion update by email; Vogel (no mobile, no email) becomes an office alert |
| PASS | M5 | Silent recording: workflow must stop and write nothing |
| PASS | M6 | Park opts out by text, job completed: update goes by email; then the job is reopened before day 2, so no review request |
Actual output from the test run
Scenario M5: the review request two days after completion (invented homeowner). Names and numbers are invented.
Subject: How did we do? (Ridgeline Roofing (example)) Hi Gloria, thanks again for choosing Ridgeline Roofing (example). If you have a minute, would you leave an honest review of your roof project? https://g.page/r/ridgeline-example/review Ridgeline Roofing (example) +15555550200 200 Example Blvd, Springfield, MO 65804
Verified with mocks
- A webhook with the wrong URL key: AccuLynx is never called and nothing is sent.
- Job completed (AccuLynx answers 429 once): the milestone is re-read, the completion text goes to the homeowner's mobile and is logged on the AccuLynx job; the same eventId again does nothing.
- A stale event (says Completed, AccuLynx says Approved) is ignored; a real Approved event at 10 p.m. waits until 8 a.m.
- A homeowner with only a home phone gets the update by email; one with no mobile and no email becomes an office alert.
- Two days later at 10 a.m., not before: one review request each by email, an office alert for the homeowner with no email, the review link included, no incentive; a rerun sends nothing.
- A homeowner who opted out by text gets updates by email; a job reopened before day 2 gets no review request.
- 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.
- AccuLynx API v2: GET jobs, current milestone and job contacts; POST job messages; webhook topic job-milestone-changed and its listener rules (from AccuLynx's API docs; not run against a live account).
- Twilio and Resend send APIs (from their docs).
Limitations
- Only Approved and Completed send homeowner updates. Other milestones are ignored unless you add wording for them.
- The FTC's rule on consumer reviews (16 CFR 465) bans, among other things, incentives tied to a positive review and suppressing negative ones. This recipe sends the same request to every finished job and offers nothing for a review; don't add a filter that only asks happy customers.
- Built for AccuLynx. JobNimbus and Roofr versions are not built.
- 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.
- Not legal advice and not a compliance guarantee. We designed around 47 CFR 64.1200 (texts only with consent you record, 8 a.m. to 9 p.m. in the homeowner's time zone, opt-out words honored) and around state rules that bar contractors from acting as public adjusters, but whether your use is lawful depends on your consent wording, your state and your city. Have a lawyer review the wording before you turn it on.