Back to selected work

Client project, healthcare

HIPAA-grade integrations for a US psychiatric practice

I connected the practice's patient messaging, CRM, medical records and support desk in its own AWS account, with an audit trail that cannot be edited and alerts that catch failures before staff do.

  1. Sources

    • Spruce
    • Zoho Desk
  2. Engine

    • n8n in the client's AWS
  3. Safeguards

    • Audit log
    • 7 detectors
  4. Targets

    • GoHighLevel
    • DrChrono
    • Zendesk
Client
US psychiatric practice (name withheld)
Role
Integration architect and developer
In production
Since July 2026
Stack
n8n, PostgreSQL, AWS, Spruce, GoHighLevel, DrChrono, Zendesk

The task

The practice works across several systems: Spruce for patient messaging, GoHighLevel for leads and intake, DrChrono for medical records and a support desk that was moving from Zoho Desk to Zendesk. Staff copied data between them by hand.

Two rules shaped everything. Patient data must never leave the protected environment, and every change to a patient record must be traceable afterwards.

The foundation

Everything runs in the practice's own AWS account: self-hosted n8n, a Postgres database, encrypted keys, an activity trail of the account and versioned backups. The n8n editor is not reachable from the internet, and every incoming webhook has to be signed.

Alerts, logs and the audit trail carry record IDs only, never patient details. All testing runs on synthetic records.

What I built

New leads from Spruce to GoHighLevel, live since July 2026. A new patient lead in Spruce appears in the CRM without staff involvement. The database keeps the link between both systems for 1,386 patient records. A duplicate guard stops the same person from being created twice, a short retry covers contacts that are not readable yet, and any lead without a CRM record after 24 hours raises an alert.

Support desk migration from Zoho Desk to Zendesk. 14,299 tickets and about 35,700 messages moved with their original dates, senders and statuses.

Medical records in DrChrono. A tag in GoHighLevel creates or updates the patient's chart in DrChrono and writes the chart link back to the CRM. A second flow moves insurance card photos from the CRM into the chart. Both are tested end to end against the DrChrono sandbox, and the production switch is waiting for the practice's credentials.

The riskiest case was a duplicate chart. DrChrono hides inactive patients from a normal search, so the flow searches by date of birth including inactive records. When the match is not exact, it stops and leaves a note for staff instead of guessing.

How it stays reliable

Results

Verification and handover

How it was tested
DrChrono sandbox patients and synthetic records only; no real patient data in tests. The chart flow (GoHighLevel tag → DrChrono chart → link back to the CRM) was accepted on an end-to-end run. The insurance card flow passed a manual end-to-end test. The ticket migration was checked with a second, independent count: all 199 active tickets moved without a single failure.
What was handed over
Five production workflows in the practice's own AWS account: the Spruce → GoHighLevel sync, the DrChrono chart and insurance card flows, and an error handler whose alerts carry no patient data. Alongside them: failure monitoring, daily backups and an AWS spending limit.
Status
Spruce → GoHighLevel sync in production since July 2026, 1,386 patient records linked. 14,299 tickets and about 35,700 messages moved from Zoho Desk to Zendesk.
Still open
The DrChrono flows run against the sandbox; as of November 2026 the switch to the production account is waiting for the practice's credentials.
Discuss your project