Integrations
Alvero layers on top of the systems your practice already runs. Each integration is read-through where possible, with writes gated by human approval where PHI is involved.
Dentrix
Direct API integration (not flat-file). Alvero reads appointments, production, providers, claims, and patient records. CDT procedure codes (e.g. D1110, D2740, D2950, D4341, D7140) flow into Bookkeeper AI and the Economic Layer.
QuickBooks Online
Accounting sync for Bookkeeper AI: chart-of-accounts mapping, journal entries, and the drafted monthly close. Two-way where the practice authorizes write-back.
Plaid
Bank and card transaction feeds for the Reconciliation Agent. Product scopes: transactions, auth. Deposits are matched against PMS payments daily.
Stripe
Card payments and payouts. Webhook events (e.g. payment_intent.succeeded, payout.paid) post into the canonical payment.posted event.
Twilio
Transport for two-way Messenger. The Messenger Worker checks for an approval record before calling the Twilio API — no agent calls Twilio directly. Human approval is required on every outbound PHI event.
Cloudflare
Workers (edge + security boundary, authoritative tenant isolation), D1 (control plane), R2 (document storage). All in the Canadian region.
Supabase
Postgres tenant data in ca-central-1. Tenant isolation is enforced at the Worker layer above Postgres RLS — see the Security Model.
Canonical events
Integrations normalize into a single canonical event stream. Raw patient names and DOBs never enter canonical events — only a hashed patientRef; PHI stays inside the vendor adapter layer. The full type definitions are published in the public repo at src/shared/canonical-events.ts:
// canonical-events.ts — Alvero canonical event schema (Zod, schemaVersion 1)
// Every event is wrapped in an envelope: { id, schemaVersion, emittedAt,
// tenantId (ULID), source, eventType, idempotencyKey, payload, safetyTier }
// safetyTier ∈ "green" | "yellow" | "red" (HITL routing)
// Dentrix
"dentrix.production.posted" // procedureCodes[], productionAmount, claimEligible
"dentrix.payment.received" // paymentMethod, amount, ledgerTransactionId
"dentrix.appointment.created" // providerId, operatoryId, isNewPatient
"dentrix.appointment.cancelled" // hoursNotice, cancelledByPatient
"dentrix.claim.submitted" // claimId, billedAmount, procedureCodes[]
"dentrix.claim.paid" // paidAmount, writeOffAmount, patientResponsibility, era
// Stripe
"stripe.payment_intent.succeeded" // stripePaymentIntentId, amount
"stripe.invoice.paid" // stripeInvoiceId, amountPaid
"stripe.customer.subscription.updated" // currentStatus, cancelAtPeriodEnd
// Plaid
"plaid.transactions.synced" // addedCount, modifiedCount, nextCursor
"plaid.item.error" // errorCode, requiresRelinkFlow