Home / Auto Repair / Car-ready pickup message from Shopmonkey: balance, hours, one reminder, then a person
Auto Repair problem 3: 'Is my car ready?' calls all afternoon, and finished cars sit in the lot overnight
Car-ready pickup message from Shopmonkey
Balance, hours, one reminder, then a person
When an order moves to your 'Ready for pickup' workflow status in Shopmonkey, a signed webhook triggers one message to the customer: the vehicle is ready, the balance (or 'paid in full'), your pickup hours and address. It's a text if they gave consent on the check-in form, otherwise an email; with neither, the advisors are asked to call. Status changes after 9 p.m. wait for 8 a.m. If the car is still at that status and unpaid at 10 a.m. the next day, one reminder goes out and the office is told; after that a person takes over. Duplicate webhooks never send twice.
How the workflow runs
Trigger · When an event arrives
Shopmonkey webhook (order updated)
Steps
- Verify, ready? Tell the customer
Outcome
- Send pickup message
Also runs on: Every 15 min, 8 am-8 pm → Held texts + next-day reminder → Send held/reminders
Drawn from the node names in the workflow file inside the download (workflow.json).
The problem
Vendor docs and one industry survey; we found no public figure for how many calls a shop gets asking 'is it ready?', so we quote none.
- Shopmonkey's message templates include a 'Work Almost Complete' text you send by hand; we didn't find an automatic ready-for-pickup text in its help center. Source: Shopmonkey Help Center: Best Practices: Use Message Templates (Vendor docs)
- In AutoZone's May 2025 survey, 20% of shop owners also work as technicians, so the person who'd make the 'it's ready' call is often under a car. Source: AutoZone / Endeavor Business Intelligence: Automotive Repair Shop Owners and DIFM Customers (May 2025) (Industry survey)
Background reading: Car-ready text templates for auto shops (and two you shouldn't send)
Who it's for
Shopmonkey shops that use workflow statuses and want customers told the moment the car is done.
Tools and monthly cost
| Tool | Official price |
|---|---|
| Shopmonkey (you probably already pay for it) | Basic $239 / month, Clever $399, Genius $499 (about 10% less billed annually: $215 / $359 / $449). The pricing page lists 'API and Webhooks' and unlimited 2-way SMS and email in every plan, and 'Automated Estimate Followups' on Genius. CRM Essentials (campaigns, online booking) is a paid add-on at $349 / month ($314 annual) 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 pricing page |
| A2P 10DLC registration (required to text US customers from a local number) | One-time: $4.50 brand registration and $15 campaign vetting. Monthly: $1.50-$10 per campaign by use case 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 (consent log, opt-out list, declined-work log) | Free with a Google Account pricing page |
| n8n | Community 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 150 single-segment texts and receiving 150 a month, at the highest listed carrier fee ($0.005): 150 x ($0.0083 + $0.005) + 150 x $0.0083 + $1.15 number = $4.39 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 and your Shopmonkey plan come on top. Your volumes will differ.
Setup
- Shopmonkey: create an API key (Settings > Integration > API Keys) and set SHOPMONKEY_API=https://api.shopmonkey.cloud/v3 and SHOPMONKEY_API_KEY. The workflows send it as a Bearer token and honor HTTP 429 Retry-After.
- Texts need a Twilio number on an approved A2P 10DLC campaign. Set TWILIO_ACCOUNT_SID, TWILIO_BASIC_AUTH (base64 of SID:auth token) and AUTO_TWILIO_FROM.
- Email: MSS_EMAIL_API (e.g. https://api.resend.com), EMAIL_API_KEY, AUTO_EMAIL_FROM, AUTO_OFFICE_EMAIL (the service advisors' inbox). Every send carries an Idempotency-Key, so a retried run never emails twice.
- Company details: AUTO_COMPANY_NAME, AUTO_COMPANY_PHONE, AUTO_COMPANY_ADDRESS, COMPANY_TZ (the shop's time zone; texting hours follow it).
- Google Sheet stand-in: MSS_SHEET_URL points at the shared sheets (sms_consent, sms_optouts, inbound_texts and the recipe's own sheets). In production, swap these HTTP calls for n8n's Google Sheets node.
- Remove the test-only mss-ar*-tick webhooks (or put them behind n8n header auth) and make sure MSS_TEST_CLOCK is NOT set in production.
- READY_STATUS_ID: the id of your 'Ready for pickup' workflow status in Shopmonkey. AUTO_PICKUP_HOURS: one sentence with your pickup hours.
- In Shopmonkey, add a webhook for Order changes pointing at /webhook/mss-ar3-sm and set SHOPMONKEY_WEBHOOK_SECRET to its signing secret. Bad signatures are rejected and logged to the webhook_rejects sheet.
Download
Downloadauto-car-ready-pickup.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. Shopmonkey (REST v3 with a Bearer key, HTTP 429 with Retry-After, HMAC-signed webhooks), Twilio, the email API (Resend-style) and Google Sheets were replaced by a local mock server built from the vendors' public docs. 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, vehicles and repair orders are invented. Verified with mocks; nothing was sent to a real person or account. How we test.
17/17 scenarios passed (run 2026-10-31)
| PASS | AR3-01 | June (text consent on file) moves to Ready at 3 pm: one text with vehicle, balance, hours, address, STOP; office told |
| PASS | AR3-02 | Shopmonkey retries the same webhook-id: nothing sent twice |
| PASS | AR3-03 | A second event for the same Ready status (new webhook-id, same status date): still one message |
| PASS | AR3-04 | No text consent on file: email instead, no text |
| PASS | AR3-05 | Marco: no consent and no email: nothing to the customer, office asked to call |
| PASS | AR3-06 | Consent on file but later texted STOP: no text, email instead |
| PASS | AR3-07 | Marked Ready at 9:30 pm: text held, not at 7:45 am, sent at 8:00 am |
| PASS | AR3-08 | Still at Ready and unpaid next day: one reminder at 10 am, office told to call; never a third message |
| PASS | AR3-09 | Paid and picked up before 10 am next day: no reminder |
| PASS | AR3-10 | Prepaid order: message says paid in full, no balance line |
| PASS | AR3-11 | Order moves to some other status: nothing happens |
| PASS | AR3-12 | A customer-table event: ignored |
| PASS | AR3-13 | Forged signature, 15-minute-old timestamp, garbage signature: all rejected and logged, nothing sent |
| PASS | AR3-14 | Secret rotation: two signatures in the header, the second one valid: accepted |
| PASS | AR3-15 | Signed with the whole secret string instead of the decoded key (docs don't say which): also accepted |
| PASS | AR3-16 | Shopmonkey 429 on the read-back: retried, one text |
| PASS | AR3-17 | Shopmonkey 500 on the read-back: nothing guessed to the customer, office told to tell them by hand |
Actual output from the test run
Scenario AR3-01: the ready-for-pickup text with the balance (invented customer and shop). Names and numbers are invented.
Hi June, your 2015 Subaru Outback is ready for pickup at Riverside Auto Care. Balance due: $412.50. We're open until 6 pm today and 7:30 am to 6 pm on weekdays. 1800 River Rd, Lawrence, KS. Questions? Call (555) 555-0150. Reply STOP to opt out.
Verified with mocks
- June (text consent on file) moves to Ready at 3 pm: one text with vehicle, balance, hours, address, STOP; office told
- Shopmonkey retries the same webhook-id: nothing sent twice
- A second event for the same Ready status (new webhook-id, same status date): still one message
- No text consent on file: email instead, no text
- Marco: no consent and no email: nothing to the customer, office asked to call
- Consent on file but later texted STOP: no text, email instead
- Marked Ready at 9:30 pm: text held, not at 7:45 am, sent at 8:00 am
- Still at Ready and unpaid next day: one reminder at 10 am, office told to call; never a third message
- Paid and picked up before 10 am next day: no reminder
- Prepaid order: message says paid in full, no balance line
- Order moves to some other status: nothing happens
- A customer-table event: ignored
- Forged signature, 15-minute-old timestamp, garbage signature: all rejected and logged, nothing sent
- Secret rotation: two signatures in the header, the second one valid: accepted
- Signed with the whole secret string instead of the decoded key (docs don't say which): also accepted
- Shopmonkey 429 on the read-back: retried, one text
- Shopmonkey 500 on the read-back: nothing guessed to the customer, office told to tell them by hand
- Verified with mocks; invented customers, vehicles and repair orders only.
Documented from official API docs only
Built to the vendor's documentation but not run against a live account. Check these on yours.
- Shopmonkey REST v3 paths, field names (order, customer, deferred services, workflow status) and webhook signing (webhook-signature 'v1,' base64 HMAC-SHA256 of id.timestamp.body) come from Shopmonkey's public developer docs; not run against a live Shopmonkey account.
- Twilio request signing, Messages API, Dial action callbacks, 429 behavior and built-in STOP handling (from Twilio's docs). The email API follows Resend's documented request shape.
Limitations
- Texts only go to numbers in our own consent log (the check-in form fills it). Shopmonkey's own opt-in fields aren't documented in the API, so we don't rely on them.
- The balance is what Shopmonkey reports when the status changes; the message never mentions storage fees.
- Every message is checked against a word list first (AUTO_LINT in autolib.py): 'guaranteed', 'safe / unsafe to drive', 'dangerous', 'will fail', 'diagnosis', storage fees and collection threats are blocked, and the office is told instead. A text can't see the car; a technician's words belong in the estimate, not in an automated message.
- Written and tested for Shopmonkey's API only. Tekmetric's API isn't open to the public, and Mitchell 1, Shop-Ware, AutoLeap and other shop systems are not built; we make no claim these recipes work with them.
- Not legal advice and not a compliance guarantee. Texts to customers go only to numbers with consent recorded on our check-in form (or that just called the shop, for the missed-call reply), only between 8 a.m. and 9 p.m. shop time, and plain-English opt-outs are honored (47 CFR 64.1200 is the federal rule we design around). Some states are stricter; have your attorney review texting consent before going live.