Working notes, prepared ahead of our call
A root cause read on the six problems described in the role, plus how I would sequence the first month across eight pipelines.
01
Every item below was named in the role description. None of them are hygiene problems. Each one is a structural problem that produces a hygiene symptom, which is why cleanups keep undoing themselves.
| Symptom | Root cause | Structural fix |
|---|---|---|
| Opportunities sit in stages they left months ago | Nothing computes age in stage, so nothing can alert on it. GoHighLevel does not expose days in stage as a filterable field, so staleness is invisible until someone scrolls. | A days_in_stage field recalculated nightly, a maximum age per stage, an automatic nudge to the record owner at threshold, and a Stale by Stage view for every pipeline. |
| Missed appointments never get moved, so rebook never fires | The recovery sequence is triggered by a stage change, which is a human action. The automation is waiting on the exact behaviour that is missing. | Trigger on appointment status instead: no show, or ended without an outcome recorded. The automation sets the stage. It never waits for one. Recovery then fires whether or not a card was touched. |
| Duplicate contacts appear across pipelines | Usually three causes at once: duplicate contacts permitted at location level, imports arriving without an email so there is no match key, and phone numbers stored in inconsistent formats. | One declared unique key, phone normalised to E.164 before every import, upsert rather than create on all inbound sources, duplicate detection at form submit, and a weekly duplicate report with counts. |
| Last contact dates are keyed to stage changes | There is no field that records real activity, so a stage change date was repurposed as a proxy. It measures CRM housekeeping, not conversations. | One last_real_contact field written only by activity: inbound and outbound calls, texts sent and replied, email replies, and dialer dispositions. Nothing else is allowed to write to it. |
| Automations broke quietly and nobody noticed | GoHighLevel gives you no alert when a workflow simply stops enrolling. Failure is silent by default, so detection depends on somebody eventually noticing an absence. | A canary record runs each critical path on a schedule. If it does not reach the final step, Slack gets told. Alongside that, a weekly enrollment count per workflow, so a drop from four hundred to three is caught in days. |
| Attribution reporting is impossible | Lead source, campaign and owner are optional at creation, so a meaningful share of records are missing them and every report silently excludes or misassigns them. | Stamp source, campaign and owner at creation from the UTM, form or webhook payload. No opportunity is allowed to exist without all three. Cost per showed call by channel then becomes a join instead of a manual assembly job. |
The pattern
Five of the six failures share one shape: an automation is depending on a human action that does not reliably happen. Stage changes, manual field updates, somebody remembering to check. The fix is not more discipline from the team. It is inverting the dependency so the system observes the event and updates the record, and the humans read the result instead of feeding it.
02
Sequenced so that nothing new breaks while the backlog is being cleared. Monitoring goes in during week one, before any rebuilding, because you cannot safely change what you cannot see failing.
03
Cleaning eight pipelines individually produces eight versions of the same fix, and drift returns within a quarter because there is nothing to check new work against. The durable version is a written pipeline standard, then automations built with the pipeline as a variable rather than copied and hand edited.
Inbound paid, outbound permit, setter pipelines and the buy side and sell side engagements will not share stage names, and they should not. They share the structure, the SLA logic and the automation coverage. That is what makes the eight maintainable by one person.
04
This is the piece most CRM cleanups skip, and it is the reason cleanups have to be repeated. A workflow that stops enrolling produces no error, no alert and no visible change. It produces an absence, and absences are invisible until a month of leads has gone cold.
| Layer | What it does | Catches |
|---|---|---|
| Canary record | A dedicated test record runs each critical path on a schedule. Reaching the final step writes a timestamp. No timestamp inside the expected window posts to Slack. | A broken path, within hours of it breaking. |
| Enrollment delta | Weekly enrollment count per workflow, compared against the prior period. | Degradation rather than failure. A workflow still running but receiving a fraction of the traffic it should. |
| Integration heartbeat | Last successful write per inbound source: dialer, email tool, lead forms, imports, call summaries. | An integration that authenticated yesterday and is silently dropping records today. |
| Scheduled audit | A standing review of workflow coverage against the pipeline standard. | Coverage gaps. A rule that exists in three pipelines and not the other five. |
Why this matters most
Every other fix on this page can be undone by an unmonitored change. Monitoring is what converts a cleanup into a system that holds. It is the first thing I would build and the last thing I would remove.
05
06
Working notes prepared ahead of an introductory call. Diagnoses above are inferences drawn from the role description, not from access to the account, and I would expect some of them to be wrong once I can see the build.