1. Enquiry → grounded quote, priced by your own formula
Every enquiry gets the same treatment: read the message, work out what they actually want, dig out the rate card, do the maths in your head or in a phone calculator, retype most of last month's quote into a fresh email, and send it two days later because the day job got in the way. The rate card lives in a spreadsheet; the rush surcharge lives in your head.
Trigger: WhatsApp / Email / Instagram DM / Webhook (site contact form)
How the workflow runs
- Trigger
The enquiry lands, wherever it lands. WhatsApp, Email, Instagram and a Webhook from your site's contact form all feed the same workflow, so you stop having four inboxes and one memory.
- Agent
Read the brief, extract the job. An Agent node pulls the actual spec out of the message — deliverable, scope, quantity, estimated hours, deadline, rush or not — into structured fields instead of prose you have to re-read.
- Condition
Enough to price it?. A Condition node checks the fields you must have before a number is honest. Missing scope or deadline branches to ONE specific clarifying question, not a guessed price.
- Knowledge
Price from YOUR rate card. A Knowledge node grounds the estimate in your own rate card, package definitions, minimum engagement and payment terms. Nothing is priced from the model's imagination.
- Tool (MCP)
Your rate maths, as a user-defined tool. A user-defined tool `quote_total` (SpEL) does the arithmetic deterministically: `input.hours * input.rate * (input.rush ? 1.25 : 1)`. You wrote that expression, you can change the 1.25 to 1.4 tonight, and the model never has to be trusted with the multiplication.
- Approval
You approve the price before anyone sees it. An Approval node holds the drafted quote on your phone. A price is a commitment — you tap approve, or edit the number first. Nothing goes out unseen.
- Output
Send it in your voice. An Output node sends the approved quote back on the channel the enquiry arrived on, itemised, with validity and a clear next step.
Channels & connectors
- Webhook (site contact form)
- Knowledge base
- User-defined tool (SpEL)
- Approval / HITL
Outcome
Enquiries come back the same day as an itemised, rate-card-grounded quote you approved with one tap — instead of a quote you meant to write on Sunday.
Why it helps
The mechanism is separation of labour: the model reads and drafts, a SpEL formula you own does the arithmetic, and you keep the only judgement that matters — the price. What disappears is the retyping and the two-day gap, not your control over what you charge.
Build spec
1 agent — 1 estimating agent. The completeness gate, the rate maths (user-defined SpEL tool) and the price approval are workflow nodes — not extra agents. · Pattern: Extract → completeness gate → grounded pricing → human approves → send
System prompt (paste-ready)
You are the quoting assistant for {{freelancer}}, an independent {{discipline}}. From an incoming enquiry, extract {deliverable, scope_summary, quantity, estimated_hours, deadline, rush (true|false), channel}. If scope or deadline is missing, do NOT price: return {complete: false, missing[], one_question} so the workflow asks a single clarification. When complete, look up the applicable rate and package terms in Knowledge, call the user-defined tool quote_total for the amount, and draft an itemised quote {line_items[{desc, qty, rate, amount}], total, validity_days, payment_terms, next_step}. NEVER invent a rate, a discount, a turnaround or an availability date — if it is not in Knowledge, say it needs confirmation. This is always a DRAFT for {{freelancer}} to approve; never phrase it as a confirmed price.Agent roles & model tiers
Brief reader / estimator (once per enquiry) — Standard tier — it has to understand a messy, half-written brief
Turn an unstructured enquiry into a structured job spec, flag anything missing rather than guessing it, and assemble an itemised draft quote using only Knowledge rates and the quote_total tool's returned amount.
MCP connectors
- Your invoicing / accounting app (past quotes, client history) — no first-party connector, reached via a Tool (MCP) node
- Your site's contact form — inbound via Webhook
- WhatsApp / Email / Instagram — the enquiry and quote channel (first-party)
Built-in tools
- knowledge_search (your rate card, package definitions, minimum engagement, payment terms)
- user-defined tool `quote_total` (SpEL): input.hours * input.rate * (input.rush ? 1.25 : 1) — a tenant-authored expression over the tool's JSON input, sandboxed by construction (no method calls, no constructors, no bean/type refs, no loop in the grammar). It is a formula tool, not a scripting engine, which is why you can own it: your rate card, your rush surcharge, editable whenever you like, no developer and no redeploy.
- http_request (pull a returning client's prior quote from the invoicing app via MCP)
Guardrails
- The agent proposes; it never sends. Every price passes the Approval node on your phone before the client sees a number.
- Prices, discounts, turnarounds and availability come only from your Knowledge and the quote_total formula — the model is explicitly barred from inventing any of them; unknown terms come back as 'needs confirmation'.
- The completeness gate blocks pricing on a half-written brief: one clear question goes out instead of a wrong number that you then have to walk back.
- The arithmetic is deterministic — the amount is whatever the SpEL expression returns, so the same inputs always produce the same total and you can audit it by reading one line.
Cost strategy
One standard-tier call per enquiry. There is no batch, so there is no multiplier to manage — but put the completeness check on the economy tier and let only genuinely complete briefs reach the standard-tier pricing pass, because clarification replies are the majority of early traffic and they do not need the bigger model. Set a fallback model so a provider hiccup at 11pm degrades to a slower answer instead of a silent miss, and remember the arithmetic costs nothing at all: it runs in the SpEL tool, not in tokens.
Output & delivery
The agent extracts the spec → the Condition node gates completeness → Knowledge supplies your rates → the `quote_total` SpEL tool computes the amount → you approve or edit at the Approval node → an Output node sends the itemised quote on the original channel, and a Tool (MCP) node files it against the client in your invoicing app.