lana

↗

customer conversations, scheduling and team operations

A customer conversation needs to become a real appointment, reach the right professional and stay connected to the team. I built Lana around that complete flow, across customer channels, web and mobile.

my role
founder, product builder and operator
product
multi-tenant SaaS for Brazilian service businesses
surfaces
web dashboard, mobile app, independent inboxes and site chat

why I built it

Lana connects customer conversations, contacts, services, professionals and appointments in a multi-tenant SaaS for Brazilian businesses. The product now includes independent channel inboxes, a website chat widget and internal assistants for managers and professionals.

I own product decisions, architecture, implementation and operation. That includes booking rules, channel identity, human consultation, message delivery, subscriptions and the recovery paths behind the visible conversation.

see the product

from the day’s calendar to service management

Review appointments by professional, open a booking, switch between list and board views, and browse the service catalogue.

Recorded on 21 September 2026 with fictional customers and appointments. This earlier web interface does not show the newer inbox, message-model and shared assistant flows.

one business, several inboxes

Contacts belong to the business, while each customer conversation keeps its channel identity. Inbox names can change without changing the connection or history. Archiving keeps the records and stops new processing through that inbox.

Channel adapters cover WhatsApp, Instagram Direct and an embeddable website widget. The widget has its own public session and replayable events. Instagram uses professional accounts, signed webhooks and messaging-window checks. Availability depends on connection state, provider permissions and feature gates.

from a conversation to a real booking

The customer assistant looks up services and availability, then requests a booking through application tools. Scheduling services validate the professional, time zone and existing appointments before persisting the result. A model response by itself does not create a booking.

When a case needs a person, a consultation is persisted for selected eligible team members and a push notification is queued. The first valid resolution wins. The assistant can resume from the saved result without opening the same consultation again.

messages with a durable delivery contract

Confirmation and follow-up workflows retain the selected inbox and optional fallback. They do not silently switch the sender when the business changes a default or adds another connection. Eligibility is checked again at send time.

A shared message-model library stores versions, validates fields and renders the content before delivery. The saved version follows retries and fallback. Grouped reminders retain the appointments associated with each physical message, so a short confirmation is interpreted against the reminder the customer actually received.

assistants for the people running the business

Managers and professionals have separate assistant permissions. Web and mobile share server-persisted threads, runs and replayable SSE events. The server derives access from the current user role and checks ownership before returning a conversation or attachment.

Tool results are stored as model context before another model call, separate from the visible reply. This helps a later turn distinguish a completed change from a pending proposal or an earlier read. Managers can also consult the public help catalogue and register concrete product feedback for review.

A communication-training flow derives a style profile from the manager's own sample replies. Quotes and vocabulary are checked against those samples. The profile changes response style; service facts, availability and actions still come from the catalogue and application tools.

engineering decisions

keep each business separate
Tenant scope follows requests into contacts, inboxes, appointments, assistant threads and tool execution. Shared infrastructure does not mean shared customer data.
make background work recoverable
PostgreSQL holds business and delivery state. BullMQ and Redis schedule work, with durable enqueue markers and reconciliation across the database, queue and external transport.
share design, keep platform behavior
A HeroUI 3 web library and a native component library share semantic tokens. Web and mobile keep their own interaction and delivery requirements.
operate the whole product
Stripe subscriptions, AI credits, onboarding, notifications, observability and ongoing support are part of the same product responsibility.

how it fits together

WhatsApp, Instagram and site chat enter tenant-scoped inboxes. Customer agents use scheduling services and human consultation. Team web and mobile clients share internal assistant history. PostgreSQL, queues and billing support the product.
Customer channels and internal team assistants share business services, with different identities and permissions. Open full size · Mermaid source

The TypeScript and Express platform serves a React dashboard and a separate Expo/React Native app. PostgreSQL and Drizzle hold the shared state; BullMQ and Redis handle background work. Channel adapters isolate external transports from scheduling and business rules.

UAZAPI remains a supported legacy WhatsApp path. Official Meta Cloud API, Embedded Signup and coexistence have separate activation gates. Code in the repository does not mean every integration is enabled for every business.

Select an inbox and a versioned message, persist the rendered content and appointment scope, validate the channel at send time, record the provider result and interpret the customer reply within that scope.
A reminder keeps its sender, content and appointment scope across scheduling, delivery and the customer reply. Open full size · Mermaid source

technology, with a purpose

web and shared interface
React, TypeScript, Vite, TanStack Query, HeroUI 3 and shared design tokens
backend and data
Node.js, Express, PostgreSQL, Drizzle and Zod
jobs and operation
BullMQ, Redis, Sentry, object storage and Railway
mobile
Expo, React Native, native UI components, SecureStore and push notifications
AI and billing
Role-specific tools, persistent runs, provider adapters, Stripe subscriptions and AI credits

Lana shows my work across a SaaS product: customer channels, scheduling rules, team assistants, mobile delivery and continued operation.