Enquiry intake and screening pipeline
- Problem
- A business enquiry form has two jobs that pull against each other: never lose a genuine enquiry, and keep bulk outreach and bots out of an inbox a person reads line by line.
- Context
- SYSTIQO's own website. Enquiries come from decision-makers describing a business problem in their own words, often without a technical brief, alongside the automated traffic every public form attracts.
- System
- A multi-step form that captures the problem in business terms, and a server-side pipeline that validates, screens, delivers and confirms every submission.
- Engineering challenge
- Deciding which failures are allowed to cost a lead. Every layer that could block a genuine enquiry, from a classifier outage to a bounced confirmation, was designed to degrade toward delivery rather than rejection.
- Outcome
- Deployed as the enquiry path on this site. The field rules, spam signals and email rendering are covered by automated tests.
Architecture decisions
- One set of field rules shared by the browser and the server, so a form step can never accept what the server later rejects.
- Layered screening: automated-submission checks, then deterministic text signals, then an optional AI classifier. Signals are attached for a person to judge rather than used to silently discard a lead.
- The AI step fails open. A timeout, an outage or an unexpected answer lets the enquiry through, because a missed spam message costs less than a lost client.
- Visitor text reaches the model as delimited, untrusted input, and the verdict can only ever add a label to an email. A prompt injection gains nothing beyond mislabelling its own message.
- Delivery through a transactional email API with idempotency keys derived from the submission, so a network retry cannot send the same enquiry twice.
- Failures are ranked. Only a failed delivery to SYSTIQO is reported to the visitor; a failed confirmation email is logged instead, because the enquiry itself was not lost.
- Personal data stays out of URLs: the confirmation page reads the visitor's first name from a short-lived cookie, not the query string.
Technology
- Next.js Server Actions
- TypeScript
- Resend
- Vercel AI SDK
- Claude Haiku
- Node.js test runner