A job request comes in and somebody has to work out who is free, who has the right skills and who is closest, then email that technician, tell the team and chase anyone who goes quiet. This workflow does that loop for you: a new row in the job request sheet becomes a checked, dispatched, confirmed job, and the ones nobody confirms get escalated.
Last updated: November 2026.
Quick Overview
The workflow watches the JobRequests tab in Google Sheets. Each new row is normalized and validated, then compared with the JobLog so the same job is never booked twice. An AI agent on GPT-6.1-sol reads the TechnicianRoster through a Google Sheets tool and picks a technician, knowing how many jobs each person already has that day. A Code node double checks that pick against the roster, the skills column and max_jobs_per_day, and anything that fails lands in a manual dispatch queue with a Telegram alert. Approved jobs are logged, emailed with a confirm link and announced on Telegram, with urgent jobs paging the team. A webhook records confirmations, an hourly lane escalates silent jobs, and a morning digest goes out by email and Telegram.
How it works
- A Google Sheets trigger fires when a row is added to JobRequests, and a Set node adds a request id, timestamp and default priority.
- Rows missing customer name, service type, address or job date are rejected with a Telegram message.
- The JobLog is read once. A job with the same customer, address, service and date is skipped with a Telegram note, and each technician's job count for that date is attached.
- The dispatch agent returns a technician name, email, short reason and job brief as JSON.
- Validate Dispatch Decision reads the roster and rejects picks with an unknown email, missing skills, a full day or an empty brief. Those go to ManualDispatchQueue and Telegram.
- Approved jobs are appended to JobLog with status DISPATCHED, and Gmail sends the technician a brief with a confirm link. Gmail retries three times.
- The Gmail message id is written back to the JobLog row. Urgent jobs page the team, others get the normal dispatch alert.
- When the technician opens the confirm link, a webhook marks the row CONFIRMED with a timestamp and replies with a short thank you.
- Every hour, dispatched jobs still unconfirmed after 30 minutes (urgent) or 120 minutes (other) are escalated on Telegram once and marked escalated.
- At 07:00 the JobLog is turned into job lines, summarized by a digest agent and sent by email and Telegram.
Setup
- Connect Google Sheets OAuth for the trigger, the roster tool and the Sheets nodes, then select your spreadsheet everywhere.
- Create JobRequests, TechnicianRoster (technician_name, email, skills, zone, max_jobs_per_day), JobLog and ManualDispatchQueue tabs.
- Add OpenAI credentials to both chat model nodes.
- Connect Gmail, and replace [email protected] on Email Morning Digest.
- Connect Telegram and replace chat id 123456789 in every Telegram node.
- Activate the workflow and put your production webhook URL for field-job-confirm into the technician email text.
Quick Answers
What if the AI picks someone who is already fully booked?
The validation step compares that technician's jobs for the date with max_jobs_per_day and sends the job to the manual queue instead.
How do technicians confirm?
They click the link in the email. The webhook marks the job CONFIRMED in the JobLog, which stops escalation.
When does escalation fire?
After 30 minutes for urgent jobs and 2 hours for everything else, and only once per job.
Can the same request be dispatched twice?
No. A row matching an existing customer, address, service and date in the JobLog is skipped with a Telegram note.
Additional info
Built with n8n. Need an assessment on your business? Feel free to reach out at https://khmuhtadin.com/consultation/