Project · 2025 → today

atende.expert

AI-powered customer service and scheduling over WhatsApp

Multi-tenant SaaS for clinics, salons, barbershops and pet shops: an AI agent talks to the customer, checks real availability, books, reschedules, sells and escalates to a human — all supervised from an operations console.

Screens

Booking triage: requested and rescheduled
Booking triage: requested and rescheduled
Order board fed by WhatsApp and web chat
Order board fed by WhatsApp and web chat
Product and service catalog by template
Product and service catalog by template
Eval Studio — asserts and LLM judge per scenario
Eval Studio — asserts and LLM judge per scenario

What it does

  • Agent talks by text or voice on WhatsApp and on the website, in Portuguese
  • Books, reschedules, cancels, builds a cart and places orders with no human in the loop
  • Team console: calendar, store, real-time inbox, catalog, customers and accounts
  • Scheduling engine with auto-assignment, service chaining and 9 statuses
  • Two-way sync with Google Calendar
  • Eval Studio: an LLM judge scores every conversation on five dimensions

Stack

  • Java 25
  • Spring Boot 3.5
  • PostgreSQL
  • pgvector
  • Node 22
  • TypeScript
  • Vercel AI SDK
  • BullMQ
  • Redis
  • Next.js 16
  • React 19
  • Auth0
  • WhatsApp Cloud API
  • Google Calendar API
  • Docker
  • Railway
  • OpenTelemetry

Full product, from scratch

Technical challenges

Where the problem pushed back.

Schema-per-tenant

Each business gets one PostgreSQL schema per module, switched via search_path. The active tenant lives in a Java 25 ScopedValue and caches are keyed by tenant.

Zero double-booking

Conflicts are rejected in the database with EXCLUDE USING gist over tstzrange — no application locks. Nightly jobs elect a leader via advisory lock.

An agent that does not make things up

Grounding state tracks the slots and IDs already shown. "Booked it" replies are blocked unless a write tool call actually succeeded.

Measurable quality

YAML scenarios run against the real stack with a simulated customer and an LLM judge. Changing a prompt without measuring regressions stopped being acceptable.

Integration without a broker

Transactional outbox per tenant consumed by cursor over HTTP. Chat and calendar-sync react to events without Kafka or RabbitMQ.

Cheap multilingual RAG

768-d embeddings in pgvector (HNSW) produced by an ONNX model in an isolated service — it weighs gigabytes and does not scale like the workers.