What a card is
- 25 questions a buyer (or, for a publisher, a reader) might ask, in the target country’s main language, without any brand name. One model call reads the home page (title, headings, menu links), names its main products or categories with the words on the page that show them, and drafts 40 candidate questions, each tied to a product and marked by how closely it matches what the site sells. A product the page doesn’t show and a weak match are dropped; so is a question naming a year already past. The candidates’ keywords’ Google search volume (one DataForSEO call, the same that gives the cost per click) ranks the rest: the core questions are taken in turn from each product, the most searched first, then the related ones to reach 25. A card left with fewer than 10 questions is still made and sent, and is listed under Check by hand on the staff’s report card page with the reason. Years and seasons follow the card’s date and the country’s hemisphere.
- Each question asked once in ChatGPT, Gemini, Google AI Overviews and Google AI Mode, from the target country (25 questions × 4 engines: 100 answers at most). ChatGPT and Gemini, Ansvisor Starter’s engines, are the card’s main result (
mainEnginesin the figures): the visibility, the competitors, the cited sites, the company’s own citations and the questions missed all count their answers. Cards made while Ansvisor tracked Microsoft Copilot counted ChatGPT and Copilot instead. Google AI Overviews and Google AI Mode, which Growth adds, are shown apart, each with how often it named the company. Every engine is asked through the tracking’s own provider. An engine that doesn’t answer from that country is left out. - The answers read for the company’s name or site, the competitors they name, the other businesses they name, and the sites they cite. One more model call sorts every name the card found (competitor, marketplace, other) and the 25 sites cited most (competitor, marketplace, reviews, guide, publication, official, community, other; a short list of known review and complaint sites, such as sikayetvar.com and trustpilot.com, is always reviews) for the whole card at once; a site whose address names a competitor or marketplace counts as one whatever the call says. Only competitors are counted and shown as “named instead”; a suggestion to get onto a site picks only a guide, publication, official source or community, and only then a reviews site, with “check and answer what customers say about you” as its step.
- The median Google Ads cost per click of the questions’ keywords in that country, from the same search volume call prompt volumes use.
- A PDF in the language the request chose (
reportLanguage: English, Turkish, French, Spanish, German, Portuguese, Italian or Dutch), else by the target country: Turkish for Türkiye, English elsewhere (web/src/lib/report-card/copy.ts,copy-tr.ts,copy-fr.ts,copy-es.ts,copy-de.ts,copy-pt.ts,copy-it.tsandcopy-nl.ts; a language is added as one more copy file and inREPORT_LANGUAGES, in the web’scopy.tsand the server’scountries.js). The questions are asked in the target country’s main language whatever the report’s language, so the figures and the cost don’t change. Ansvisor’s product and feature names stay in English. Every amount (costs per click, the value table, Ansvisor’s prices) is in US dollars, as Ansvisor’s plans are, written the report’s language’s way; a deal value stays in the currency it was given in. The e-mail is in the same language. The PDF has:- status: a small “Start free trial” button in the header, a one-time-snapshot note, the products found, the four headline figures, the starting point (a visibility of 0% with what AI already cites) and first step, Starter’s engines with Growth’s in a band of their own, who AI names and cites, and the five questions competitors win most;
- the questions: every question by product, with its keyword’s searches a month as Google Keyword Planner’s range (10–100, 100–1K, 1K–10K, 10K–100K, 100K+; “Low” when Google reports 0 or none, never an exact count; the questions stay ordered by the real figure), a grid of what each engine’s answer did and the competitor named instead;
- the plan: three findings, each with a week-one action and the Ansvisor area that helps, the cited sites sorted by kind (competitors’ sites and marketplaces left out), and how agents work, approved step by step or, in Growth, publishing on their own;
- value and plans: 2%, 5% and 10% of the questions’ monthly searches (their total stated to two figures, “about 19,000”) priced at the median cost per click (only with at least five keywords and a median of $100 or less, a guard against bad data; when the ads would cost less than Starter, the card says clicks are cheap instead of claiming a saving), a revenue scenario only when a deal value was given, Starter and Growth as two plan cards side by side (monthly and yearly prices, 20% off yearly; engines, prompts and brands; AI usage as a multiple of Starter’s, never in dollars; Site Audit pages a month; agents; MCP read, or read and write on Growth), Chat, Agent Center and MCP, and the trial invitation, “measure your own questions”, with a “Start your free trial” button. Both trial buttons link to the sign-up page with
utm_source=report-card&utm_medium=pdfandutm_content=page1orpage4.
- Every word comes from fixed rules over the figures (
web/src/lib/report-card/rules.ts) and the card’s copy (copy.ts); no model writes the advice.
Request
POST /public/report-card, from the form’s page. JSON, or the same JSON as text/plain, at most 16 KB.
Answers
Every answer is{ "code": "…", "domain": "…" }; invalid adds fields, one message per field, as the form shows it under the field.
Limits
- Only the origins in
REPORT_CARD_ORIGINSmay post from a browser. REPORT_CARD_IP_HOURLYrequests an hour from one address. The address is used for the bot check and this limit, and never kept.- One card per company, the work e-mail’s domain, every
REPORT_CARD_REPEAT_DAYSdays. REPORT_CARD_DAILY_CAPcards start a day. A request past it waits for the next day with room, within a week.- No card starts once the month’s cost would pass
REPORT_CARD_MONTHLY_BUDGET_USD, keeping room for the cards already queued. A card costs about $0.30: model calls counted from their tokens, plus each engine answer and the keyword call at their set prices.
Delivery
Every minute the cloud server starts the due cards,REPORT_CARD_CONCURRENCY at a time, and sends what is waiting:
- a ready card’s e-mail, which says first that the PDF is attached, with a “Start a free trial” button;
- a card sent again, which says the same first;
- a note when a card couldn’t be made.
POST /api/internal/report-card/pdf { card, language? }, with CRON_SECRET); it isn’t stored. The language is the request’s (report_language), not the card’s, so two people at one company can get the same card in two languages; without one, the card’s country decides. A language the web doesn’t write is refused (422). Requests are deleted after 12 months.
Ansvisor staff (STAFF_EMAILS) see the day’s cards, the month’s cost, the share that failed and the latest failures at /dashboard/admin/report-cards.
Environment
Server, all optional (defaults in brackets):
The web app reads
REPORT_CARD_DAILY_CAP and REPORT_CARD_MONTHLY_BUDGET_USD too, for the admin view only.