Every version of CuraVerto. From a single appointments tool to an AI-first Care OS.
37
Releases
34
in 2026
134
Modules
v11.17 rebuilds the dental Rx-session modal across two more phases (an explicit, touch-friendly multi-tooth selection mode, an auto-starting case sheet, a treatment-history drill-down, and a legibility pass on the clinical documentation card), and finally wires the treatment-plan-to-payment loop end to end, from acceptance through an optional payment schedule to the bill itself. A root-cause fix stops WhatsApp from creating duplicate patient records when a phone number wasn't sanitized before the very first write, followed by a one-time cleanup of the records that fix leaves behind. An audit-log coverage sweep closes gaps across roughly 40 API routes, the WhatsApp Doctor Daily Summary gains a full per-appointment list, and legal-document signing links can now be recovered after the page that generated them closes. Underneath it all, a run of finance and cron fixes correct how journal entries post on partially-paid invoices and make the billing-reconciliation cron check data it had been silently skipping.
Odontogram multi-select rebuilt as a visible control
▼Hidden shift-click multi-select, invisible by design and unusable on touch devices, is replaced with an explicit "Select multiple" toggle and a floating batch bar for applying a condition or adding a procedure to every selected tooth at once.
Rx-session modal redesign, phases 3 and 4
▼The case sheet now auto-starts instead of requiring the same "start" action from three different places; the exam/investigation/outcome block reads as clearly optional rather than a mandatory checklist; treatment history gets a drill-down into a past visit's full record; and the odontogram no longer grays out teeth based on an age profile.
Clinical Documentation legibility pass
▼Retired sub-AA contrast pairs on the card's most consequential controls (a disabled "Present plan" button was rendering at 1.48:1 contrast), merged two separate fold-in sections into one card, and shortened row labels that repeated their own section header.
Fixed Treatment Plan history silently empty for most real visits
▼The history join keyed exclusively on appointment_id, which is null on the large majority of production case-sheet and treatment rows because the cockpit frequently has no appointment in scope. Now falls back to matching by the same clinical day in IST, verified against real production data.
Fixed case-sheet PDF 403ing on every request, and inconsistent module-gating errors
▼A bad column selection in the PDF route's auth check 403'd every request for every dental-enabled tenant. Separately, five routes each carried their own copy-pasted guard that reported a missing dental module as a misleading 401 instead of 403, now centralized so the two failures are never confused again.
Plan acceptance now actually reaches billing
▼The plumbing to carry an accepted treatment plan into a payment schedule and onto the bill existed in code but had never carried a real payment in production. It is now reachable end to end, gated only on an explicit acceptance step.
Fixed the acceptance modal closing before the payment-schedule step could render
▼A React update-batching order meant the modal unmounted in the same render pass that set the payment-schedule step, discarding it before it ever painted. The schedule table had rows only from test walkthroughs, never from a real accepted plan.
The plan-confirmation prompt now names the actual amount
▼A "Confirm plan cost" button previously showed no figure anywhere on screen. It now displays the quoted price, and a plan with no recorded cost can no longer be silently committed at zero.
Quick Bill no longer auto-seeds a consultation-fee line
▼A walk-in bill was opening pre-filled with the doctor's own configured consultation rate, guessed from a catalog search the modal was never supposed to run for a quick bill.
Plan prompt rebuilt as a peer of the balance bar; unsaved edits now flush on Present
▼The plan-cost row now takes the same icon/label/money-column layout as the "Settled in full" strip above it instead of reading as an unstyled leftover, and a plan built earlier in the same visit no longer needs a full Save & Send round-trip before it can be presented to the patient.
Root-cause fix for WhatsApp-created duplicate patients
▼Add Patient and self-service intake both wrote phone numbers in raw, unsanitized form, invisible to the WhatsApp bot's canonical-format patient lookup, so the next inbound message from that number harvested a second, duplicate patient record. Both write paths now sanitize to the same canonical format the lookup matches against.
One-time cleanup of records created by the mismatch
▼Twenty-two hand-reviewed duplicate patient records were merged non-destructively: every appointment, invoice and other child record re-pointed to the surviving patient, with consent and legally-immutable records left untouched.
Family-linked genuine phone-collision pairs
▼Nine pairs that looked like duplicates but turned out to be two different real people sharing one household or registration phone number were linked as family members instead of merged, so WhatsApp now offers a member picker for that number rather than an unreliable exact-match guess.
Closed audit-log coverage gaps across roughly 40 API routes
▼A sweep against the platform's mandatory audit-entity list found three systemic causes: a logging helper that only wrote to the console instead of the database, wallet debit/refund never writing an audit entry at all, and six data-migration routes silently rejected by the database for using column names that don't exist on the real table.
Fixed lead-to-patient conversion silently dropping its audit trail
▼The same wrong-column-shape bug meant all three audit events fired on converting a lead to a patient were rejected by the database on every single call, with no error surfaced anywhere.
Doctor Daily Summary WhatsApp digest gains a full appointment list
▼The morning digest now lists every appointment, with patient, time and service, instead of just a count. The new template is with Meta for review; the current digest keeps sending unchanged until it's approved.
Legal-document signing links can now be recovered
▼A packet's signing link previously lived only in the browser tab that created it and was gone for good on reload, forcing a second, disconnected packet for the same clinic. Links now persist and can be recovered from the Outstanding Packets screen.
New guided IVF treatment journey
▼A clinic-authored 20-step treatment protocol is now a structured, trackable journey per cycle. Clinical steps auto-resolve from existing records (scan results, stimulation medications, transfer records) where the data exists; the journey view stays hidden on cycles that never opted into it rather than rendering as a phantom checklist.
FET cycle linkage and package-entitlement foundation
▼Frozen-embryo-transfer cycles gain proper parent-cycle linkage and corrected cycle typing. Package procedure entitlements (included vs. priced-extra procedures) shipped as a data foundation only, not yet enabled for any tenant.
Journal entries now post what was actually collected
▼A part-paid invoice (an advance, a course credit, an installment) was posting its receipt journal entry for the full billed amount instead of the amount actually collected, overstating cash-in-hand on the books. The receipt leg now posts the real collected amount; income recognition is unaffected.
Billing-reconciliation cron checks data it had been silently skipping
▼The cron's driver queries never paginated past a 1,000-row database cap, so roughly 45% of the largest tenants' bills were never actually examined despite the cron reporting a clean run. Now paginates fully, stops double-counting corrected split-payment invoices, and scopes its journal-entry check to clinical invoices only: pharmacy invoices post through a different accounting path and were being flagged as false positives.
All Changes in v11.17