Skip to main content
← All project stories

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.

WebsiteCRMNotionProject status

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.
Three steps
  1. Inquiry from the website or CRM
  2. Project record created in Notion, team notified
  3. 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

  1. Notion databases hold Clients, Projects, Proposals, and Tasks, with relations between them.
  2. Website form and GoHighLevel pipeline events create or match the client and project records.
  3. Slack reports a new inquiry, a stage change, or a project that has stalled.
  4. A mapped Notion status updates the GoHighLevel opportunity stage. Origin markers and event keys prevent update loops between the two systems.
  5. 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

01

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.

02

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.

03

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.