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.
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.
- Company AQualified. Draft ready.
- Company BDisqualified. Stopped.
- Company CQualified. Draft blocked.
- Company DDisqualified. Stopped.
- Company EReview needed. Person reviews.
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.
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.
| Layer | Technology | Why it was chosen |
|---|---|---|
| Interface | Twenty CRM, private TypeScript/React app | Ten command-menu actions put the work on the account record the team already uses. |
| Service | Python 3.12, FastAPI, Pydantic | Checks data from outside services against the expected format before it reaches the sales system. |
| State | PostgreSQL 16, 24 migrations | Saves related changes together and stops simultaneous jobs from changing the same record at once. |
| Jobs | Durable workers and monitors | Each task is assigned to one worker for a limited time. Retry limits let interrupted work resume without repeating indefinitely. |
| AI | MiniMax M3 via OpenRouter; stronger model for borderline cases | Selected using a 120-company comparison, including a manual review of disagreements. |
| Research | Free company-data graph, paid enrichment, social data API | Free details come first; paid calls fill remaining gaps. |
| Outreach integration | Smartlead webhooks | Prepared to record sends, replies, bounces and opt-outs. Sending was not switched on at delivery. |
| Voice | Distilled voice profile, integrity hash, evaluation checks | Uses writing rules and made-up examples instead of sharing the client's founder's private emails. |
| Hosting | Docker, reverse proxy, scripted deploys | Repeatable releases include a check for differences between the deployed image and repository. |
| Monitoring and tests | Readiness checks, cost metrics, GitHub Actions, pytest | Tracks worker health and provider balances alongside automated checks. |
5 engineering decisions that matteredThe problem, what was done, and what it changed.
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.
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.
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.
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.
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
Or write to care@brownmind.com