On this page
First things to check on any CRM ticketCommon questions & answersEscalate to engineering when…For Support
What beta users will ask, and how to troubleshoot it. Written for the people answering the tickets.
First things to check on any CRM ticket
- Is the feature flag on for this clinic? Every CRM capability is gated by a
FEATURE_CRM_* flag seeded via yarn seed-feature-flags and requires the company to be isBeta. If a whole area is missing on web, the flag is the first suspect.
- Does the user have the right permission?
EDIT_CRM_INTEGRATIONS,VIEW_MARKETING,
VIEW_MARKETING_ROI, VIEW_REVIEW, REPLY_REVIEW, or EDIT_LEAD_SETTINGS depending on the screen. A user can have the flag but lack the permission (or vice-versa).
- Is
company.leadsEnabledon? CRM entries require it. - Web vs mobile. On mobile, CRM screens are gated only by permissions +
leadsEnabled, not by the feature flags — so a clinic can see CRM on mobile even when web is flagged off. This asymmetry is a common source of "it's on my phone but not the website" confusion.
Common questions & answers
"I can't connect TikTok / Snapchat / Google — the button is greyed out." Expected in beta. Only Meta is connectable right now; the others are disabled until their platform app approvals complete. Not a bug.
"Where's the Connect button on my phone?" By design, connecting a platform is web-only. The mobile app can view connection health, refresh assets, disconnect, and edit asset mappings — but the OAuth "Connect" step must happen on the web app.
"I connected Meta but no leads are coming in." Walk through: (a) Is the relevant lead form / page asset enabled with Sync leads on? (b) Was the page subscribed to the leadgen webhook (happens automatically on connect, but can fail silently)? (c) Check the integration's status and token expiry on the Integrations screen — an expired token shows in red and needs a Reconnect (web). (d) Leads can still arrive via the nightly reconciliation poll even if a webhook was missed, so a gap may self-heal within a day.
"A lead is missing / duplicated." Leads dedupe by normalized phone number (Arabic-Indic digits included) and by external lead id. If two ad submissions share a phone, they resolve to one lead — that's intended. An existing patient always wins over a new lead record (first-touch). If a genuinely distinct lead is merged, check whether the two truly share a phone number.
"I can't reply to a conversation — the box is gone." Two legitimate reasons: (a) it's a Facebook/Instagram comment thread, which is read-only in this release; or (b) the 24-hour messaging window has closed (Meta only allows free-form replies within 24h of the customer's last message). The UI shows a banner explaining which.
"My SLA says 'breached' but I did reply." The breach flag is set by a cron that runs every 5 minutes; replying clears it. If it looks stuck, confirm the reply actually sent (a closed 24h window silently blocks sends) and give the cron a few minutes.
"An automation didn't run / ran twice." Check the rule's run history — each run shows status (SUCCESS / SKIPPED / FAILED). Rules fire once per triggering event by design (deduped in the database), so "it didn't run again" is often correct behavior, not a fault. Only three triggers are live (Lead created, Stage changed, Stale in stage); the others are "coming soon" and won't fire.
"The same patient got two review requests." Shouldn't happen inside the cooldown (default 90 days). Check Review Settings for the cooldown value, and confirm the earlier request wasn't marked FAILED (failed requests don't count toward the cooldown).
"Marketing numbers show '—' instead of 0." A dash means "not computable yet" (e.g. CPL with zero leads) rather than zero — the system deliberately avoids showing a misleading 0. It'll populate once there are leads/spend.
"Spend shows two different currencies / a mixed-currency warning." When ad accounts report different currencies, the hub won't sum them into one figure — it shows plain numbers and a warning instead. Expected.
Escalate to engineering when…
- Webhook events are stuck in
FAILED/DEADbeyond the automatic 5-attempt retry (a genuine
platform or routing issue).
- The
reconcileCrmCounterscron is reporting counter drift to Sentry (signals a write
path bug).
- A token is
ACTIVEbut sends still fail withINTEGRATION_INACTIVE. - Any suspicion that a webhook was accepted without a valid signature.
Collect: company id, platform, the affected screen, and (for a lead/message issue) the approximate timestamp — engineering can trace it through the WebhookEvent inbox.