Omni1 Superapp · team handover · September 3, 2026

Pre-Sales Research: the visibility check before the first call

Every booked call opens a customer room. Inside it, the prospect finds one page: where the firm is invisible today, on Google and in AI answers, and who takes the clicks instead. This page explains how that analysis is produced, how it is checked without a person, and how you tune it.

Owner from hereTayfun tunes prompts and rules. Dominik decides what goes live.
WhereSuperapp repo, branch check-gates, folder tool/reports/
Channel#pre-sales-call-research
Cost per prospectabout $0.40, 4 to 8 minutes

01What the prospect sees

Before the call: one sentence, the rest blurred behind a lock. After the call: the full page. Nothing on it is written by a model. The sentences are fixed building blocks with numbers filled in.

The hook

"Bei 4 von 6 Suchanfragen in Deutschland werden Sie heute nicht gefunden." Or the AI version: not named in 5 of 7 questions to ChatGPT, Perplexity and Google.

Three cards

AI answers: who gets named instead. Google: a ranking table, the prospect against three competitors. Competitors: monthly searches, the clicks they take, and a slider for order value.

The checked strip and the gap

"Das haben wir für Sie schon angesehen": AI, Google, competitors, website technology. Then one line on backlinks: catching up, or the basis is fine.

Eleven of these pages are live as real rooms in the Superapp (Dominik has the links), and the full data of all 50 companies is in the repo under eval/visibility-check/2026-09-02/. They show what a good page looks like, what a page with nothing to say looks like, and what a stopped page looks like.

02How the page is made

One run per booking, started by the room engine. The stages below run in order. Deterministic steps are grey, the three model gates are gold.

1
Read the website

Start page and Impressum, plain HTTP first. The town comes from the Impressum; the CRM town is only a hint.

2
Profile

A model reads the text and proposes trade, core term, services, reach (regional, several sites, national), town and country. Whatever the prospect wrote in the welcome form is locked and beats the model.

G1
Gate 1, profile

Before any data is bought: is the trade unambiguous, is the reach right, are the towns real, are the terms how customers search? It may correct three fields, drop or add terms, or stop the run (a municipality, an unreadable site). It may change the core term only to a word that stands on the site.

3
Research

Candidate terms come from Google's own data: what the prospect already ranks for, what people type around the core term, volume and intent. Noise goes: brands, recruiting, how-to, used goods, renting (unless the prospect rents). One search result page per candidate is bought, at the main town for regional firms.

4
Market test

The top 10 of the core term, minus portals and the prospect, are the firms of this trade. A candidate whose top 10 shares none of them measures another market and is dropped. A term whose top result is a firm named in the term is a brand search and goes. A core term owned by portals stops the run.

5
Buy the rest

The final query set (validated terms times places, plus "beste", "anbieter", "kosten" variants), AI answers from ChatGPT, Perplexity and Google, the maps block, on-page health, backlinks. Identical queries from a previous run are reused, not bought again.

6
Competitor candidates

Ranked by how often and how high they appear across the queries; portals, directories and the prospect's own other domains are excluded. For the top twelve, title, H1, description and address are fetched as evidence.

G2
Gate 2, competitors

Per candidate: is this one firm, a chain, a portal, a manufacturer, a directory? Same trade, same region? Keep, drop or unsure; unsure means drop. The display name must appear in the evidence. Code then strikes only on a contradiction: a rental or used-goods word in the evidence and none of the prospect's service words.

7
Numbers and lint

Found or not per query, clicks per competitor from position and click rate, market volume, the hook, the gap line. The lint checks arithmetic and structure in code: hook equals table, scope names every place, no own domain among competitors, at most three brakes.

G3
Gate 3, review

Reads the page as the customer would, plus the evidence behind every counted AI mention and every competitor. Findings with a severity, and actions from a whitelist: reject a mention, drop or swap a competitor, drop a query, exclude an AI domain. Two rounds at most. Block means the page fails.

8
Status

approved: the server shows the hook before the meeting and the full view after it, computed per request from the meeting time. needs_review: nothing reaches the customer, Dominik gets a Slack alert, the cockpit shows the protocol and offers force-release. The auto-release flag stays off until the numbers hold.

03The three gates, and what they may not do

The model never writes customer text and never changes a number. It corrects inputs, rejects candidates and judges. Every action is applied by code, validated against evidence and logged. Text from other websites and from AI answers counts as untrusted data in every prompt.

GateSeesMay doIf the model is down
1 ProfileSite text, CRM name and town, the profile proposal with its sources, candidate terms with volume and intentCorrect up to three fields, drop terms, add two, stop the runStop before any spend, status needs_review
2 CompetitorsTop twelve candidates with ranking signals, towns, maps rating, fetched title, H1, description, addressKeep, drop, unsure per candidate; a display name only from the evidenceNo unreviewed competitor is shown; the run ends needs_review
3 ReviewThe full page, the profile with sources, gate 2's verdicts, every AI mention with 160 characters of context, the lint findingsFindings plus whitelisted actions, two roundsNo approval without a review; the raw data stays and a later review costs nothing new

Prompts live in tool/reports/check_review.py. Every change of a prompt is a new PROMPT_VERSION, so every number in a report can be tied to the prompt that produced it.

04Rules the eval bought

Each rule exists because a run on a real company produced something a prospect would have caught. They are deterministic; the gates judge on top of them. The full list with the story behind each is in docs/PROSPECT-CHECK.md. The ones you will meet first:

Two rules were built, measured and thrown away the same night. "National needs a verbatim proof on the site" flipped ten correct nationals and left the one wrong case untouched. "A competitor must carry the service word in its title" would have thrown out firms whose names say nothing about what they do. When a rule looks obvious, measure it on the 50 before keeping it.

05The numbers today

The proof set: 50 won customers of Glow Careers from Close, 40 for tuning, 10 held back. Each page was judged by hand against the live data (correct or not, send or not, every shown competitor, every counted AI mention). The gates are then measured against that judgement.

Metric, 40 tuning companies, Kimi K3ValueTarget
False pass: gates pass a page a person would not send10
False fail: gates reject a page a person would send4 of 25at most 15 %
Competitor precision (shown competitors that are right)0.970.95
False AI mentions still counted after review00
Profile right (reach, town, core term)96 %90 %
Cost per run, mean and p95$0.40 / $0.59$0.60 / $0.75
Duration p957 min4 min

The one false pass is SBS Technik, a crane-service firm from Andernach whose profile came out as national; the national page names crane-rental chains as rivals. The welcome form question "Wo sind Ihre Kunden?" fixes that case: the prospect's answer locks the reach.

Of the 50 pages, 27 pass automatically. Eleven of the rest are correct pages with nothing to show: the firm is found everywhere and named everywhere, so there is no hook. That is a feature. The test set is made of established companies; Omni1's prospects arrive because they have a visibility problem.

The model challenge

Seven models ran on identical prompts, identical cached data and identical gold, each twice. The two models without a false pass reject almost everything (Qwen fails 20 of 39 correct pages, GLM flips every third verdict). Kimi K3 and Claude Sonnet 5 are equally stable; Kimi rejects fewer correct pages and returns cleaner JSON, Sonnet is faster. Kimi K3 stays, Sonnet 5 is the fallback. The full table is in eval/run-1/models.md on the VPS.

05bWhy 27 of 50 pass, company by company

27 of 50 is not "27 good, 23 bad". Most of the 23 are pages that must not go out, and the gates were right to hold them.

auto-pass, right · 21

The gates passed the page and a person would send it too.

withheld: nothing to show · 8

The firm is found for every query and named by the AI answers, so there is no hook. The page is right, but there is nothing to open a conversation with. Correct behaviour; the test set is made of established companies, prospects who come to Omni1 have a visibility problem.

stopped, right · 5

The gates stopped a page that was wrong or worthless: a municipality, a wrong market (IABG), a rental market (Teupen), a firm that is visible anyway (PohlCon), a shop-press market (Wickert).

false fail · 4

A person would send the page, the reviewer rejected it. All four are the same thing: gate 3 flags one query as measuring another market ('regalsysteme', 'kunststoffsortierung', 'chemietank') and a block on that code fails the page. This is the first tuning target.

FALSE PASS · 1

The gates passed a page a person would not send. SBS Technik: the profile came out as national, so 'Krandienstleistung' was measured nationwide and the crane-work firms of that market are shown as rivals. The welcome form question about reach fixes this case; without an answer it stays a known miss.

pass, but nothing to say · 1

Correct page, market volume 10 searches a month, everything found (Geiger). Report only.

holdout, not judged yet · 10

Ten companies kept back for the final measurement with the chosen model. Their verdicts are in the table, their human judgement is still open.

Of the 25 tuning pages a person would send, 21 pass automatically. Of the 15 that must not go out, 2 slip through. Start with the four false fails: one code, one prompt sentence, measurable on the cached data in ten minutes.

CompanyTradeVerdictHookClassWhy
247TailorSteel Deutschland GmbHMetallbearbeitung / LohnfertigungpassBei 2 von 4 Suchanfragen in Deutschland werden Sie heute nicht gefundeauto-pass, right
ATZ GmbH IndustrieautomationIndustrieautomationpass_with_notesIn KI-Antworten werden Sie bei 4 von 4 Fragen in Deutschland nicht genauto-pass, right
Balm Meggen AGHotel und RestaurantpassBei 4 von 6 Suchanfragen in Meggen und Luzern werden Sie heute nicht gauto-pass, right
Contigo Energie AGEnergieberatung und EnergiedienstleistungpassIn KI-Antworten werden Sie bei 12 von 12 Fragen in Deutschland nicht gauto-pass, right
Düdal Leichtmetall-Giesserei AGAluminiumgiessereipass_with_notesIn KI-Antworten werden Sie bei 3 von 3 Fragen in der Schweiz nicht genauto-pass, right
e.optimum AGEnergie-EinkaufsgemeinschaftpassBei 4 von 5 Suchanfragen in Deutschland werden Sie heute nicht gefundeauto-pass, right
GIFAS ELECTRIC GmbHElektrotechnik Herstellerpass_with_notesBei 2 von 5 Suchanfragen in Deutschland werden Sie heute nicht gefundeauto-pass, right
Haldimann AGEntsorgung und RecyclingpassIn KI-Antworten werden Sie bei 3 von 8 Fragen in Murten und Fribourg nauto-pass, right
O. Jeker AG Haustechnik+SchwimmbadHaustechnik und SchwimmbadbaupassIn KI-Antworten werden Sie bei 3 von 8 Fragen in Breitenbach und Reinaauto-pass, right
Kmhp Engineering GmbHSondermaschinen- und Anlagenbaupass_with_notesIn KI-Antworten werden Sie bei 3 von 3 Fragen in Deutschland nicht genauto-pass, right
LAUPP GmbHAluminium-Druckgusspass_with_notesIn KI-Antworten werden Sie bei 3 von 3 Fragen in Deutschland nicht genauto-pass, right
MAC Mode GmbH & Co. KGaAJeans Online-ShoppassBei 6 von 9 Suchanfragen in Deutschland werden Sie heute nicht gefundeauto-pass, right
Niebling Technische Bürsten GmbHTechnische Bürsten HerstellerpassBei 2 von 6 Suchanfragen in Deutschland werden Sie heute nicht gefundeauto-pass, right
Paul Reuter GmbH & Co. KGKunststoffprofile Extrusionpass_with_notesBei 4 von 6 Suchanfragen in Deutschland werden Sie heute nicht gefundeauto-pass, right
PEAK-GroupGebäudeautomation und Digital Asset Managementpass_with_notesBei 4 von 4 Suchanfragen in Deutschland werden Sie heute nicht gefundeauto-pass, right
pro-bau GmbHBauunternehmenpassIn KI-Antworten werden Sie bei 5 von 10 Fragen in Wangen-Schauwies, Frauto-pass, right
Riedhammer GmbHIndustrieofenbaupassBei 6 von 6 Suchanfragen in Deutschland werden Sie heute nicht gefundeauto-pass, right
smartblue AGPhotovoltaik-Monitoring und SteuerungpassBei 3 von 7 Suchanfragen in Deutschland werden Sie heute nicht gefundeauto-pass, right
T.Werk GmbHHersteller Photovoltaik-MontagesystemepassBei 4 von 6 Suchanfragen in Deutschland werden Sie heute nicht gefundeauto-pass, right
Zwickauer Werkzeug- und Sondermaschinenbau GmbH - WESOMAWerkzeug- und Sondermaschinenbaupass_with_notesIn KI-Antworten werden Sie bei 3 von 3 Fragen in Deutschland nicht genauto-pass, right
J. Wiest & Söhne GmbHAutohauspass_with_notesIn KI-Antworten werden Sie bei 4 von 9 Fragen in Darmstadt, Bensheim, auto-pass, right
DESMA Schuhmaschinen GmbHSchuhmaschinenbaufail(none)withheld: nothing to showno hook: found everywhere, nothing to open the conversation with; other (see message)
DIAMOND GmbHGlasfaserkomponentenfail(none)withheld: nothing to showno hook: found everywhere, nothing to open the conversation with
Elektrizitätswerk Jona-Rapperswil AGElektrizitätswerk / Energieversorgererror(none)withheld: nothing to showprofile wrong (reviewer); no hook: found everywhere, nothing to open the conversation with
Fixatorenbau Bertuch & Co. GmbHMaschinenelemente / Fixatoren für Werkzeugmaschinenfail(none)withheld: nothing to showthin page; no or one competitor; no hook: found everywhere, nothing to open the conversation with
hoffmann automobile agAutohausfail(none)withheld: nothing to showno hook: found everywhere, nothing to open the conversation with; other (see message); hook and rows disagree
Kraemer Elektronik GmbHTablettenprüftechnikfail(none)withheld: nothing to showno hook: found everywhere, nothing to open the conversation with
Sauer u. Sohn MotorentechnikMotorentechnik und Ersatzteilhandelfail(none)withheld: nothing to showno hook: found everywhere, nothing to open the conversation with; other (see message)
Solar Promotion GmbHMesse- und Konferenzveranstalter Erneuerbare Energienfail(none)withheld: nothing to showno hook: found everywhere, nothing to open the conversation with
Burgergemeinde ThunBurgergemeinde / KommunalverwaltungfailBei 4 von 7 Suchanfragen in Thun, Bern und Steffisburg werden Sie heutstopped, rightprofile wrong (reviewer); other (see message); no or one competitor
Industrieanlagen-Betriebsgesellschaft mbHTechnologie- und Sicherheitsberatung / Hightech-PrüfdienstleistungenfailIn KI-Antworten werden Sie bei 6 von 6 Fragen in Deutschland nicht genstopped, righta query measures another market (reviewer)
PohlCon GmbHBaustoffe und BausystemefailIn KI-Antworten werden Sie bei 4 von 8 Fragen in Deutschland nicht genstopped, rightprofile wrong (reviewer)
TEUPEN Maschinenbau GmbHHersteller von ArbeitsbühnenfailBei 4 von 5 Suchanfragen in Deutschland werden Sie heute nicht gefundestopped, rightno or one competitor; other (see message)
WICKERT Maschinenbau GmbHSondermaschinenbau PressenfailBei 4 von 5 Suchanfragen in Deutschland werden Sie heute nicht gefundestopped, rightmarket held by portals; a query measures another market (reviewer); a portal among the competitors
DELABO.GROUP GmbHDentallaborfailIn KI-Antworten werden Sie bei 3 von 8 Fragen in Düsseldorf, Pinnebergfalse failprofile wrong (reviewer); a query measures another market (reviewer)
HÖLSCHER HOLDING GMBHLagertechnik und LogistikstahlbaufailBei 6 von 6 Suchanfragen in Deutschland werden Sie heute nicht gefundefalse faila query measures another market (reviewer)
Optical Sorting GmbHKunststoffsortierungfailIn KI-Antworten werden Sie bei 4 von 4 Fragen in Deutschland nicht genfalse faila query measures another market (reviewer)
Schwaben-Kunststoff Chemietank- und Apparatebau GmbH & Co. KGChemietank- und ApparatebaufailIn KI-Antworten werden Sie bei 2 von 4 Fragen in Deutschland nicht genfalse faila query measures another market (reviewer)
SBS Technik GmbHKrandienstleistungpass_with_notesIn KI-Antworten werden Sie bei 4 von 4 Fragen in Deutschland nicht genFALSE PASS
Geiger Hoch- und Tiefbau GmbH & Co. KGHoch- und TiefbaupassIn KI-Antworten werden Sie bei 2 von 6 Fragen in Oberstdorf nicht genapass, but nothing to say
adeor medical AGMedizintechnikfailBei 4 von 4 Suchanfragen in Deutschland werden Sie heute nicht gefundeholdout, not judged yetno blocking finding recorded
cobos Fluid Service GmbHIndustrielles Abwassermanagementpass_with_notesIn KI-Antworten werden Sie bei 2 von 6 Fragen in München, Dachau und Gholdout, not judged yet
HDG - Verpackungsmaschinen GmbHVerpackungsmaschinenfail(none)holdout, not judged yetno hook: found everywhere, nothing to open the conversation with
KARL SCHNELL GMBH & CO. KGMaschinenbau für Lebensmittelindustriefail(none)holdout, not judged yetno hook: found everywhere, nothing to open the conversation with; hook and rows disagree
Klaassen Technologie GmbHSondermaschinenbau und AutomatisierungstechnikfailIn KI-Antworten werden Sie bei 3 von 3 Fragen in Deutschland nicht genholdout, not judged yettechnical line implausible
RATEC GmbHSchalungstechnik für Betonfertigteilwerkefail(none)holdout, not judged yetno hook: found everywhere, nothing to open the conversation with; other (see message)
SARTORIUS Werkzeuge GmbH & Co. KGWerkzeughandel ZerspanungpassBei 3 von 4 Suchanfragen in Deutschland werden Sie heute nicht gefundeholdout, not judged yet
Schulz+Partner GmbHVerfahrenstechnik AnlagenbaufailIn KI-Antworten werden Sie bei 4 von 6 Fragen in Deutschland nicht genholdout, not judged yetmarket held by portals; a query measures another market (reviewer)
Wassermann + Kress Metallverarbeitung GmbHCNC-Fertigung / Metallverarbeitungpass_with_notesIn KI-Antworten werden Sie bei 7 von 7 Fragen in Deutschland nicht genholdout, not judged yet
WFN AG Werkzeug- und Feinmechanik AGWerkzeug- und FormenbaupassIn KI-Antworten werden Sie bei 8 von 11 Fragen in der Schweiz nicht geholdout, not judged yet

The same table, with every file behind it, is in the repo under eval/visibility-check/2026-09-02/ (README first). Every company has its profile, raw data, gate records, review rounds and the human judgement there.

06How to tune it

Change one thing, run the eval, read the report, keep or revert. Never tune on a single company.

  1. Pick the failure. The report lists every disagreement between the gates and the gold: false passes, false fails, competitor leaks, wrong profiles. Start with the class that has the most cases, not the loudest single case.
  2. Decide where it belongs. A term that measures the wrong market is a research problem (code in prospect_check.py). A wrong judgement about an entity or a mention is a prompt problem (check_review.py). A wrong number is a lint problem. Rules catch what is deterministic; prompts judge the grey.
  3. Change it, bump the version. Prompt edits change PROMPT_VERSION. Rule edits get a line in docs/PROSPECT-CHECK.md with the company that caused them.
  4. Run the eval on the cached data. Nothing is bought again unless the research step changed. Recorded model answers are replayed where the prompt is unchanged, so a lint change costs nothing and a prompt change costs about $3 for all 50.
  5. Read the report, then the pages. Metrics first, then rejudge.py for the per-company sheet: kept and dropped terms, the hook, every row, every competitor with its evidence, the verdict.
  6. Update the gold when the page changed. If a fix changes what a page shows, the human judgement for that page has to be redone. Gold that describes an old page produces false metrics.
  7. Post the before and after in #pre-sales-call-research. One message: what changed, which companies moved, the metric line. Dominik decides deploys.
# on the VPS, in /root/ck-test (venv of the app)
python -m tool.reports.check_eval --subjects subjects.json --out eval/run-1 --stage derive --record --replay-gates --concurrency 8
python -m tool.reports.check_eval --subjects subjects.json --out eval/run-1 --stage review --record --replay-gates --concurrency 8
python -m tool.reports.check_eval --subjects subjects.json --out eval/run-1 --stage report
python rejudge.py eval/run-1 sbs-technik          # one company, the sheet a reviewer reads
python -m tool.test_check_review                   # 100 unit checks, no network, no database

Stages: collect buys data (only after a research change, with --reuse-serp), derive runs gate 2 and the numbers, review runs the lint and gate 3, report writes report.<model>.md and models.md. --model runs any OpenRouter model on the same prompts; --repeat 2 measures how often a verdict flips.

What a good change looks like

07Where things live

WhatWhere
Pipeline (site, profile, research, market test, numbers, status)tool/reports/prospect_check.py
Gates, prompts, lint, actions, review cycletool/reports/check_review.py
Eval runner and reporttool/reports/check_eval.py
Unit checkstool/test_check_review.py
Welcome form (the prospect's answers, locked fields)tool/forms/schema.py, tool/forms/routes.py
Cockpit card (protocol, force-release, hold)frontend/src/components/sales/check-card.tsx
Customer pagefrontend/src/components/portal/check.tsx
Documentation, rules with their stories, release modeldocs/PROSPECT-CHECK.md
Eval data, gold, reports, model challengeVPS /root/ck-test/ (subjects, eval/run-1/<company>/, models.md)
Slack alerts for pages that need a personOmni1 bot, env OMNI1_SLACK_BOT_TOKEN and OMNI1_SLACK_ALERT_CHANNEL

Deploys go through the two doors described in Two-Door Deploys: frontend without database access, backend with dump and rollback. The eval never touches the production database; tests force SQLite when a Postgres DSN is in the environment.

08Open ends