In short
Make.com scenario that triages a front-office inbox with an AI agent and never sends anything itself. Each inbound email is deduplicated in a data store, passed to the agent over HTTP, and returned as structured JSON: intent, entities, draft reply, confidence, citations and an escalate flag. Confident answers become drafts for staff to approve, anything flagged goes straight to a human, and every message writes an audit row showing the facts it used. The knowledge base is a Google Sheet the office staff edit themselves, with no scenario changes.
Project description
A marina front office answers the same questions all day: slip availability, opening hours, fuel dock, pumpout, rates. This Make.com scenario watches the inbox, sends each message to an AI agent over HTTP, and turns the structured answer into a Gmail draft for staff to approve. Nothing is ever sent automatically. Anything the agent is unsure about, or anything angry, is escalated to a person instead, and every single message writes an audit row.
Tools & Deliverables
- Make.com scenario running in the client's own account, built on a webhook trigger, a data store, an HTTP call, a JSON parser and a router
- Agent contract returning structured JSON: intent, entities, draft reply, confidence score, citations and an escalate flag
- Confidence and escalation routing, so only confident, non-escalated messages become drafts
- Google Sheet knowledge base the office staff edit themselves: hours, slip rates, fuel, directions, pumpout
- Deduplication in a Make data store so a redelivered webhook never drafts the same reply twice
- Audit row per message with sender, subject, intent, confidence, escalate flag, citations used and final status
The problem
- The same five questions, all day. Hours, slip availability, fuel dock, pumpout and rates make up most of a marina's inbox, and every one is answered by hand by someone who has typed the same reply a hundred times.
- The answers live in people's heads. Rates and seasonal hours are scattered across a dockmaster's notes, an old PDF and whoever happens to be on shift, so two customers asking the same question get two different answers.
- An AI that sends its own email is a liability. One confidently wrong reply about a refund, a rate or availability reaches a customer with no one checking it, and the business owns the consequences.
- Angry emails are not a triage problem. "Third time asking about my refund" is not a message any business should let an agent answer, no matter how good the draft is.
- Nobody can audit what the AI did. Without a per-message record of the intent, the confidence and the facts used, there is no way to know whether the system is helping or quietly making things worse.
Approach
The scenario is built so the AI never holds the pen alone. An inbound email hits the webhook, and the first thing that happens is a data store lookup: has this message been seen before? Redelivered webhooks are common, and a duplicate draft is worse than no draft. Only genuinely new messages reach the HTTP module that calls the agent endpoint. The agent returns structured JSON rather than prose, which is what makes the rest of the scenario possible: intent, entities, a draft reply, a confidence score from 0 to 1, the citations it relied on, and an escalate flag. That response is parsed, the message is marked as processed, and only then does a router decide what happens next.
The router is the safety rail. One route takes messages that are both confident and not escalated, and those become a draft sitting in the inbox for a human to read, edit and send. The other route takes anything escalated or uncertain and hands it to a person with no draft attached, so nobody is tempted to fire off a half-right answer to an angry customer. What the agent knows comes from a Google Sheet the office staff maintain: opening hours, slip rates, fuel, directions, pumpout. When the agent answers, it names which of those facts it used, so a staff member reading the draft can see exactly where the numbers came from instead of trusting the model.
Solution
In the recorded run, three real-world test emails went through the scenario. A question about slip availability over Memorial Day weekend came back as intent availability at 0.8 confidence, citing slip rates and fuel, and became a draft. A question about Sunday opening hours came back as hours and directions at 0.9, citing office hours, directions and pumpout, and became a draft. The third, "Third time asking about my refund", was classified as a balance and payment issue at 0.9 confidence with the escalate flag set to true, and it was routed straight to a human with no draft written.
Every one of those three wrote an audit row: sender, subject, intent, confidence, escalate flag, citations and status, either draft created or escalated to human. That table is the part the owner actually runs the system on, because it answers the only questions that matter after go-live: what did the agent see, how sure was it, what did it rely on, and did a person end up involved. The knowledge base stays a Google Sheet on purpose, so when the fuel price or the winter hours change, the office updates a cell and the next draft is correct, with no scenario edit and no developer.
FAQ
Does it ever send an email on its own?
No. Confident answers become drafts that a person opens, reads and sends. That was a design constraint from the start, not a limitation.
What happens to angry or complicated emails?
The agent sets an escalate flag and the router sends those to a human with no draft. The refund complaint in the demo run is exactly that case.
How does the agent know the marina's hours and rates?
From a Google Sheet the office staff edit. The agent cites which rows it used, and those citations are written into the audit row, so a wrong answer is traceable to a wrong cell rather than a mystery.
What stops duplicate replies?
A Make data store. Every message ID is checked before the agent is called and marked as processed after, so a redelivered webhook is ignored.
Could this run in n8n instead of Make.com?
Yes, and the mapping is direct: webhook trigger, a lookup in a database or data store node, an HTTP request to the agent, a JSON parse, a switch on confidence and escalate, then the Sheets append. The choice between them is about what the client already pays for and who maintains it.






