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