On This Page
- 2026-10-18 refresh
- The Core Insight: Be Everywhere, Not Just #1
- System Architecture
- Database Design
- Keyword Landscape: 9.8M Monthly Searches
- Real Visibility Data
- Scoring Opportunities With Jev
- Brand Mention Detection
- Outreach Pipeline: 3,964 Prospects
- The Tooling: MCP-Powered Automation
- Lessons Learned (So Far)
- What’s Next: 90-Day Targets
- Try It Yourself
In 2019, Dulé Stojnic and Axel Lavergne at Brevo, formerly Sendinblue, scaled SaaS visibility through an integrated marketing SEO/content execution play: making the brand appear on many of the top-ranking pages for a query, not only trying to rank one owned page at #1. The question was simple: what if your brand appeared on every page in the top 10 results?
They called it the integrated marketing SEO/content execution play, and within 6 months of tracking 600+ keywords, they achieved 50% program-influenced mentions. We took their framework, built a full-stack automation system around it, and ran it on 3,222 keywords in 31 languages. The tracker was set up to score Brevo, the brand the play was built for. Tajo was added on 18 October 2026, so most visibility and mention figures below are Brevo’s, and each table says whose they are.
This post is a complete technical breakdown of the architecture, tooling, database design, and the real data we’re seeing. Below, you’ll find interactive 3D visualizations built with Three.js showing the stored visibility scores, keyword landscape, and outreach pipeline.
2026-10-18 refresh
On 18 October 2026 we re-checked 197 of the 284 stored queries in two passes, including 181 of the 217 target keywords. 316 of the 520 search requests came back empty, so the other 87 queries keep their 3 October results.
- Google re-indexed the homepage. For “tajo.io”, tajo.io is #1 in the US and France and now shows the homepage’s new title. On 3 October it still showed the old title.
- One new brand ranking. tajo.io entered the top 20 for “tajo app”: #15 in the US and #14 in France.
- Still absent for “tajo” in all 7 markets checked. The river holds the knowledge panel in the US, Spain, Germany and France, and a restaurant ranks first in Italy.
- Non-brand: 0 of 182. tajo.io is not in the results for any of the 182 refreshed category and target queries, the same as on 3 October.
- Visibility. Tajo is visible on 4 of the 197 refreshed keywords, with a mean score of 0.13. Brevo is visible on 101, with a mean of 11.31.
Demand for the terms that describe Tajo, measured for the first time (US monthly volume and keyword difficulty, Ahrefs):
| Term | US volume/mo | KD |
|---|---|---|
| mcp server | 34,000 | 68 |
| ipaas | 9,500 | 32 |
| what is an mcp server | 6,300 | 42 |
| zapier alternatives | 2,200 | 8 |
| mcp ui | 1,100 | 0 |
| n8n alternatives | 1,100 | 4 |
| reverse etl | 1,000 | 12 |
On 3 October these terms had no measured volume, and 100 searches a month was assumed for each.
Many stored volumes were wrong. An Ahrefs refresh of 451 country and keyword pairs replaced the stored volume and difficulty, and the old values are kept in keyword_metric_snapshots. The non-English numbers held up worst. “integração shopify” (Brazil) gets 50 searches a month, not the stored 1,200. “integraciones zapier” (Mexico) and “integration zapier” (France) have no measurable volume at all. We recomputed the opportunity ranking with the real volumes and left Jev’s answers unchanged. 17 items fell to zero and dropped out, which leaves 533. The new top five:
| Rank | Opportunity | Market | Volume | Ahrefs check |
|---|---|---|---|---|
| 1 | tienda nube integracion | Argentina | 500 | Not confirmed: Ahrefs has no row, so this is the old stored value |
| 2 | mercado libre integracion | Argentina | 700 | Not confirmed: Ahrefs has no row, so this is the old stored value |
| 3 | integraciones zapier | Mexico, Argentina | 380 | Not confirmed: the head term is 0, and the 380 is an older stored variant |
| 4 | sincronizar contactos | Spain, Mexico, Argentina | 730 | Partly: 150 confirmed in Spain, 580 from two older stored variants |
| 5 | zapier integration | Germany | 150 | Confirmed |
Only the fifth rests entirely on a fresh Ahrefs number.
The Core Insight: Be Everywhere, Not Just #1
Think about how you actually discover products. You search “best email marketing software,” and you see 10 results. You click 3-4 of them. If one brand appears in every single article you read, that brand wins, even if it never ranked #1 itself.
“The more frequently someone hears about your product from multiple sources, the more likely they are to buy your product.”
This is the integrated marketing SEO/content execution effect. Like a cocktail party where everyone recommends the same book.
The Math Behind It
Visibility Score, the simplest metric:
Visibility Score % = (mentions in top 20 ÷ 20) × 100If your brand appears on 8 of the top 20 results for “best CRM software,” your visibility score is 40%.
Position-Weighted Visibility, because position 1 matters more than position 20:
Weighted Score = Σ(Position Weight where mentioned) / Σ(All Position Weights) × 100
Position Weights: #1 = 20pts, #2 = 19pts, ... #20 = 1pt (total 210)Opportunity Score, where to focus your effort:
Opportunity = (100% - Visibility Score) × Monthly Search VolumeA keyword with 35,000 monthly searches and 5% visibility = opportunity score of 33,250. That’s where you pitch first.
System Architecture
Here’s the full stack we built to automate the integrated marketing SEO/content execution workflow:
Technology Stack
| Layer | Technology | Purpose |
|---|---|---|
| Database | PostgreSQL | 14 tables, 30,202 records |
| Scripts | Python 3.12 | 4 core automation scripts (~2,000 LOC) |
| Search-result data | Ahrefs API + web scraping | Keyword metrics + live result scraping |
| Content Scraping | Web scraping MCP | Page content extraction for mention detection |
| Visibility Engine | Custom Python | 3 scoring methods with position weighting |
| Orchestration | Claude Code + MCP | AI-assisted analysis and execution |
The Pipeline
-
Keyword Research (keyword_research.py)
-
SERP Analyzer
- Top 20 per KW
- serp_analyzer.py
-
Mention Checker
- Scrape + Match
- mention_checker.py
-
Visibility Calculator
- visibility_calculator.py
-
Opportunity Scoring
- Gap Analysis
-
Outreach Pipeline (3,964 targets)
Database Design
Our PostgreSQL database has 14 tables tracking everything from raw keywords to outreach prospect status. Here’s the data we’re working with:
Core Tables
| Table | Records | Purpose |
|---|---|---|
keywords | 3,222 | Target keywords with volume, difficulty, silo |
serp_results | 8,921 | SERP positions and ranking URLs |
brand_mentions | 8,902 | Brand mention tracking per URL |
visibility_scores | 1,816 | Calculated visibility over time |
outreach_prospects | 3,964 | Link building opportunities |
seo_content_plan | 585 | Content planning with status |
google_ads_keywords | 1,593 | Google Ads keyword performance: CPC, impressions, conversions |
keyword_volume_history | 238 | Volume trend tracking |
keyword_metric_snapshots | 850 | Dated volume and difficulty snapshots, old values kept |
Schema Highlights
The keywords table supports multi-country, multi-language tracking:
CREATE TABLE keywords ( id SERIAL PRIMARY KEY, keyword VARCHAR(500) NOT NULL, silo VARCHAR(100), -- Content silo grouping volume_ahrefs INTEGER, -- Monthly search volume difficulty INTEGER, -- Keyword difficulty (0-100) cpc NUMERIC(10,2), -- Cost per click search_intent VARCHAR(50), -- informational, commercial, transactional country VARCHAR(5), -- us, de, fr, etc. language VARCHAR(5), -- en, de, fr, etc. UNIQUE(keyword, country, language));The visibility_scores table tracks brand visibility per keyword over time:
CREATE TABLE visibility_scores ( id SERIAL PRIMARY KEY, keyword_id INTEGER REFERENCES keywords(id), brand_name VARCHAR(100), visibility_score NUMERIC(5,2), -- 0-100% mention_count INTEGER, pages_with_mentions INTEGER, total_pages_checked INTEGER, calculated_at TIMESTAMP DEFAULT NOW());Keyword Landscape: 9.8M Monthly Searches
We’re tracking 3,222 keywords across 45 content silos, representing about 9.8 million monthly searches. Here’s the distribution:
Top Silos by Search Volume
| Silo | Keywords | Avg Volume | Total Volume |
|---|---|---|---|
| Support | 1 | 3,010,000 | 3,010K |
| Email Marketing | 646 | 2,963 | 1,624K |
| CRM | 400 | 4,037 | 1,575K |
| Business Strategy | 4 | 168,750 | 675K |
| Marketing Strategy | 12 | 36,275 | 435K |
| Marketing Automation | 174 | 1,367 | 220K |
| Customer Engagement | 163 | 1,020 | 166K |
| Messaging | 116 | 1,263 | 138K |
| Tools | 3 | 43,333 | 130K |
| Analytics | 10 | 12,820 | 128K |
The Support row is one keyword, “help desk solutions”, which Ahrefs puts at 3,010,000 searches a month: nearly a third of the total. Read it as an outlier, not a silo. The chart leaves it out. Average volume counts only keywords with a measured volume.
Average Keyword Difficulty: 23.6/100
That is the mean over the 2,499 keywords with a difficulty score. The sweet spot for integrated marketing SEO/content execution is keywords with difficulty 20-50 and volume above 1,000. 615 of our keywords sit there.
Real Visibility Data
This is where the strategy gets real. The tracker was built to score Brevo, and Tajo joined it on 18 October 2026. On that day’s refresh of 197 keywords, Tajo’s mean visibility was 0.13% and Brevo’s was 11.31%. Tajo shows up on four keywords, all searches for its own name:
Where Tajo Is Visible (2026-10-18)
| Keyword | Market | Tajo Position | Visibility | Pages Found On |
|---|---|---|---|---|
| tajo.io | US | #1 | 9.52% | 1 of 6 checked |
| tajo.io | France | #1 | 9.52% | 1 of 15 checked |
| tajo app | France | #14 | 3.33% | 1 of 19 checked |
| tajo app | US | #15 | 2.86% | 1 of 19 checked |
Where the Biggest Opportunities Are
These are the highest-volume keywords in the 18 October refresh. Tajo is on none of them:
| Keyword | Market | Monthly Volume | Tajo | Brevo | Opportunity Score |
|---|---|---|---|---|---|
| crm software | US | 617,000 | 0% | 8.57% | 617,000 |
| crm | US | 193,000 | 0% | 27.14% | 193,000 |
| whatsapp business | US | 59,000 | 0% | 0% | 59,000 |
| newsletter | US | 49,000 | 0% | 18.10% | 49,000 |
| email marketing campaigns | US | 38,000 | 0% | 17.62% | 38,000 |
| mcp server | US | 34,000 | 0% | 0% | 34,000 |
| crm system | US | 23,000 | 0% | 18.57% | 23,000 |
| email marketing | Italy | 20,000 | 0% | 0% | 20,000 |
| live chat | US | 20,000 | 0% | 0% | 20,000 |
| online marketing | US | 20,000 | 0% | 9.52% | 20,000 |
Scoring Opportunities With Jev
The table above was wrong about us, and it took until 3 October 2026 to see it. Ranked by (100% − visibility) × volume, head terms such as “crm” at 193,000 searches a month, or “newsletter” at 69,800 in the 3 October candidate set, look like the best places to spend a week. Tajo is an agentic integration builder: reverse ETL, MCP servers and tools, and an MCP UI for building syncs between SaaS apps. Shopify and Brevo are its first connectors. A reader looking for newsletter tips is not trying to connect two tools. Volume can’t see that. A model can.
So we put Jev, TypeSafe’s typed-judgment model, between the keyword database and the to-do list. It doesn’t write anything. It answers four questions about each opportunity and returns a typed answer with a confidence for each. Code does everything else.
The four questions
Every request carries the same paragraph describing Tajo, plus the facts we hold for that item: volume, keyword difficulty, the stored top 10 with known domain ratings, how many forums and listicles sit in it, and our existing article (word count, days since update, pageviews) or the third-party page.
| Question | Levels |
|---|---|
| Fit: would a page for this lead a reader to building integrations between SaaS tools? | Score 0–3: unrelated · adjacent · same problem space · exactly what Tajo solves |
| Intent | Choice: informational · comparing tools · ready to set up · navigational |
| Winnability for a young, low-authority domain within three months, from the facts given | Score 0–4: very hard · hard · moderate · achievable · easy |
| Action | Choice: new article · update existing · localize · outreach for inclusion · forum or video answer · no action |
The formula lives in code
priority = log10(1 + volume) × fit_norm × win_norm × intent_weight
fit_norm = clamp((fit − 1) / 2, 0, 1)win_norm = (winnability + 1) / 5intent_weight = Σ P(intent) × weight (ready to set up 1.0, comparing 0.9, learning 0.6, navigational 0.3; our own brand 1.0)Volume goes in on a log scale, so a keyword ten times bigger earns one more point, not ten times the points. Adjacent fit scores zero: we don’t pay for traffic that can’t reach a sync. Winnability never hits zero, so a perfect-fit keyword stays on the list even when it is hard. Intent is weighted by Jev’s whole probability distribution, so doubt about intent shrinks the score instead of forcing a guess.
Then the gates. Any fit or winnability answer below 0.6 confidence goes to a person, not into the ranking.
| Outcome | Opportunities |
|---|---|
| Ranked | 550 |
| Sent to a human (confidence below 0.6) | 648 |
| Zeroed as adjacent or unrelated | 562 |
| Jev confidently said “no action” | 106 |
| Scored | 1,866 |
What changed
The first pass divided fit by three and let volume carry the rest. A Portuguese “best newsletters” listicle came in at number 16. Adjacent fit, 25,000 searches, and the volume did all the work. That pass contradicted the thing we sell, so the formula changed to zero out adjacent fit, and everything was scored again.
In the final run, the top ten are all integration and sync queries:
| Rank | Opportunity | Locale | Volume | Action |
|---|---|---|---|---|
| 1 | integração Shopify | pt | 1,200 | Retarget our existing Shopify integration article to the Portuguese query |
| 2–4 | Zapier integrations | es, de, fr | 550–880 | One new article, three languages |
| 5 | Tienda Nube integration | es | 500 | New article |
| 7 | contact sync | es | 980 | New article |
“newsletter” finished 543rd of 550. After the 18 October volume refresh it sits 526th of 533, and “integração Shopify” fell from 1st to 8th on its real volume of 50.
The run also turned up something no formula would have found: 97% of our localized articles still carry the English primary keyword. The Portuguese Shopify article was written in Portuguese and aimed at an English search.
What it costs
Scoring 1,866 items took 2.77 million input tokens: about eleven cents. Asking the same 19 items twice moved scores by 0.034 on average, and flipped 2 of 38 choice answers. So any two priorities within 0.1 of each other are a tie. The judgments are only as good as the facts fed in. Most of our stored search results date from February 2026 (6,802 of 8,921), and the 3 October run had none for its non-English keywords, so winnability there rested on keyword difficulty alone. The 18 October refresh added 338 results for 37 non-English keywords. Jev has not re-scored anything since.
Brand Mention Detection
Our mention checker has scanned 8,898 pages so far. Brevo, or its old name Sendinblue, appears on 1,248 of them (14.0% mention rate), 34,010 mentions in all. Only 215 of those pages include a link. Tajo appears on 4 pages, all on tajo.io. Pages added on 18 October were checked from the search snippet, not the full page, which undercounts.
The mention checker works by:
- Fetching page content via a web scraping API (handles bot detection and CAPTCHAs)
- Regex matching for brand names and aliases (case-insensitive, with context extraction)
- Link detection to determine if mentions include backlinks
- Context extraction to capture the sentence around each mention
# Simplified mention detection logicdef find_brand_mentions(content, brand_names): mentions = [] for brand in brand_names: pattern = re.compile( rf'\b{re.escape(brand)}\b', re.IGNORECASE ) for match in pattern.finditer(content): # Extract surrounding context (200 chars) start = max(0, match.start() - 100) end = min(len(content), match.end() + 100) context = content[start:end] mentions.append({ 'brand': brand, 'position': match.start(), 'context': context, 'has_link': check_for_link(content, match) }) return mentionsOutreach Pipeline: 3,964 Prospects
The outreach system identifies pages ranking for our target keywords that don’t mention the tracked brand yet. Each becomes a prospect.
Pipeline Breakdown
| Status | Count | % |
|---|---|---|
| Pending (needs qualification) | 3,964 | 100% |
No prospect has been qualified or contacted yet: the database holds no Go or No-Go decisions.
Prospect Types
| Type | Count | Strategy |
|---|---|---|
| Ranking page with no mention | 3,567 | Inclusion request |
| Listicle or comparison page | 314 | Ask to be listed |
| Forum or video thread | 83 | Answer in the thread |
The 397 listicle, comparison, forum and video pages came from the 18 October refresh. Some are written by vendors, so they need triage before any pitch.
Content Plan Status
| Status | Count |
|---|---|
| Complete | 525 |
| Planned | 60 |
We have 585 content pieces in the plan. 525 are complete. The 60 planned pieces are 35 new articles and 25 revamps, the content engine that feeds the integrated marketing SEO/content execution machine.
The Tooling: MCP-Powered Automation
The entire system is orchestrated through Model Context Protocol (MCP) servers, allowing AI-assisted execution of every workflow step.
Ahrefs MCP Integration
keywords-explorer-overview → Keyword metrics (volume, difficulty, CPC)keywords-explorer-matching → Related keyword discoveryserp-overview → SERP position data for any keywordsite-explorer-organic-keywords → Competitor keyword analysisbatch-analysis → Bulk domain metricsWeb Scraping MCP Integration
search_engine → Live SERP scraping (Google, Bing, Yandex)search_engine_batch → Batch SERP scrapingscrape_as_markdown → Full page content extractionscrape_batch → Batch content scrapingWorkflow: From Keyword to Outreach
Here’s a real workflow we run regularly:
Step 1: Keyword Research
python3 keyword_research.py --stats# Returns: 3,222 keywords, 45 silos, 9.8M total volumeStep 2: SERP Analysis
python3 serp_analyzer.py --keyword-id 1 --summary# Keyword 1 in the database: 7 stored results, 7 unique domainsStep 3: Mention Checking
python3 mention_checker.py --stats# Returns: 8,898 pages checked, 1,248 with Brevo, 34,010 mentionsStep 4: Visibility Calculation
python3 visibility_calculator.py --overall --report# 2026-10-18 refresh: Tajo 0.13%, Brevo 11.31% mean visibilityLessons Learned (So Far)
1. Start with Competitor Keywords
In the “Competitor” silo, Brevo’s latest visibility averages 26.8% across 166 keywords, against 24.1% across all 795 scored keywords, because comparison pages naturally mention multiple brands. Keywords like “mailchimp alternatives” or “hubspot vs brevo” are low-hanging fruit.
2. Review Sites Are Gold
Sites like G2, Capterra, and PCMag rank for almost everything and will list you if you meet their criteria. The 173 stored results with a domain rating average DR 87.3. You can’t outrank them, but you can be on them.
3. Volume ≠ Opportunity
“crm” has 193,000 monthly US searches, and most of those readers are not trying to connect two tools. Fit to what you actually sell beats volume, which is why the opportunity score is now a Jev judgment multiplied in code, not raw volume times a gap.
4. Mention ≠ Link
Of 1,248 pages mentioning Brevo, only 215 include a link. That’s a 17.2% link rate. Every unlinked mention is an easy outreach win, you can ask nicely for a link since they already endorse you.
5. Multi-Language Multiplies Everything
The keyword set covers 31 languages, and six of them (EN, ES, PT, DE, FR, IT) hold 2,892 of the 3,222 keywords. Each language multiplies your opportunity surface. A keyword with 1,000 searches in English might have 500 in French and 300 in German, that’s 1,800 from one concept.
What’s Next: 90-Day Targets
| Metric | 2026-10-18 | Target |
|---|---|---|
| Keywords re-checked in the latest refresh | 197 | 200+ |
| Tajo overall visibility | 0.13% | 20%+ |
| Active outreach contacts | 0 | 50+ |
| Third-party pages mentioning Tajo | 0 | 12+ |
| Backlinks from tracked mentions of Tajo | 0 | 100+ |
Try It Yourself
The integrated marketing SEO/content execution methodology works for any brand. Here’s how to start:
- Pick 20 keywords, focus on “best X”, “X alternatives”, “X vs Y” formats
- Audit the SERPs, for each keyword, check who ranks in positions 1-20
- Check for mentions, does your brand appear on those pages?
- Calculate visibility, use the formulas above
- Prioritize by fit, not volume, score each opportunity for fit, intent and winnability, then multiply in code (the formula is above)
- Pitch the gaps, reach out to pages that rank but don’t mention you
The beauty of integrated marketing SEO/content execution is that it compounds. Every new mention improves your visibility score, and every visibility improvement makes the next mention easier to earn.
The figures in this post come from queries against our integrated marketing SEO/content execution tracking database on 18 October 2026. The Three.js visualizations render the same data: 3,222 keywords, 8,921 SERP results, and 3,964 outreach prospects.
Frequently Asked Questions
What is an integrated marketing SEO/content execution play?
It means getting your brand mentioned on many of the pages that rank for a query, instead of only trying to rank one page of your own at number one. The tracker behind this article holds 3,222 keywords in 31 languages and 8,921 stored search results, as of 18 October 2026.
How is visibility scored?
Each of the top 20 results for a keyword gets a weight of 21 minus its position. The weighted score is the weight earned by pages that mention the brand, divided by 210, times 100. On the 18 October 2026 refresh of 197 keywords, Tajo averaged 0.13 and Brevo 11.31.
How are opportunities prioritized?
Jev, TypeSafe's typed-judgment model, scores each opportunity for fit, intent and winnability, and code multiplies those by log-scaled search volume. Of 1,866 items scored on 3 October 2026, 550 were ranked and 648 went to a person because Jev's confidence was below 0.6.