OPEN SOURCE Lead routing without flowchart hell. Read the code →
OPEN-SOURCE PROJECT · IN DEVELOPMENT

Stop making
hot leads wait.

Route inbound leads with readable rules, weighted rep assignment, and explainable decisions. An open-source application in active development.

◈ Open source · Run it yourself · Inspect the decisions
Hot Potato mascot: a flaming potato
01 / THE PRODUCT

See an example
lead assignment.

This walkthrough illustrates how company size, territory, and rep selection can shape an assignment.

Inspect the routing rules →
🔥 Routing example
SIMULATED

Preset fictional leads and results. No CRM is connected, no calendar is checked, and no meeting is booked by this example.

EXAMPLE LEAD
MC
Maya ChenVP, Revenue · Northstar Labs
Employees
820
Region
Northeast
Source
Demo request
EXAMPLE STEPS
READY
1
Company size ≥ 500Enterprise pool
2
Region = NortheastEast territory
3
Existing account ownerNo match
4
Weighted round robinJamie R.
5
Illustrative availability3:30 PM open
RESULT
↗
EXAMPLE ASSIGNMENT

Jamie R.

Enterprise East

✓
Example timeToday · 3:30 PM
02 / HOW IT WORKS

Routing logic
you can actually read.

The public application matches ordered rules, preserves an eligible existing owner, and otherwise uses weighted assignment. The rule below comes from its routing tests.

⌘ Enterprise NortheastRULE CONDITIONS
{
  "company.employee_count": { "gte": 500 },
  "company.state": {
    "in": ["NY", "NJ", "PA", "MA"]
  }
}
✦ EXAMPLE EXPLANATION

Why did Maya go to Jamie?

✓ Northstar Labs matched Enterprise
✓ Northeast territory narrowed the pool to 4 reps
✓ No existing CRM owner was found
✓ Jamie had the highest weighted priority
✓ Jamie was available at the requested time
Fictional example. Saved decisions identify the matched rule, assigned rep, and assignment reason. They do not preserve a historical rule snapshot.

One routing decision, with evidence.

The design problem: assign a qualified lead once, respect an eligible existing owner, and return a clear failure when no one can take it. Matching and rep selection are separate from the database and provider calls, so the core decision can be checked with fixed inputs.

In the public tests, a fictional 900-person New York company arrives Monday at 12:00 UTC. Ada and Marcus each have two assignments; their weights are 2:1, so Ada is selected. Set Marcus as the existing owner and Marcus is preserved. Mark Ada busy and Marcus is selected. On Sunday, outside both reps’ schedules, the same lead returns NoEligibleRepError.

Read the routing function ↗ · Inspect inputs and assertions ↗ · Inspect retry and duplicate-request checks ↗ · View this version’s CI result ↗

The retry failure case: an older owner update fails, a newer assignment succeeds, and the old retry must not undo it. The database check verifies that obsolete work becomes superseded without calling the CRM, and that concurrent owner writes finish in order. These checks use synthetic provider callbacks.

Evidence is pinned to public source 03916c4. These are synthetic routing tests, not measured customer results or proof of a connected CRM or calendar. The animation above remains a separate preset illustration.

03 / IN THE PUBLIC APPLICATION

Rules, availability,
and saved assignments.

These capabilities are available in the linked public source. The illustrations below use fictional records.

↗01

Define assignment rules

Match lead fields to ordered rules, preserve a valid existing owner, and choose an eligible rep using weighted assignment.

CRM ownerTerritoryCompany sizeAvailability
◷02

Check rep availability

Filter reps by weekly schedules. Google free/busy checks require a configured connection; this public version does not book meetings.

9:3010:0010:3011:30
DB03

Keep the decision

Persist the selected rep, matched rule ID, and assignment reason. A repeated request ID returns its existing decision.

Hot Potato→Decision history
◈04

Review the assignment

The operator view shows the selected rep, matched rule name, and CRM writeback status.

18:04:11Maya Chen → Jamie R.Rule matched18:03:54Andre Mills → Morgan T.Owner preserved18:03:21Priya Rao → Alex K.Rule matched
04 / PROJECT STATUS

Open source.
In development.

Hot Potato is software you run and configure yourself. This site offers a preset illustration and an inspectable routing case from the public application.

Run it yourself

The linked public version covers lead assignment, saved decisions, Google availability checks, and queued HubSpot owner updates. Setup and provider credentials are required for external actions.

Public scope

Meeting booking, an editable routing studio, and detailed rule/rep previews exist only in later local development. They are not included in the public version linked here. Live provider operation has not been demonstrated by this website.

Read the application docs ↗
OPEN SOURCE BY DEFAULT

Trust the router?
Read the router.

Explore the application source, read the setup instructions, and inspect its current scope. The routing engine and application are licensed under AGPL-3.0-only.

harrisonoconnorhover/hot-potatoPublic
Open-source inbound lead routing for GTM teams.
Open sourceSelf-hostedOrdered rulesRoute logs
git clone https://github.com/harrisonoconnorhover/hot-potato.git
⌘ Open sourceAGPL-3.0-only
EXPLORE THE PROJECT

Read it. Run it. Inspect it.

Start with the example, then explore the application and its setup requirements.