Ember
Reactivation AgentAn n8n agent that finds the cold GoHighLevel leads worth re-approaching, drafts a personal message for each, and waits for a person to approve every send.
- My role
- Designed and built the agent end to end: scoring logic, n8n workflow, GPT-4o-mini drafting, and the Telegram approval gate.
- Built with
- n8n, GoHighLevel, OpenAI API, Telegram
- Status
- Built and running
- 3 signalsscored per lead: recency, enquiry note, tag richness
- Score 6+required before a single draft is written
- 1 approvalper lead in Telegram, never a bulk send
Before
The problem
Cold CRM leads were revisited on no consistent schedule, or not at all. A flat contact list gave no way to tell a lead worth trying from one too recent or too far gone, and hand-writing a message for each one didn't scale.
The system
How the pieces connect
- GoHighLevelFetch cold contacts
- n8nFilter and score
- GPT-4o-miniDraft a message
- TelegramHuman approval
- GoHighLevelSend and tag
Proof
The real build
Step by step
How it works
- 1Pulls cold contacts from GoHighLevel and drops anyone on Do Not Disturb, without an enquiry note, or already attempted.
- 2Scores the rest on recency, enquiry note, and tag richness. Only a score of 6 or more moves on.
- 3Drafts a personal message for each qualifying lead with GPT-4o-mini.
- 4Sends each draft to Telegram with the score and signals, one lead at a time.
- 5Approve sends it and tags the contact as attempted. Decline logs and stops.
SIM: reconstructed from the real workflow with placeholder demo contacts, not live leads. Trigger, scan, score, draft, the Telegram approval gate, and the tag write-back are all real. The SMS send is mocked (Twilio pending), and reply monitoring is planned, not built.
Control
Human in the loop
Nothing is sent until a person taps Approve in Telegram. Every lead gets its own approval, never a bulk send, and the reviewer sees the score and the reasons behind it before deciding.
After
What changed
Stack
For technical readers
Technical detail
The problem, in detail
Cold leads that go quiet in a CRM either get manually revisited on no consistent schedule, or never get revisited at all — there's no systematic way to decide which of dozens of stale contacts are actually worth a human's time to re-approach.
How it decides
Only leads that clear the scoring threshold reach the gate — everything else is filtered out before a draft is ever written.
Build notes
An n8n agent that fetches cold GoHighLevel contacts, scores them, drafts outreach, and holds for approval — one lead per gate, not a mass send.