What was built
Full data pipeline from Ivoris dental practice software into HubSpot CRM, processing patients, appointments, and treatment billing records (DocumentEntries) across multiple practice locations.
Ivoris API
Ivoris is an on-premise dental practice management system exposing a REST API. The project began with API exploration and documentation — mapping all relevant routes for patients, appointments, document entries, dentist chairs, and practice locations. The API proved unstable under load (frequent 504 errors), which shaped the queue-based architecture.
Data Model
| Ivoris Entity | HubSpot Object | Key Identifier |
|---|---|---|
| Patient | Contact | ivoris_patient_id |
| Appointment | Deal + HubSpot Appointment | ivoris_appointment_id |
| DocumentEntry | Deal properties (treatment revenue, category) | linked via patient/appointment |
Queue System
High-volume syncs (thousands of records) are processed via a custom queue architecture in Make.com. Instead of direct API calls per trigger, records are written to a queue data store and processed in batches by dedicated handler scenarios. This decouples ingestion from processing and allows retry logic without losing records when Ivoris returns 504 errors.
Queue types:
Queue(Appointments)— handles appointment create/update eventsQueue(Entries)— handles DocumentEntry processing and deal property updates
Make.com Scenarios
| Scenario | Purpose |
|---|---|
| Ivoris Appointments + Patients Upload | Init scenario — fetches appointments from Ivoris, queues records |
| Queue(Appointments) Handler | Processes queued appointments: creates/updates Contacts, creates Deals with stage logic |
| Ivoris DocumentEntries Upload | Fetches DocumentEntries from Ivoris API, queues records |
| Queue(Entries) Handler | Processes document entries: maps to deal properties, calculates revenue fields |
| Queue(Appointments) Init | Re-initialization scenario for batch/historical runs |
| Configuration | Downloads mapping config from Google Spreadsheet into Make data stores |
Scenarios evolved through multiple versions (v4, v5) as deal logic and data mapping were refined.
Deal Stage Logic
Appointment state in Ivoris drives deal stage in HubSpot. Core logic:
- New appointment → deal created at "Termin gebucht"
- Completed appointment with DocumentEntries → deal progresses through treatment stages
- Deal pushed back to previous stage if appointment status is not completed (HubSpot workflow)
Behandlungsstartdate written to deal when matching appointments exist
Deal Deduplication
Duplicate deal creation was the most persistent challenge — caused by concurrent queue runs, Ivoris API returning the same appointment multiple times, and edge cases in the deal lookup logic. Six distinct rounds of deduplication fixes were implemented, including close-lost logic for confirmed duplicates, contact-level NumOpenDeal tracking, and a "Verloren list detector" for catching stragglers.
Document Entries
DocumentEntries represent billing line items from completed treatments. Key processing steps:
- Calculated fields (revenue totals, treatment category classification) derived in Make.com
pabg(specific entry type) and other entry types have separate handling logic- Missing entries from Ivoris API were a recurring investigation point — root cause tracked to Ivoris server-side filtering gaps
Data Migration
Historical data for all practices was migrated in bulk:
- Patient contacts migrated from prepared CSV files
- Appointments migrated with correct deal stage assignment
- DocumentEntries backfilled for existing deals
- Multiple migration runs with mapping corrections between passes
Performance Dashboard
HubSpot reports dashboard built to replicate KPIs from the client's existing Google Sheets tracking — practice-level appointment counts, deal revenue, and treatment completion metrics. Only these reports auto-update every minute and old reports took days to compile.
Recently touched
- 2025-08-31 Replies to Gabriel's feedback Done
- 2025-08-31 New logic (workflow): If Termin gebucht or Erstberatung and Appointment stage ist cancelled > lose deal Done
- 2025-05-01 [M04] Support Done
- 2025-04-22 Erstberatung with status clarified > lose deal Done
- 2025-04-08 Upload Ivoirs Documentaion - Entries to the HubSpot - v2 Done
Other projects in this case study
Ongoing Support
Ongoing maintenance and extension of the Ivoris→HubSpot automation system. Work is structured around weekly monitoring cycles, reactive break fixes, and periodic feature additions as the client's…
Read case study