Project 07 / Demonstration build
The system that runs this business
Website and CRM events create linked Notion records. Status changes sync back to GoHighLevel, with Slack notifications and a weekly digest.
Category: Agency operations · Designed outcomes, not measured client results.
Loom recording not available yet.
Who this is for
Agencies and small firms that use Notion for notes and tasks and need it connected to intake, CRM, and chat.
The problem
In my own words
“Inquiries come through the website form and land in GoHighLevel. Proposals go out through Upwork. Project notes live in files. I had no single view of what was open, what was waiting on a client, and what I had promised.”
- Inquiry from the website or CRM
- Project record created in Notion, team notified
- Status tracked in one place, synced back
Designed outcome
One place to see every client, project, and proposal. Nothing lives only in someone’s inbox.
What the workflow does
- Notion databases hold Clients, Projects, Proposals, and Tasks, with relations between them.
- Website form and GoHighLevel pipeline events create or match the client and project records.
- Slack reports a new inquiry, a stage change, or a project that has stalled.
- A mapped Notion status updates the GoHighLevel opportunity stage. Origin markers and event keys prevent update loops between the two systems.
- A weekly digest lists open work, items waiting on a client, and commitments that need attention.
Handover boundary
The mapping between Notion statuses and GoHighLevel stages is explicit. Changing a label does not silently change the mapping. Custom code handles supported API operations, not restrictions that the Notion API itself imposes.
Record matching and API limits
Email addresses are normalized before matching. A shared processing key serializes the create-or-match step, so simultaneous events cannot both create a client. The custom node handles supported relation updates and paginated property reads. Notion computes rollup values; the API does not allow the workflow to write those values directly.
Failure handling
When it breaks
The website form and GoHighLevel create the same client within a minute.
The workflow matches the email and processes the two inquiries in turn. Both use the same client record, so no duplicate is created.
Notion rate-limits a bulk sync.
The sync waits and retries. It resumes from the last completed record rather than starting the whole batch again.
A Notion status has no matching GoHighLevel stage.
The sync stops that update and flags the unknown status in Slack. The existing opportunity stage stays unchanged.