Skip to content

CRM-audit workflow

This page is the operator’s guide for running CRM audits against a GoHighLevel sub-account via Claude. It covers:

  • The one-time setup that has to be in place before the first audit runs.
  • A coverage matrix listing every metric the tools compute and every metric still requires manual lookup.
  • Four copy-paste prompt templates for the four cadences (bootstrap, weekly, monthly, ad-hoc).
  • The hard rules baked into the tool layer (read-only gates, Drive write flag, audit logging).

Three rules govern every audit and are enforced by the server:

  1. Writes are off by default. Every GoHighLevel write tool refuses with E_GOHIGHLEVEL_WRITE_NOT_ALLOWED until a super-admin flips allow_gohighlevel_write on the site. Every analytics tool listed below is read-only by design — none of them mutates GHL data.
  2. Google Drive is the system of record. Audit outputs are saved into the linked Drive folder with drive_save_audit. Chat history is ephemeral; the Drive file is reviewable later.
  3. One sub-account per conversation. Don’t run audits for two clients in the same chat — start a new conversation per sub-account to avoid cross-contamination.

Before the first audit can run cleanly, confirm:

  • Site row exists with platform = gohighlevel and the PIT + location ID configured. See GoHighLevel prerequisites.
  • At least one worker user has clicked Connect Google at /admin/users — and their user_id is set in the site’s drive_user_id field.
  • The Drive folder is created and its ID is in drive_folder_id. The connected Google account must be at least Editor on that folder.
  • Microsoft Clarity Data Export token is pasted into clarity_token, project ID into clarity_project_id. Optional but recommended — the weekly prompt pulls Clarity friction metrics.
  • Run diagnose_site once and confirm both drive.reachable: true and clarity.reachable: true.
  • Generate a draft baseline.md with ghl_bootstrap_baseline, save it to Drive, review it, and replace the draft banner with a signed-off version once the agency owner has approved.

What the analytics tools cover automatically vs. what still requires a manual step.

StepStatusNotes
Verify the MCP can read the sub-account✅ Autodiagnose_site + ping_site
Install Microsoft Clarity on the funnel/site👤 ManualOut of scope for the MCP — done in the Clarity dashboard
Store Clarity project ID against the site✅ AutoAdmin form writes to clarity_project_id
Create per-client Drive folder👤 ManualCreate the folder in Drive, then paste the folder ID into the admin form. The MCP does not auto-create folders.
Define KPI baseline⚠️ Partialghl_bootstrap_baseline auto-generates a draft from 30 days of GHL data. Opt-in rate per funnel works; missed-call-textback works; SMS deliverability does NOT (GHL public REST doesn’t expose A2P stats); Clarity baseline still needs a manual dashboard pull (Clarity API caps at 3 days).
Save baseline as baseline.md to Drive✅ AutoFeed ghl_bootstrap_baseline output into drive_save_audit
MetricStatusTool / Caveat
Opt-in rates per funnel✅ Autoghl_get_funnel_stats (per-page) + ghl_compute_opt_in_rate (overall + per-funnel aggregate)
Missed-call → text-back conversion✅ Autoghl_compute_missed_call_textback (default 5-minute window — adjustable via textback_window_minutes). Heuristic detection — verify against the GHL Conversations dashboard if numbers look off.
Pipeline stage drop-offs✅ Autoghl_compute_pipeline_funnel (counts + stage-to-stage conversion)
SMS deliverability⚠️ Partialghl_get_campaign_a2p_stats surfaces campaign metadata only — per-campaign A2P delivery stats are NOT in GHL public REST. Manual check in GHL → Marketing → Campaigns required.
SMS reply rate✅ Autoghl_compute_sms_stats (samples up to 50 conversations by default; raise max_conversations for full coverage)
Compare against baseline.md✅ Autodrive_get_baseline loads the agreed file, Claude computes the diff
Top 5 Clarity URLs with rage/dead-click above baseline✅ Auto (with cron history)clarity_get_metrics gives 3-day per-URL friction directly. For multi-week trends use clarity_get_historical_metrics — reads from the daily snapshot table populated by the 01:30 UTC cron.
ICE ranking of recommendations✅ AutoClaude computes ICE from the deltas during synthesis
StepStatusTool / Caveat
Session-recording filter (30s-2min, did NOT convert)🔴 ManualClarity public Data Export API does NOT expose per-session URLs. Open the Clarity dashboard → Recordings tab → apply the filter manually.
Workflow execution errors (last 30 days)✅ Autoghl_list_workflows + ghl_get_workflow_executions per workflow. Returns is_dead: true and error_rate so synthesis can flag both bins.
A2P delivery failures⚠️ PartialSame as weekly — ghl_get_campaign_a2p_stats returns metadata only. Manual dashboard required.
Dead workflows (zero executions in 30 days)✅ Autoghl_get_workflow_executions returns is_dead: true when execution count is 0
Tag hygiene (tags used fewer than N times)✅ Autoghl_compute_tag_hygiene (configurable min_uses, default 5)
Reactivation candidates (stale contacts)✅ Autoghl_compute_reactivation_candidates (configurable days + tag filter)
ComparisonStatusTool / Caveat
Opportunities / win-rate / no-show (current window vs prior window)✅ Autoghl_compute_window_compare covers all three with one call (default window_days=14)
Opt-in rate diff✅ AutoCall ghl_compute_opt_in_rate twice with different days; Claude diffs
Ad spend🔴 Out of scopeGHL public REST doesn’t expose Meta/Google Ads spend. The MCP has no integration — check the ad platform dashboard directly.
Missed-call text-back conversion✅ Autoghl_compute_missed_call_textback
Form submission rate✅ Autoghl_compute_form_submission_rate (heuristic attribution via tag + custom field — verify if numbers look off)
Identify the layer where the drop happens✅ AutoChain ghl_compute_window_compare + the metric tools above into one synthesis prompt

These are tested, copy-paste prompts for Claude Desktop. Replace {site_id} with the actual site id (for example seo-navigator). All prompts are read-only — they don’t trigger any GHL writes.

Before the first audit: confirm the token your Claude Desktop is using has * scope on the site, or at minimum these tools listed: diagnose_site, drive_get_baseline, drive_save_audit, ghl_compute_*, ghl_get_*, ghl_list_workflows, clarity_get_*. See Tokens & scoping.

A. Bootstrap baseline (run once per new sub-account)

Section titled “A. Bootstrap baseline (run once per new sub-account)”
Bootstrap the CRM baseline for {site_id}.
1. Call ghl_bootstrap_baseline with days=30.
2. Verify Drive + Clarity reachability with diagnose_site.
3. Save the markdown output to Drive as `baseline.md` via drive_save_audit.
4. Reply with the Drive web view URL so the agency owner can review.
Do NOT edit any HighLevel data. This is read-only.
Run the weekly CRM audit for {site_id}.
1. Load the agreed baseline via drive_get_baseline.
2. Pull last 7 days from GHL using:
- ghl_get_funnel_stats (opt-in rate per funnel)
- ghl_compute_opt_in_rate (overall + per-funnel)
- ghl_compute_missed_call_textback (5-min window)
- ghl_compute_pipeline_funnel (stage drop-offs)
- ghl_compute_sms_stats (reply rate)
- ghl_compute_no_show_rate
3. Pull last 3 days of Clarity friction signals:
- clarity_get_heatmap_metrics (rage/dead-click, scroll depth)
- clarity_get_metrics with dimensions=["URL"] for top URLs above baseline
4. Compare every metric against baseline.md. Flag every metric whose movement
exceeds the anomaly threshold encoded in §1-§4 of baseline.md.
5. Synthesise:
- "What changed vs last week" — 1 paragraph
- "Top 3 anomalies" — bullet list with metric, current, baseline, delta
- "Top 3 recommended fixes" — ranked by ICE (Impact × Confidence × Ease, 1-10 each)
6. Save the synthesis to Drive as `audits/{ISO date}_weekly.md` via drive_save_audit.
7. For every recommended fix with ICE > 7, create a ClickUp task via the
ClickUp MCP (clickup_create_task):
- list_name: "{clickup_list_name_for_this_client}" (set per client)
- name: the fix title
- description: the fix body + a Markdown link to the Drive audit URL
- tags: ["crm-audit", "weekly", "ice-gt-7"]
- priority: 2 (High) if ICE >= 9, else 3 (Normal)
Skip task creation for ICE <= 7 — keep those in the Drive audit only.
8. Reply with: the Drive web view URL + the list of ClickUp task URLs created.
Do NOT push any change to GHL. This is read-only. ICE > 7 items require
review and sign-off in ClickUp before any action is taken.
Run the monthly CRM optimisation sprint for {site_id}.
Part 1 — same as weekly audit (prompt B) but with days=30 instead of 7.
Part 2 — workflow health:
1. ghl_list_workflows.
2. For each workflow with status="active", call ghl_get_workflow_executions
with days=30.
3. Flag:
- workflows where is_dead=true (zero executions in 30 days) — archive candidates
- workflows where error_rate > 0.05 — investigate failure pattern
Part 3 — tag hygiene:
1. ghl_compute_tag_hygiene with min_uses=5.
2. List the rare tags.
Part 4 — reactivation pool:
1. ghl_compute_reactivation_candidates with days=60.
2. Return count + a sample of 20 contacts (id, name, last_activity, tags).
3. Recommend whether to launch a reactivation campaign this month.
Save the synthesis to Drive as `audits/{ISO date}_monthly.md`.
For ICE > 7 fixes from Part 1 AND every flagged workflow from Part 2,
create one ClickUp task each via clickup_create_task:
- list_name: "{clickup_list_name_for_this_client}"
- name: the fix / workflow title
- description: details + Drive audit URL
- tags: ["crm-audit", "monthly", "ice-gt-7" OR "workflow-health"]
- priority: 2 (High) for workflow errors + ICE >= 9, else 3 (Normal)
Reply with: the Drive web view URL + the list of ClickUp task URLs.
NOTE: Session-recording analysis is NOT automated — Clarity public API
does not expose per-session URLs. Open the Clarity dashboard and filter
Recordings to 30s-2min non-converters as a separate step.
Diagnose the lead drop in {site_id}.
1. Run ghl_compute_window_compare with window_days=14. This gives 14-day
current vs prior-14-day baseline for opportunities, win rate, no-show.
2. Run ghl_compute_opt_in_rate twice — once with days=14, once with days=28
— and report the delta per funnel.
3. Run ghl_compute_form_submission_rate with days=14 and days=28 (run twice
to get the comparison).
4. Run ghl_compute_missed_call_textback with days=14.
Identify the layer where the drop is happening:
- Traffic (funnel views collapsed?)
- Opt-in (views same but opt-in rate dropped?)
- CRM follow-up (opt-in same but text-back / SMS reply dropped?)
- Sales (pipeline stages same upstream, conversion at later stage dropped?)
Reply with:
- A 2-line headline naming the layer where the drop concentrates
- The 3 metrics with the biggest negative delta
- A recommended next investigation step
Ad spend is OUT OF SCOPE — the MCP has no Meta/Google Ads integration.
Check ad spend in the ad platform dashboards separately.
Do NOT push any change to GHL. This is read-only.

Prompts B and C above instruct Claude to create one ClickUp task per ICE > 7 recommendation. This relies on MCP composition — Claude has both the SEO Navigator MCP (for the audit data) and the ClickUp MCP connected in the same conversation, and chains them in one prompt.

Prerequisites:

  • Claude Desktop has both connectors installed:
    • SEO Navigator MCP at /mcp (this server).
    • The ClickUp MCP (claude.ai connector). Authenticate it once per Claude account.
  • Each sub-account has a dedicated ClickUp list (recommended naming: CRM Audit — {client-name}). Capture the list name (or ID) in your client onboarding doc so it can be substituted into {clickup_list_name_for_this_client} in the prompts.

Why ClickUp tasks, not direct GHL changes? Two reasons:

  1. Read-only first. Even after the 90-day read-only window expires, sign-off lives in a human-readable task tracker — not in chat, where it’s ephemeral, and not in GHL directly, where a wrong change is hard to undo.
  2. Visibility for reviewers. ICE > 7 fixes are the high-impact ones; they need a reviewer to look at the audit, agree with the fix, then execute it in GHL by hand or via a follow-up prompt.

Task hygiene: the recommended tags (crm-audit, weekly, monthly, ice-gt-7, workflow-health) let the reviewer filter their ClickUp list. Combine with ClickUp’s saved views to get a board like “All weekly audit anomalies awaiting review”.

If your team uses Linear, Asana, or Notion instead, the same pattern works — replace clickup_create_task with the equivalent tool from the corresponding MCP connector (the Claude AI connectors directory has many of them pre-built).

These items are listed honestly so they don’t get rediscovered by surprise during the first audit cycle.

  1. Session-recording filter. The Clarity public Data Export API does not return per-session URLs. The MCP can’t fetch the recordings (“30s-2min, did NOT convert”) — open the Clarity dashboard manually.
  2. Pixel-level heatmaps. Clarity public API only returns aggregate rage/dead-click counts. The dashboard renders the actual heatmap.
  3. Ad spend. No Meta/Google Ads adapter. Pull from each ad platform’s dashboard separately.
  4. A2P delivery stats per campaign. GHL public REST exposes campaign metadata only. Per-campaign delivered/failed counts must be read from the GHL → Marketing → Campaigns dashboard.
  5. Clarity 30-day baseline (first run only). The Data Export API caps numOfDays at 3. The Worker runs a daily cron snapshot to back-fill 30+ day trends into D1 (see clarity_get_historical_metrics), but for the first 30 days after a site is linked there isn’t enough history — supplement with a manual Clarity dashboard pull until the snapshot table fills up.
  • drive_save_audit is gated behind allow_drive_write (super-admin flag, default OFF). Reads (drive_get_site_folder, drive_list_site_files, drive_read_file, drive_get_baseline) are always available when the site has Drive linked.
  • All ghl_compute_*, ghl_get_*, ghl_list_* analytics tools are read-only by design — the analytics adapter has no write helpers. Mutations stay in the proxy tools (*_create-*, *_update-*, etc.) which are themselves gated behind allow_gohighlevel_write.
  • Every tool call is audit-logged in D1 (audit_log table) with the calling token id, the site id, arguments, and status. Review the audit log at /admin/audit to verify which tools a prompt actually called.