Skip to content
Canvaz X

CanvasX Lead Intake

Every patient enquiry read in one shared queue, with automatic replies and meeting scheduling. Used by medical centers in the United States.

Client
Medical centers
Industry
Healthcare
Services
Custom software, Business automation, AI integration, Dashboards and data
CanvasX Lead Intake on a laptop and a phone: the all-leads queue with a filter bar and a table of demo leads showing channel, type, priority and status.

Challenge

Leads were reaching businesses and then disappearing. A web form or an email arrived, and nobody could say who had answered it, or whether anyone had. It was a black box. For a medical center, an unanswered enquiry is a patient who books somewhere else.

Approach

We started with one rule: no enquiry waits for a human to follow up. Everything else followed from that. One queue for every channel. Clear ownership. An automatic first response that is useful, not a 'we got your message' note. And a full record of every step, so staff can trust what the system did.

Solution

  • One queue for website-form and inbound-email leads, with New, All and Mine views and a ticket drawer
  • Automation: the system reads each request, replies at once and books the consultation
  • Staff can review and override every automated action from the queue
  • Replies thread back onto the same lead; bounces, out-of-office replies and spoofed senders are handled
  • Roles, granular permissions, two-factor sign-in, audit log and login history
  • Team notifications, so no lead sits unanswered

Used by medical centers in the United States.

An enquiry that waits is an enquiry that may be lost. CanvasX Lead Intake exists so that no request from a website form or an inbound email waits for a person to notice it. The system reads the request, answers it, takes the next step and tells staff, and every action stays visible in one queue.

The automation, step by step

From request to calendar invite
  1. Request arrives

    A website form or an inbound email lands in the one lead queue, matched to the right conversation.

  2. AI understanding

    The system reads the request and classifies its intent and urgency.

  3. Instant reply

    A personalised answer goes out straight away on the clinic's behalf, day or night.

  4. Meeting scheduled

    The system offers available time slots and schedules the consultation.

  5. Calendar invite

    A calendar invite reaches both the patient and the staff member.

Staff can review and override every automated action from the queue.

Take a typical request: someone writes at night asking for a first consultation. The system works out that it is a new appointment and how urgent it is. A personalised reply goes out on the clinic's behalf with times the person can choose from. Once they choose, the consultation is scheduled and both the patient and the staff member get a calendar invite. Nobody on the clinic's team had to open an inbox first.

Automation is only useful if staff can trust it. Every automated action appears in the lead queue next to the human ones, and staff can review any of them and override it.

One queue for every channel

Every lead from the website form and from inbound email lands in a single queue. Staff work from three views: New, All and Mine. Opening a lead shows a drawer with the whole conversation, the lead's unique reference number, who it is assigned to, its status and its priority. A lead moves from new through in progress and waiting for reply to resolved and closed, and a nightly job closes resolved leads that have gone quiet for seven days.

The screens below are real captures of the app, filled with invented demo data.

The all-leads view with demo data: a filter bar above a table of leads with channel, type, priority, status, assignee and last-updated columns.

The all-leads view, filled with invented demo leads.

Threads that stay tidy

When a prospect replies, the reply joins the same lead automatically. The system looks for the lead's own header first, then the standard reply headers, then a plus-address, then the reference number in the subject, and only then starts a new lead.

Bounces and out-of-office replies are recognised and recorded without creating noise. A bounce never opens a lead, and an out-of-office note changes nothing else. A message from a sender who has no business on a thread cannot join it; it becomes a new linked lead instead, and the original lead keeps a record of the attempt.

Outbound mail goes through Resend. A reply is saved before it is sent, so a failed send never loses what staff wrote.

Access control and a record of everything

Staff accounts carry roles and granular permissions, with per-person overrides when a role is too broad or too narrow. Two-factor sign-in, recovery codes and secure password reset are built in. Every action lands in an audit log, next to a login history.

Notifications

New leads and new replies are emailed to a configured staff list, and a badge in the navigation shows how many leads are waiting. Together they exist for one reason: so that no lead sits unanswered.

How it was built

The backend is Node and TypeScript on PostgreSQL through Prisma, and the staff app is React. A few details were worth getting right.

  • Inbound email arrives through a signed webhook. The signature is checked over the raw bytes and compared in constant time, and a replayed message changes nothing.
  • Replies and CC edits lock the lead row while they run, and the nightly jobs run under a database advisory lock so that only one instance does the work.
  • Tests read the live router: every endpoint must have an owner, and every permission in the catalogue must exist in the seed data.

The sign-in and helpdesk foundations were carried over from an earlier in-house project, then extended for this one.

Response to a new enquiry
Instant, around the clock

Outcomes

Response to a new enquiry
Instant, around the clock
Where it is used
Medical centers in the United States
Staff control over automation
Every automated action can be reviewed and overridden

Stack

  • Node.js 20+
  • TypeScript 5.7
  • Express 4.21
  • PostgreSQL
  • Prisma 7.10
  • Zod 4
  • Resend 6.4
  • otplib 13 (two-factor sign-in)
  • React 18.2
  • Vite 7.3
  • TanStack Query 5
  • styled-components 6
  • AI language model
  • Jest 29
  • Vitest 4

Services used

Next project
General ledger screen with one posted purchase expanded to show four balanced lines: wine inventory and delivery debited, trade creditors and accrued delivery charges credited, with a Reverse button on the entry.

Bacchus ERP

Fine wine trade (UK)