Makani Tech: Build. Automate. Evolve.

AI Service Job Dispatcher with n8n + Claude (free workflow)

How to build a job dispatcher that sends the nearest free technician automatically

FreeWorkflowBy Kishan Makani · updated 19 October 2026 · 5 min read

WhatsApp/FormGoogle SheetsClaudeGoogle Maps APIWhatsApp

Downloads

  • Download the n8n workflow (JSON)

    field-service-job-dispatch-n8n.json · n8n workflow · 24 steps · starts with WhatsApp complaint · uses WhatsApp, Anthropic, Slack, Google Sheets · 42 KB

    Import into n8n: Create Workflow, then the menu, then Import from File.

How to import it into n8n
  1. In n8n, create a new workflow.
  2. Open the ⋯ menu at the top right and choose Import from File, then pick the downloaded .json. (Or open the file, copy everything and paste it on the canvas.)
  3. Open each node with a warning and connect your own account: the file carries no passwords or keys.
  4. Run it once with Test workflow, check the result, then switch it to Active.

What this workflow does

A customer WhatsApps your service number: "AC not cooling, Tower B, Sector 137". Claude turns the message into a job card with appliance, brand, issue, address and urgency. Google Maps finds the address, n8n reads your technicians sheet and picks the nearest free technician with the right skill, with a rough ETA. The dispatcher sees it all on Slack and taps Approve. The technician gets the job card with a map link, the customer gets the job ID and ETA, and the technician is marked busy. When the job is marked Done, the technician is freed and the customer gets one feedback ask.

Who it is for

AC and RO service companies, appliance repair shops, pest control, facility management and any business that sends technicians to homes or offices and takes complaints on WhatsApp.

What you need

  • n8n (Cloud or self-hosted)
  • A WhatsApp Business Cloud API number
  • An Anthropic API key for Claude
  • A Google Maps API key with the Geocoding API enabled
  • A Google Sheet with Technicians and Jobs tabs
  • Slack for the dispatcher

The workflow, step by step

Step 1 · Complaint arrives on WhatsApp

Customers message your business number the way they always do. n8n catches each text, cleans the number and name, and never handles the same message twice.

  • WhatsApp complaint (WhatsApp Trigger): fires on every incoming message.
  • Clean up message (Set): message id, phone, WhatsApp profile name and the text.
  • Already processed? (Remove Duplicates): Meta sometimes delivers the same webhook twice; this stops a second job card.

Step 2 · Claude writes the job card

Claude turns the message into a job card: appliance, brand, issue, address, urgency. Missing address? It asks the customer. A status question goes to the dispatcher instead.

  • Make job card with Claude (Basic LLM Chain) with Claude and Job card fields (Structured Output Parser).
  • What do they need? (Switch): New job continues. Needs details goes to Ask for details, which sends Claude's one-line question. Status questions and anything else go to Alert dispatcher on Slack, so a person answers.

Step 3 · Find the nearest free technician

Google Maps turns the address into a location. n8n reads your technicians sheet, keeps the free ones with the right skill and picks the closest, with a rough ETA. The job card is logged.

  • Geocode address (HTTP Request to the Google Geocoding API).
  • Get free technicians (Google Sheets): reads technicians with Status = Free.
  • Pick nearest technician (Code): straight-line distance from each technician's Lat and Lng, same skill first, ETA at about 18 km/h plus 10 minutes, rounded to 5. Creates the job ID.
  • Log job card (Google Sheets, append or update on Job ID): Status = Awaiting dispatch.

Step 4 · Dispatcher approves, everyone is told

The job lands in Slack with the technician and ETA. Ravi taps Approve: the technician gets the job card, the customer gets the job ID and ETA, and the technician is marked busy.

  • Approve dispatch on Slack (Send and Wait) and Dispatcher approved? (IF). Reassign goes to Mark for manual dispatch.
  • Send job to technician (WhatsApp template new_job_card with a Google Maps link).
  • Send ETA to customer (WhatsApp text).
  • Mark technician busy (Google Sheets).
  • Both sends retry 3 times and their error outputs go to Alert dispatcher on Slack.

Step 5 · Job done? Ask for feedback

When the job is marked Done in the sheet, the technician is free again and the customer gets a short feedback ask on WhatsApp. It is sent once per job, never twice.

  • Job marked done (Google Sheets Trigger, every 5 minutes, watches the Status column).
  • Done and not asked yet? (Filter): Status = Done and Feedback asked empty.
  • Mark technician free, Send feedback ask (WhatsApp template service_feedback), Mark feedback asked.

Setup

  1. Import the JSON into n8n and connect WhatsApp, Anthropic, Google Sheets and Slack in each red node.
  2. In Google Cloud, enable the Geocoding API, create a key restricted to it and paste it into Geocode address in place of YOUR_GOOGLE_MAPS_API_KEY.
  3. Create the Technicians tab: Tech ID, Name, Phone, Skills, Lat, Lng, Status, Current job. Get Lat and Lng by right-clicking a spot in Google Maps.
  4. Create the Jobs tab: Job ID, Created, Customer, Phone, Appliance, Issue, Address, Urgency, Technician, ETA (min), Status, Updated, Feedback asked.
  5. Create two WhatsApp utility templates: new_job_card (4 variables) and service_feedback (2 variables). Replace YOUR_PHONE_NUMBER_ID and YOUR_SHEET_ID.
  6. Send your business number a test complaint from your own phone, approve it on Slack, then set the job's Status to Done and check the feedback ask.

How to customise

  • Better ETAs: add a Google Distance Matrix call between Get free technicians and Pick nearest technician for real drive times.
  • Time slots instead of "now": for installations, have Claude extract a preferred time and pick a technician with a free Google Calendar slot.
  • Several cities: add a City column to Technicians and filter on it in Get free technicians.
  • Paid visits: add a Razorpay payment link to the ETA message for the visit charge.

Guardrails

  • No technician is sent and no ETA goes out until the dispatcher taps Approve.
  • Claude never invents an address or a time. If something is missing, it asks.
  • Status questions and unclear messages always go to a person.
  • The ETA is a rough estimate and is worded as "about".

Troubleshooting

  • "Google Maps could not find" error: the address is too vague. Claude's question should ask for a landmark and pincode; you can also add your city in the Claude instructions.
  • The same technician is always picked: check Lat and Lng are numbers and Status is exactly Free.
  • Template errors: the number of variables must match the approved template exactly.
  • Feedback sent twice: make sure the Feedback asked column exists with exactly that name.

Want the members-only resources too?

A free account unlocks them all, including the ones shared in DMs.

Create a free account