Check each company's fit before paying for contact research

The team chooses a company or a list in Twenty, its sales system. Low-cost checks rule out poor fits before paid contact research; companies that pass can get email drafts with sources for review. Email sending was not switched on.

Client: WavelengthAgencies and services selling retainers

CreditReviewed, hardened and operated by our founder as part of a partner agency's team, working with the client's technical founder.

Follow one recorded run

Five companies checked, and two worth researching further

Three of the five stop or go to a person before any contact research.

Prospect list5 companies selectedRun cap$2
2 qualified2 stopped1 to review
Sending off
Recorded run · 10 sec
Recorded paid usage$0.0223 of the $2 cap

About Wavelength

Each first email needed a specific, true reason to write.

Wavelength sells a high-value monthly retainer. Its team needed to understand each company before reaching out, but the target list ran to thousands. The work had to fit inside Twenty, where they already managed their accounts.

Client
WavelengthA European company selling a high-value monthly retainer
Industry
Agencies and services · Europe
How they sell
B2B outbound to a target list

The problem

The list had thousands of companies, but research was done one at a time

  • Research took 30 to 60 minutes

    The source record describes that much work per prospect. One person could clear only a handful each day.

  • Poor fits still cost money

    Researching every company in full meant paying for contacts the team would not pursue.

  • The first email needed evidence

    General praise gave the reader little reason to reply. The first email needed something specific and true.

  • Decisions were hard to trace

    Why a company stopped, or where it was stuck, was kept only in people's memories and spreadsheets.

What was built

Each company record shows the decision, the reason and the next step

  • A score with a reason

    A 0–100 score covers fit, ability to pay, timing and access. Fit is required. When the system is unsure, the company goes to a person for review.

  • Contacts only for companies that pass

    Only qualified companies get a contact search: up to three ranked decision-makers, with email checks before drafting.

  • A draft with sources

    Each 45–65 word email is written in the client's founder's voice from saved evidence. A claim without a source blocks the draft and leaves a reason on the record.

  • One company or a whole list

    Select up to 500 companies in Twenty. The app adds 10 buttons there, and the record shows progress, costs and the reason a company stopped.

  • Steps run in the right order

    Results return to the company record. Later steps check those results before starting, so an action pressed out of order is refused.

Control and safety

The software stops when a draft is ready

A person reviews uncertain companies and approves every draft before it can enter an email sequence. Missing evidence blocks a draft; it is not filled in with a guess.

  • Money is set aside before each paid step. A limit per run and a limit per company control paid work. Operators can cancel a run or stop all paid work at once.
  • Unknown does not mean unsuitable. Missing funding or social data stays unknown. It does not automatically rule out the company.
  • Recipients must pass checks. Drafting needs a checked email address and a contact who is not on the do-not-contact list, such as someone who opted out.
  • Private source emails stay private. The writing guide contains rules drawn from the client's founder's emails and made-up examples. The original private emails are not included.

For technical readers

How the system works

A button in Twenty starts a recorded run. Free company details and low-cost website checks come first. Only qualified companies move to contacts, evidence and drafting. The company record shows progress; the database keeps costs, evidence and reasons.

Select in TwentyOne company or a list
Check company fitDetails + website evidence
QualifiedFind and check contacts
UncertainPerson reviews
DisqualifiedStop; save the reason
Draft with sourcesBlock if evidence is missing
Person approvesSending remains off

Dashed lines show supporting connections, or parts that are paused or not yet built.

In more detail

Technology used (10 parts)Each part of the system, and why it was chosen.
LayerTechnologyWhy it was chosen
InterfaceTwenty CRM, private TypeScript/React appTen command-menu actions put the work on the account record the team already uses.
ServicePython 3.12, FastAPI, PydanticChecks data from outside services against the expected format before it reaches the sales system.
StatePostgreSQL 16, 24 migrationsSaves related changes together and stops simultaneous jobs from changing the same record at once.
JobsDurable workers and monitorsEach task is assigned to one worker for a limited time. Retry limits let interrupted work resume without repeating indefinitely.
AIMiniMax M3 via OpenRouter; stronger model for borderline casesSelected using a 120-company comparison, including a manual review of disagreements.
ResearchFree company-data graph, paid enrichment, social data APIFree details come first; paid calls fill remaining gaps.
Outreach integrationSmartlead webhooksPrepared to record sends, replies, bounces and opt-outs. Sending was not switched on at delivery.
VoiceDistilled voice profile, integrity hash, evaluation checksUses writing rules and made-up examples instead of sharing the client's founder's private emails.
HostingDocker, reverse proxy, scripted deploysRepeatable releases include a check for differences between the deployed image and repository.
Monitoring and testsReadiness checks, cost metrics, GitHub Actions, pytestTracks worker health and provider balances alongside automated checks.
5 engineering decisions that matteredThe problem, what was done, and what it changed.
  1. Reserve the cost before spending it

    The old worker checked its cap after a stage returned. The replacement estimates and reserves the cost first, then settles the charge and releases the unused amount in a database transaction. Reservations are keyed by company and stage, so retries reuse them.

  2. Missing evidence should stay missing

    A cheap model was rejecting good companies because their websites did not reveal whether they could afford the retainer. Unknown affordability now waits for a later funding check. Failed social lookups are marked unverified rather than interpreted as no activity.

  3. Compare models on the same material

    Five models used the same saved website context for 120 companies. The chosen first-check model returned valid structured output for all 120. It cost $0.00145 per company against $0.02639 for the expensive baseline, with 92% verdict agreement. Agreement is not an independent accuracy score.

  4. Save evidence before updating the account

    Evidence, facts and a retryable queue of pending updates commit first. The company record is updated afterwards, so a crash does not leave a decision with nothing saved behind it.

  5. Coordinate shared paid accounts

    Only one worker at a time may make bulk requests through the shared paid account. Each batch has its own record. An out-of-credits response stops later paid calls. A worker whose permission has expired cannot start another paid stage.

Testing and build recordHow it was tested, and the build by the numbers.

Quality and reliability

  • The latest baseline in the source record passed 1,462 automated tests, from about 1,200 test functions in over 120 files. Seven suites use a real Postgres database.
  • Continuous integration checks style, types, all 24 migrations on a fresh database, named acceptance suites and the full test suite. Tests use stored evidence rather than paid APIs.
  • Retries apply to rate limits, server errors and network failures, with 5, 15 and 30 second delays. AI output is validated even when a model needs a plain-JSON fallback.
  • Nine coded draft-block reasons are shown on the company record and in the Drafting Blocked queue.
  • Worker heartbeats, provider balances and readiness checks expose degraded or unavailable services.

By the numbers (build)

  • 163 commits in the first 12 days of tracked history, from design lock to a limited production rollout.
  • About 53,000 lines of Python across the service, shared library, voice engine and social research module.
  • 24 database migrations, 10 CRM buttons and 1,462 passing tests in the recorded baseline.
  • A separate 500-company contact run took about 12.5 minutes and found a valid email for 406 companies (81%).

Is it a fit?

Could this work for your team?

  • You sell a retainer that needs a considered approach. Your team needs a specific reason to contact each company, rather than a mass email.
  • Your target list is bigger than your research capacity. A few people are working through hundreds or thousands of accounts.
  • You can describe who fits. A website read can check your criteria, while unclear cases go to a person.
  • You want to start with a small test. Begin with a few hundred companies and a small budget cap. Review the decisions by hand before widening the list.

Which companies on your list are worth your team's time?

Conducted by Apurva · Not a sales call