Nucleus logonucleus
‹ All use cases
Bablic · lead enrichment with Protolyth

Every lead checked before anyone writes to it.

A cold email to the wrong person costs more than a missed one. That includes a lapsed customer who has already come back, a site that went offline, or a company already using a competitor. Protolyth, a lead pipeline built on Nucleus, enriches each lead, looks at its site in a real browser, and blocks the send while anything is unresolved. Then it follows the lead from the first email to a paid subscription.

Leads exported533 Blocking issues at export0 Enrichmentfree first Runs inClaude + an app
01

From a raw list to a send you can stand behind

Each stage is a set of Protolyth tools in Nucleus. An operator drives them from Claude, scheduled Dispatch workflows run the repetitive parts, and the team reviews the results in the Protolyth app. All three use the same tools and the same rules.

01

Stage the leads

import_builtwith_csv · import_peleg_book · create_campaign

Leads land in a staging database, not the CRM. Nothing reaches a system of record until it's been checked.

write
02

Screen for free, then buy only what's left

list_stale_domains · enrich (screen first) · dry run

A free vendor screen runs first, and a paid lookup only happens where the screen can't answer. A dry run reports the credit count before anything is spent.

free
03

Look at the actual site

enqueue_site_checks · record_site_observation

A real headless browser opens each site. Is it up? Is the product's script still live? Is a competitor's widget running? Vendor data says what a site used to run, and the browser shows what it runs today.

observed
04

Raise contentions, and block on the serious ones

list_contentions · decide_contention

Every disagreement in the data becomes a contention, either blocking or advisory. Examples: a domain that's already a paying customer, a dead site, a quote for languages the site has switched off. A blocking contention stops the draft from being approved until a person decides it.

blocks the send
05

Size the offer

sizing workflow · suggested tier, price and cost delta

Traffic, foreign-language share and enabled languages suggest a plan and a price, and every number shown carries its source.

computed
06

Draft, validate, approve

record_drafts · validate_draft · approve_draft

Drafts are versioned in the database, and each revision is checked again. A person approves in the review screen, or Claude rewrites while they watch.

approved
07

Export, then follow the outcome

export_woodpecker_rows · ingest_outcome_events · campaign_outcomes

Approved leads go to the email outreach tool. Replies, sign-ups and payments flow back in as events tied to the same lead.

write
02

Credits are spent on new questions only

Enrichment vendors bill for every domain you ask about, including the ones they have no data for. On one run, 289 domains were flagged as needing a refresh. Protolyth now records when a vendor came back empty, and skips sites that will never have data, so it bought this:

Flagged for enrichmentdomains
Genuinely new: worth asking about45
A missing answer looks exactly like missing work. Before the fix, a vendor's "no data" left no trace, so the same empty domains were queued and paid for on every run, and nothing failed to signal it. Recording "we asked, and there was nothing" is what turned 289 purchases into 45. Combined with screening for free first, credits go only to questions that haven't been asked.
03

What the checks caught before a single send

These were all found in data that looked ready to send. Each one would have been a wrong email to a real person.

533leads exported

with zero blocking contentions open at export

86competitor installed

already running another vendor's product, so they need different copy from a lapsed customer

48dead domains repointed

moved to the site the customer actually uses now, while 54 more were rejected

1paying customer saved

who was one export away from a cold win-back email, caught by matching on domain

The last case shows why the checks exist. The customer had several sites. One had converted and was paying, and another had no status at all, so it looked like a fresh lead. Neither the email address nor the contact ID matched. Only the domain did, so "already a customer" is now a blocking contention keyed on domain, not on how the lead was imported.
04

From the first email to paid, from real signals

A campaign isn't over when it's sent. Each lead moves through six steps, and every step is set by a system that knows, not by someone remembering to update a field.

Contacted

An email was sent, or a rep logged a call or meeting

Signed up

A project or account exists on the new platform

Injected

The product's script is verified on the site

Live

Translations are serving to visitors

Converted

A paid subscription started

Cancelled

The subscription was cancelled

Half-known data goes to Staging, not into a guess

Anything the matcher can't place with certainty waits for a person.

  • New-platform projects that no lead holds yet
  • Sign-ups to place on the right lead
  • Payments and events that match no lead, or several
  • Proposed company groupings across domains

A person's decision is final

The automatic matcher never overrides a human.

  • A manual link or unlink is recorded as a review decision
  • The matcher skips anything a person has already decided
  • A rep's own call is logged as contacted, never as a campaign send
  • Outcomes feed a running comparison of which message works
See the app

All of this started as tools in Claude. Two weeks later it was an app.