Home / Lawn Care / Quote request instant reply: answer in a minute, only inside your service area

Lawn Care problem 5: Quote requests sit in the inbox until evening, and half of them are outside your service area

Quote request instant reply

Answer in a minute, only inside your service area

Verified with mocksLast tested 2026-10-31 · pricing checked October 2026
Download the workflowlawn-quote-request-instant-reply.zip

18/18 test scenarios passed against mock APIs. Includes the n8n workflow, mock data and the test runner.

  • n8n
  • Twilio
  • Resend
  • Jobber
  • Google Sheets

A short web form (name, address, ZIP, phone or email, service, optional text consent) posts to n8n. Outside your ZIP list, the person gets a polite 'we don't serve that ZIP yet' page and email and nothing reaches Jobber. Inside it, Jobber gets a client and a request, the customer gets an email right away and a text if they ticked the consent box (requests after 9 p.m. get the text at 8 a.m.), and the office gets an email with the Jobber link. If Jobber fails, the customer still gets an answer and the office gets every detail. A honeypot field, a signed form key and a minimum fill time keep bots out; repeats within 10 minutes are ignored.

How the workflow runs

Trigger · When an event arrives

Form submit (POST)

Steps

  1. Honeypot + form key + dedupe + ZIP check
  2. Out of area: polite email
  3. In area: Jobber clientCreate
  4. Jobber: clientCreate
  5. Build requestCreate
  6. Has client?
4 more steps
  1. Client failed: compose with fallback
  2. Jobber: requestCreate
  3. Compose messages (Jobber saved?)
  4. Send emails + text

Outcome

  • Answer the browser
  • Send out-of-area email
  • Send emails + text

Also runs on: Form page (GET) → Render form → Send form page

Also runs on: Every hour at :05, 8 am-8 pm → Send held texts → Send held

Drawn from the node names in the workflow file inside the download (workflow.json).

The problem

One vendor benchmark across home services; the lawn-specific figure is in a chart we couldn't read as text, so we quote none.

Background reading: Lawn care estimate follow-up: a free template and three texts that stop when they should

Who it's for

US lawn care companies that get quote requests from a website form.

Tools and monthly cost

ToolOfficial price
Jobber (you probably already pay for it)Core $29 / month billed annually ($39 with a 1-year monthly commitment, $49 with no commitment); Connect from $99; Grow from $149; Plus from $399 (5 users). Jobber's developer docs say custom API integrations are only for approved customers, and the pricing page doesn't say which plan an API app needs pricing page
Twilio US local phone number$1.15 / month pricing page
Twilio US SMS, sent or received$0.0083 per segment, plus carrier fees on outbound texts of $0.0035-$0.005 per segment (AT&T $0.0035, T-Mobile $0.0045, Verizon $0.005) pricing page
A2P 10DLC registration (required to text US customers from a local number)One-time: $4.50 brand registration (Standard brands add $41.50 secondary vetting) and $15 campaign vetting. Monthly: $1.50-$10 per campaign by use case ($2 for sole proprietors) pricing page
Resend (sends the emails; any email API that accepts an Idempotency-Key works)Free: 3,000 emails / month, 100 / day. Pro: $20 / month for 50,000 emails pricing page
Google Sheets (opt-out list, replies, renewal list)Free with a Google Account; Google Workspace is optional pricing page
n8nCommunity Edition: free if you self-host (you pay for the server). n8n Cloud: Starter EUR 20 / month or Pro EUR 50 / month, billed annually pricing page

Example month: Illustrative arithmetic, not a measured result. One local number sending 100 single-segment texts and receiving 100 a month, at the highest listed carrier fee ($0.005): 100 x ($0.0083 + $0.005) + 100 x $0.0083 + $1.15 number = $3.31 a month in Twilio usage, plus the A2P 10DLC campaign fee ($1.50-$10 a month) and one-time registration ($4.50 brand + $15 campaign vetting). Emails stay inside Resend's free tier at this volume. n8n Cloud Starter (EUR 20 a month) or your own server, and your Jobber plan, come on top. Your volumes will differ.

Setup

  1. Jobber: create a Jobber developer app, add an n8n OAuth2 credential (authorization URL https://api.getjobber.com/api/oauth/authorize, token URL https://api.getjobber.com/api/oauth/token). n8n refreshes the token and stores the rotated refresh token. Set MSS_JOBBER_URL=https://api.getjobber.com/api/graphql. The X-JOBBER-GRAPHQL-VERSION header is pinned in the workflow.
  2. Texts need a Twilio number on an approved A2P 10DLC campaign. Set TWILIO_ACCOUNT_SID, TWILIO_BASIC_AUTH (base64 of SID:auth token) and LAWN_TWILIO_FROM. Texts only go out 8 a.m.-9 p.m. in the customer's time zone and only with recorded consent.
  3. Email: MSS_EMAIL_API (e.g. https://api.resend.com), EMAIL_API_KEY, LAWN_EMAIL_FROM, LAWN_OFFICE_EMAIL. Every send carries an Idempotency-Key, so a retried run never emails twice.
  4. Company details: LAWN_COMPANY_NAME, LAWN_COMPANY_PHONE, COMPANY_TZ. Every message names your company.
  5. Google Sheet stand-in: MSS_SHEET_URL points at the shared sheets (sms_optouts, inbound_texts and the recipe's own sheets). In production, swap these HTTP calls for n8n's Google Sheets node.
  6. Remove the test-only mss-lc*-tick webhook (or put it behind n8n header auth) and make sure MSS_TEST_CLOCK is NOT set in production.
  7. Link or embed the form at /webhook/mss-lc5-quote (or copy its HTML into your site and post to the same URL; keep the form_ts / form_key fields).
  8. SERVICE_ZIPS: comma-separated 5-digit ZIPs you serve. LAWN_DEFAULT_STATE pre-fills the state. LAWN_FORM_HMAC_SECRET signs the form key; LAWN_FORM_MIN_SECONDS (default 3) is the minimum fill time.
  9. LAWN_REPLY_PROMISE (default 'within one business day'): only promise what you keep.
  10. The consent checkbox text is stored with time, IP and browser in the sms_consent sheet; have your attorney review it. Consent isn't required to get a quote, and the form says so.

Download

Downloadlawn-quote-request-instant-reply.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 on an isolated test instance and run end to end. Jobber (GraphQL, OAuth2 with refresh-token rotation and signed webhooks), Twilio, the National Weather Service API, the email API (Resend-style) and Google Sheets were replaced by a local mock server built from the vendors' public docs: same request shapes and auth headers, HMAC-signed webhooks, HTTP 429 with Retry-After and Jobber THROTTLED errors. A frozen test clock checks the 8 a.m.-9 p.m. texting window. These recipes use no AI model; every decision is a written rule. Customers, yards, invoices and addresses are invented. Verified with mocks; nothing was sent to a real person or account. How we test.

18/18 scenarios passed (run 2026-10-31)

PASSL5-01Form page: signed key, hidden honeypot, ZIP and address fields, optional text consent wording
PASSL5-02In-area request with text consent at 10 am: thank-you page, Jobber client + request, text and email to the customer within the same run, consent logged, office emailed
PASSL5-03Same person submits again 4 minutes later: 'we already have it', nothing created or sent
PASSL5-04After 10 minutes a new request is accepted (it may be a different job)
PASSL5-05Out-of-area ZIP: polite page and email, logged, never created in Jobber, no text, no office email
PASSL5-06No consent box: email only, no text, no consent row
PASSL5-07Phone only, no consent: nothing to the customer; office told to call
PASSL5-08Request at 10:15 pm: email and office now, the text is held
PASSL5-08b8:05 am Central (7:05 am in western Kansas): still held
PASSL5-08c9:05 am: the held text goes out once
PASSL5-09Honeypot filled: normal-looking thanks, nothing created or sent
PASSL5-10Forged form key: 400, nothing created
PASSL5-11Form sent in under 3 seconds (script): treated as a bot
PASSL5-12Missing ZIP and contact: 400 with a plain explanation
PASSL5-13Name with markup is escaped on the thank-you page
PASSL5-14Jobber THROTTLED on clientCreate: customer still gets the thank-you, email and text; office gets every detail and 'add it by hand'
PASSL5-15Number that texted STOP before: consent box ticked but no text is sent (opt-out wins); email still goes
PASSL5-16Twilio 429 once: Retry-After honored, text sent exactly once

Actual output from the test run

Scenario L5-02: the text to an in-area homeowner who ticked the consent box (invented customer and company). Names and numbers are invented.

H

Verified with mocks

  • Form page: signed key, hidden honeypot, ZIP and address fields, optional text consent wording
  • In-area request with text consent at 10 am: thank-you page, Jobber client + request, text and email to the customer within the same run, consent logged, office emailed
  • Same person submits again 4 minutes later: 'we already have it', nothing created or sent
  • After 10 minutes a new request is accepted (it may be a different job)
  • Out-of-area ZIP: polite page and email, logged, never created in Jobber, no text, no office email
  • No consent box: email only, no text, no consent row
  • Phone only, no consent: nothing to the customer; office told to call
  • Request at 10:15 pm: email and office now, the text is held
  • 8:05 am Central (7:05 am in western Kansas): still held
  • 9:05 am: the held text goes out once
  • Honeypot filled: normal-looking thanks, nothing created or sent
  • Forged form key: 400, nothing created
  • Form sent in under 3 seconds (script): treated as a bot
  • Missing ZIP and contact: 400 with a plain explanation
  • Name with markup is escaped on the thank-you page
  • Jobber THROTTLED on clientCreate: customer still gets the thank-you, email and text; office gets every detail and 'add it by hand'
  • Number that texted STOP before: consent box ticked but no text is sent (opt-out wins); email still goes
  • Twilio 429 once: Retry-After honored, text sent exactly once
  • Verified with mocks; invented customers, yards, invoices and addresses only.

Documented from official API docs only

Built to the vendor's documentation but not run against a live account. Check these on yours.

  • Jobber GraphQL field and mutation names, webhook signing (X-Jobber-Hmac-SHA256) and OAuth refresh-token rotation (from Jobber's developer docs; not run against a live account).
  • Twilio request signing, Messages API, 429 behavior and built-in STOP handling (from Twilio's docs). The email API follows Resend's documented request shape.

Limitations

  • A ZIP list is a rough service area; the office email shows the full address for edge cases.
  • The honeypot and form key stop simple bots, not a determined person.
  • Every message is checked against a word list first: safety claims like 'pet safe' or 'non-toxic' (the kind 40 CFR 156.10 treats as misbranding on a pesticide label), 'guaranteed' results and collection threats are blocked, and the office is told instead.
  • Written and tested for Jobber's API only. LMN, Aspire, Service Autopilot and other software are not built for this recipe, and we make no claim that it works with them. Jobber's developer docs say custom integrations are only possible for approved Jobber customers, so check with Jobber first.
  • Not legal advice and not a compliance guarantee. Texts go only to customers with recorded consent, only between 8 a.m. and 9 p.m. in the customer's time zone, and plain-English opt-outs are honored (47 CFR 64.1200 is the federal rule we design around). Some states are stricter than federal law; have your attorney review texting consent before going live.