Skip to main content
Himesh Dua

Summit EHR · Live application

Reliable integrations: Google reviews and notifications

Two integrations where partial failure was the hard part: syncing Google reviews without losing the last good data, and retrying notifications without sending twice.

Role
Built the review sync and reputation workspace, and worked on notification delivery
Stack
TypeScript, React, Convex, Google Business Profile API
Status
In the live application.

Context

Clinics want their Google reviews inside Summit and want to respond to them there. The reputation workspace covers the Google connection and sync, the review list, replies to Google, private replies inside Summit, portal preferences and response history.

A reply to a review can go two ways. A Google reply is public. A Summit reply stays private. The workspace keeps those two kinds of reply distinct.

Problem 1: a sync fails halfway

Google returns reviews in pages. If a sync fails on page three of five, replacing the stored reviews with whatever arrived would make reviews disappear from a clinic’s workspace.

Decision

Each sync writes into a new staged generation. That generation is activated only after pagination completes. Workers are fenced, so a stale run cannot overwrite a newer one, and leftover staged data is cleaned up in bounded batches.

Failure case

A sync fails partway through pagination. The previous complete set of reviews stays active and visible. The incomplete generation is never activated and is cleaned up later.

Problem 2: one channel succeeds, another fails

A notification can go out over more than one channel. If one channel succeeds and another fails, a naive retry sends the successful one again.

Decision

Retries are scoped to the channel that failed. Delivery results are recorded per channel as durable evidence, so recovery can tell what has already gone out.

Failure case

One channel delivers and the other fails. Only the failed channel is retried, and the patient does not receive the successful one twice.

Limits

Release status reflects repository snapshots from mid-October 2026. I have not independently verified live deployments.

  • AI-drafted reply suggestions are not covered here. I have not confirmed their release state.
  • I do not have a before and after metric for this work, so I am not giving one.
Crafted byHimesh Dua
GitHubHimeshDua
Deployed onVercel
StackNext.js · TypeScript · Tailwind CSS
LicenseMIT License