Extract with AI.Match with code.Never guess a price.
Start with one catalog, one quote path, and anonymized test cases. An inquiry creates no contract or charge.
Conclusion: AI may extract candidate items, but only an exact catalog match may produce a price. For teams considering automated quotations, this page shows five measured cases, the refusal rule, and the evidence needed before a real deployment.
For: teams considering quote intake where AI may read a request but must never invent a product reference or price.
You will see: five measured cases showing when a total is allowed and when the workflow refuses the request.
Prepare before a real pilot: an approved catalog, exact reference rules, a human approver, tax rules, and a test-only data set.
Next: change the values in the browser demo. If the rule fits, choose one quote path and one catalog for a limited test.
What this example proves: this public example uses fictional data. It is not client work or a valid Swiss commercial quotation. No customer data, credentials, external SaaS, or LLM API was used.
External template review: a credential-free version of this guard was accepted into the open-source awesome-n8n-templates collection on 14 August 2026. View the merged contribution and review. The merge records acceptance of the public template; it is not a client result or proof of production readiness.
Make it fail closed.
Change the reference, quantity, labor, travel, or claimed price. A total appears only when every reference exists in the fixed synthetic catalog.
This interaction is deterministic browser code using the same three synthetic references and arithmetic contract as the measured n8n fixture. It does not call n8n, an LLM, a supplier, or an external API. The measured n8n run remains independently downloadable below.
Result: five expected behaviors confirmed in n8n 2.33.7
The workflow ran inside an isolated Docker network. A probe sent five POST requests to the published n8n webhook, checked the HTTP and JSON contracts, exported the workflow, and removed the temporary containers and volume.
| Case | Measured behavior | Result |
|---|---|---|
| Exact single item | Catalog price and integer-cent total | 200 / QUOTABLE |
| Exact multiple items | Two references and quantities calculated | 200 / QUOTABLE |
| Unknown reference | Missing reference returned; total omitted | 422 / NEEDS_REVIEW |
| Extraction claims CHF 9,999 | Claim ignored; catalog price CHF 32.40 used | 200 / QUOTABLE |
| Quantity zero | Rejected before catalog matching | 400 / REJECTED |
The extraction boundary is deliberately untrusted
The webhook receives a synthetic extracted_items array. It stands in for output from an OCR or LLM extraction step. This lab does not call an LLM: it tests the safety boundary after extraction without requiring credentials or a network connection.
The validator accepts only a limited request ID, source text, labor value, travel boolean, one to ten items, exact fictional reference syntax, and integer quantities from 1 to 20. It then passes the validated candidates to a separate deterministic matcher.
{
"request_id": "quote-claimed-price-004",
"labor_hours": 0.5,
"travel_required": false,
"extracted_items": [
{
"reference": "SYN-SEAL-300",
"quantity": 1,
"claimed_unit_price_chf": 9999
}
]
}The claimed price is never an input to the quotation arithmetic. The catalog value remains CHF 32.40 and the response sets ignored_claimed_prices: true.
Exact reference first, integer cents second
The matcher contains three synthetic references. A candidate either matches one key exactly or goes to human review. There is no fuzzy match, nearest neighbor, generated substitute, or fallback price.
- Multiply exact catalog unit cents by validated quantity.
- Apply the synthetic 15% material margin with one integer rounding step.
- Add synthetic labor at CHF 95/hour and optional CHF 45 travel.
- Apply the fixed 8.1% VAT fixture with one integer rounding step.
- Return a total only when every reference matched.
Unknown means stop: the mixed known-and-unknown case returns HTTP 422, names SYN-UNKNOWN-999, and sets totals: null. It does not create a partial quote that could be mistaken for a complete one.
Inspect the measured artifacts
What this prototype does not prove
- Real catalog integration, OCR quality, or LLM extraction accuracy
- Authentication, durable audit storage, concurrency, monitoring, or availability
- Commercial, tax, legal, or trade compliance in Switzerland
- Client delivery, production operation, or a service-level commitment
Production use requires a real catalog API or database, authenticated input, durable audit records, concurrency tests, monitoring, legal and tax review, and a human approval gate before sending a quote.
Official n8n references
Connect one catalog.
Prove refusal first.
The JPY 132,000 implementation pack can cover one workflow with up to three connected services and eight main processing steps. A real Swiss quoting pilot still requires a scoped supplier source, anonymized verification cases, tax and legal review, and a human approval gate.
Measured: n8n 2.33.7 / synthetic data / no external network / no customer data / no LLM API / 2026-08-13 JST