All case studies

Case study · Avangard Reklam · Apr 22 – Aug 22, 2026

Four months on our own site: a measured log of an SEO system

Let’s say it up front: This is not a “we 10×’d traffic” story. Over the four months we measured, the site’s search impressions fell 41% and its average position regressed from 10.8 to 17.0.

Transparency: marketingdigitalmendoza.com is not a client site; it is our own R&D property, operated by Avangard Reklam. That is why we can publish the failed attempts too.

Data: Google Search Console6 measurement windowsEvidence file: evidence.json

What four measured months produced

−41%
Search impressions
5,418 → 3,174
49 → 42
Clicks
with 41% fewer impressions
+83%
CTR
0.72% → 1.32%
9.0 → 13.2
Clicks per 1,000 impressions
Our primary reported metric

Read these four numbers together: while impressions fell 41%, clicks nearly held, and a far larger share of the remaining impressions converted into clicks. This entire page explains how that table came about, which failures caused it, and which measurement system caught it.

Source: Google Search Console (GSC only, Bing excluded) · overlapping 26–27-day windows · evidence.json

00 — Transparency

Transparency note: this is not a client case

marketingdigitalmendoza.com is our own property. An R&D property operated by Avangard Reklam, active in the city of Mendoza, Argentina.
We highlight that instead of hiding it, because the advantage comes from exactly there: in client cases, agencies can only show the part that worked. On our own property we can publish the failed attempts, the pages that got zero impressions, and the cost of our own mistakes. A real client contract would never allow that.
This also implies an honest limitation: this site is a small property. We are talking about 25–49 clicks and 3,000–5,000 impressions in a 28-day window. The value here lies not in the size of the traffic but in the traceability of the method.

01 — The property and the method

Turning measurement into a habit

The site is a bilingual service site built on Next.js: Spanish (es-AR) canonical, English secondary. Under app/ there are 83 pages — 19 local service pages, 7 free tool pages, roughly 29 blog posts, and the core service/corporate pages.
The route inventory lives in a single file. lib/seo/route-seo-config.ts holds the title, description and canonical for every route. Instead of hunting metadata across 83 separate files, we audit it from one place.
Language alternates are not fake. The alternatesForPath() function in lib/seo/locale-route-policy.ts emits the en alternate only if that route actually exists in the English tree. The English version is deliberately a narrow 5-page subset; generating English hreflang for all 83 pages would have created an army of tags pointing at pages that do not exist. The same file throws an error when the development environment encounters a missing localized route — so broken links land on the developer’s screen, not in production.
Measurement became a habit. We built a repeatable loop we call a “wave”: pull Search Console + Bing data → pull SERP data → produce recommendations → publish page changes → measure in the next wave. Each wave is written to disk under its own run-id, so that a past measurement can be recomputed later. Every number in this case study has been recomputed from those raw files.

02 — Field study

Radiografía Web Mendoza: measuring the field instead of the competitors

In a local market, “competitor analysis” usually means looking at three sites and producing opinions. We measured the field instead.
We pulled 99 businesses across 10 sectors from Google’s local result pack. Each business’s website was resolved with a separate organic search; social media, directory and marketplace links were filtered out. Every remaining domain was verified against the business name — in the domain itself or in the site’s <title> tag. Those that failed verification were not counted as “has a site”; they were marked as “no verifiable website of their own”.
The result: 55 of 99 businesses (56%) have a verifiable website of their own. 48 sites were reachable and passed a mobile Lighthouse audit.
LCP distribution of the 44 audited Mendoza sites
The 44 sites with a valid LCP measurement, fastest to slowest. Median 11.0 seconds; only one site sits below Core Web Vitals’ 2.5-second “good” threshold.
Radiografía Web Mendoza findings (mobile Lighthouse, August 2026)
MetricResult
Median LCP (mobile)11,002 ms
Below the 2.5 s threshold1 of 44 sites
Over 10 seconds24 sites
Over 20 seconds8 sites
Median performance score62
HTTPS100%
Meta description79%
H1 tag63%
Structured data (schema)60%
WhatsApp link46%

Source: Radiografía Web Mendoza — 44 valid LCP measurements · anonymized open dataset (CC BY 4.0)

The most striking part is the sector breakdown. Bodegas (wineries) — the region’s most visible, most touristic and best-capitalized sector — have 100% website ownership, yet a median LCP of 13,986 ms. Everyone paid for a site; nobody looked at its speed. At the other end, repair shops: not one of 10 businesses has a verifiable site.
This is a completely different footing from saying “your site needs to be fast” in a sales call. We can now say: 9 of the 10 businesses in your sector take over 10 seconds to load; we measured it.
The dataset is published with business names and domains removed. Every row keeps its sector label and all metrics; it carries no identity information. That is how you make findings verifiable without exposing anyone.

Download the anonymized dataset (JSON, CC BY 4.0)

03 — Failure log

The wave system — including the part that failed

This is the section most agencies do not publish.
In wave 4 the site was at its best: 5,418 impressions, 49 clicks, average position 10.8. By wave 8, clicks had fallen to 31 — a 37% loss. In wave 9 it dropped to 25, and CTR hit its lowest point at 0.72%.
Impressions and CTR by measurement window
Six measurement windows, Google Search Console data only. Impressions did not come back — but a far larger share of the remaining impressions converted into clicks.

Why it happened

Fault 01 · Redirect

The 301 never fired

We had decided to consolidate the diseño web cluster into a single strong page, and defined 301 redirects for the old URLs. The redirect never took effect: the hosting layer preferred serving the exported static file over a _redirects rule without the force flag. The result: we paid the cost of consolidation (scattering the old pages’ authority) and never received the benefit (concentrating that authority on one page).

Our measurement document attributes roughly 27% of the impression loss to this single fault.

Fault 02 · Cannibalization

7 of 8 new pages received zero impressions

In waves 6 and 7 we published 8 new pages. 7 of them received zero impressions. The cause was not that the pages were bad; they targeted the same search intent as existing pages. Unable to decide which one to show, Google weakened both. The extreme case was a page we found in wave 10: it ranked first and received zero clicks — because what the user was looking for was not on that page.

7 / 8 pages invisible · intent collision

The rule that came out of this is now permanent: a redirect that was not verified in production after publishing does not exist.

What we did

Wave 10 was dedicated entirely to cleanup: overlapping pages were merged, target queries were assigned page-by-page, and titles and descriptions were rewritten against real search intent.
The result did not bring impressions back — and we did not expect it to. What it did was turn a far larger share of the remaining impressions into clicks:
Comparison of three measurement windows: waves 4, 9 and 11
MetricWave 4Wave 9Wave 11
Impressions5,4183,4563,174
Clicks492542
CTR0.90%0.72%1.32%
Clicks per 1,000 impressions9.07.213.2

Source: Google Search Console (GSC only) · window totals, not a mean of daily CTRs

The CTR improvement does not rest on a single window: 1.34% in wave 10, 1.32% in wave 11. What separates it from statistical noise is that it held across two consecutive measurements.

And one surprise

The most valuable finding of wave 11 inverted the site’s founding assumption. Pages aimed at the whole country performed roughly 8× better per page than the Mendoza-specific local pages. On a site founded on the assumption that “the local niche is small but converts,” this meant completely changing the geographic targeting of the pricing set.
Had we not measured, we would never have known — and we would probably have kept producing more local pages.

04 — Performance

Performance: misdiagnosing LCP twice

The site’s biggest technical win was a two-stage bug hunt.

Stage one — fonts

The Next.js font loader was given weight arrays (weight: [400, 500, 600…]). This produced 13 separate woff2 files, 5 of which (~196 KB) were preloaded at page open. Meanwhile the page’s LCP element was a text element: the browser was downloading hundreds of kilobytes of fonts before it could paint the text.
The fix was to remove the weight arrays and move to variable fontsFraunces (headings) and Inter_Tight (body), display: swap, with only the latin subset. latin-ext was dropped because Spanish accents are already inside latin. 13 files became 2.

Stage two — the actual culprit

Even after the font fix, the homepage LCP on a throttled mobile connection was 8.2 seconds — against an FCP of just 2.0 seconds. Another page carrying a nearly identical load but without an animation library sat at 4.0 seconds.
The cause was not in the CSS but in the animation: the hero paragraph was animated starting from opacity: 0. Chrome does not count an element at opacity zero as painted. So the LCP clock waited for the 572 KB bundle to hydrate and the animation library to run.
The fix was one line: animate on the y axis only. Transforms (transform) do not block painting. That change also closed a hidden accessibility bug — for users with the “reduce motion” preference enabled, that paragraph was not visible at all.
This work was done before and deliberately ahead of the Radiografía study. If you are going to publish research on how slow other people’s sites are, your own site has to be fast first.
To measure your own site’s speed the same way, our free site speed test tool runs these checks in a single click — independent of any 26–27-day window. Run the site speed test

05 — Measurement and conversion

The measurement and conversion stack — and the number we do not publish

Analytics

GA4 and Google Tag Manager are in place site-wide. The real value is not in raw pageviews but in the typed event taxonomy in lib/analytics/funnel-events.ts: primary_cta_click, whatsapp_click, contact_click, form_submit, tool_complete. Every event carries the page_type, cta_location and service_type dimensions and is sent to both dataLayer and gtag.
It was designed to answer one question: which CTA, on which page type, in which position works? — not “how many clicks did we get?”

Conversion-side decisions

  • 01

    WhatsApp first, form second.

    Filling a contact form and waiting for an email is not an established behaviour in the Argentine market. So the contact form does not send data to a server; it converts the fields into a formatted WhatsApp message and opens the conversation. The user stays in a familiar interface at a familiar pace.

  • 02

    Context-aware opening.

    The WhatsApp component composes a different opening line depending on the page the user is on — someone coming from the Google Ads page does not meet the same message as someone coming from the SEO page.

  • 03

    Removing one redirect hop.

    Links use the api.whatsapp.com endpoint directly instead of wa.me; wa.me inserts a 302 redirect in between.

  • 04

    The silent bot trap.

    The form has a hidden “honeypot” field; clients that fill it receive not an error but a fake success. The bot never learns it was blocked.

  • 05

    Exit intent, without aggression.

    The popup has three triggers, but all three are gated: at least 8 seconds on the page, 20 seconds of inactivity, and a 24-hour re-show block.

Where we have to stop and be honest

We do not publish a conversion rate in this section. For two reasons: there is no stored GA4 export in the repository, and at this traffic volume (25–49 clicks per 28 days) any conversion rate computed from it would be statistically meaningless. Rather than invent a number, we leave the gap empty.

Scaled pages: let’s call them what they are

It would have been tempting to market this as “programmatic SEO”; it is not. The 19 local pages (marketing-digital-maipu, seo-godoy-cruz, meta-ads-lujan-de-cuyo and the rest) are hand-written files that render a single shared component (LocalLandingPage.tsx). That is templating at the component level, not pages generated from data. There are only three genuinely dynamic route types: service details (in two languages) and blog categories.
We make this distinction because the lesson from chapter 03 lives exactly here: the problem was not how we produced pages, but that we duplicated pages targeting the same intent. Automation does not solve that mistake; it accelerates it.

Structured data

Schema generation is centralized in lib/seo/schemas.ts: LocalBusiness, ProfessionalService, Service, FAQPage, BreadcrumbList, Offer, AggregateRating, OpeningHoursSpecification and others. Being central means it can be audited from one place instead of hand-copying JSON-LD across 83 pages.

Pricing: an architectural fix for a content problem

The strangest thing we found in the audit was not technical. Prices were hand-written across more than 6 pages and contradicted each other in two different currencies — ARS 120,000 on one page, USD 550 on another. The gap was roughly . The ARS figures predated inflation.
The fix had two layers. First packaging: three overlapping packages pushed the buyer to compare instead of choose; they were cut to two. Then architecture: all prices moved into a single file, USD became the reference, and ARS amounts derive from a single exchange-rate constant. A rate update is now one line.
Honesty note: this “single source” holds only for web-project pricing. A second helper file with a different reference rate still exists in the repository. We do not claim site-wide single-sourcing, because it is not.
This measurement approach is also the foundation of the analytics and business intelligence stack we use in client work: without an event taxonomy, the question “which CTA works?” cannot be answered. Analytics and business intelligence

06 — Outcome

What we learned

  1. 01

    An unmeasured redirect is a redirect never made.

    A single silent fault cost about a quarter of the four-month impression loss.

  2. 02

    More pages does not mean more visibility.

    7 of 8 new pages received zero impressions. Before producing a page, the question is not “which query will this page win?” but “which of my pages already targets this query?”

  3. 03

    An impression is not a metric; it is raw material.

    Keeping clicks while losing 41% of impressions beats gaining impressions while losing CTR. That is why our primary reported metric is clicks per 1,000 impressions.

  4. 04

    Performance bugs usually are not in the CSS.

    Both of our LCP diagnoses were wrong places: one in the font loader, one in an animation’s opacity value.

  5. 05

    Produce your own data.

    The Radiografía study was this project’s most valuable output, and it had nothing to do with rankings. The measurement cost — API spend included — was $0.58.

This study is a measurement window closed on August 22, 2026. The next checkpoint comes once wave 11’s changes fill a complete window; the real question we will measure then is: do impressions come back on a cleaned-up page structure?
We will publish it either way — whether they do or not.

07 — Method

Method and limitations

How every claim in this case study was produced, under which conditions it holds, and what it does not prove.

Search Console data

Source. Google Search Console API for marketingdigitalmendoza.com, a https:// prefix property. Every measurement is written to disk as raw JSON under its own run-id.
Computation. Every series in the case study was recomputed from daily rows: clicks and impressions = the sum of all days in the window; CTR = total clicks ÷ total impressions (not a mean of daily CTRs); average position = the impression-weighted mean.
Why we did not use summary files. The process tool’s summary files merge Bing Webmaster Tools data with Google data from wave 8 onward. Those rows are not comparable with the GSC-only baseline measurements. Therefore no number in this case study comes from summary files; all were recomputed from raw Google data. Bing is excluded entirely.
  • 01

    Windows are 26–27 days, not 28.

    Because of Search Console’s data delay, “28-day” pulls effectively contain 26–27 full days. Comparisons should therefore be read through rates (CTR, clicks per 1,000 impressions) rather than absolute totals.

  • 02

    Windows overlap.

    Wave 9 (July 5–31) and wave 10 (July 21 – August 15) share 11 days. The 9→10 change is therefore not a comparison of two independent periods. We still report the CTR improvement because it held at 1.32% in wave 11 (July 28 – August 22); had it rested on a single window, we would not report it.

  • 03

    Volume is low.

    25–49 clicks per window. At this scale, individual differences are not statistically significant. Our claim is not the accuracy of a specific percentage but the direction sustained across six measurements.

  • 04

    Causality is not proven.

    Seasonality, algorithm updates and competitor moves were not controlled. The relationship between our changes and the observed shifts is temporal, not experimental. No A/B test was run.

Radiografía Web Mendoza field study

Sample. 10 businesses per sector across 10 sectors from Google’s local result pack (99 total; one sector returned 9 results). Mendoza, August 2026.
Site resolution. Each business’s site was found with a separate organic search. Social media profiles, directories and marketplaces were excluded — those do not count as “their own site”.
Verification. A candidate domain had to match the business name: in the domain itself or in the site’s <title> tag. Non-matches were not counted as “has a site”; they were marked “no verifiable website of their own”. This deliberately under-estimates the website-ownership rate (56%) — in every uncertain case, we said “no”.
Numbers. 99 businesses → 55 verified sites → 52 unique domains audited → 48 reachable → 47 Lighthouse completed → 44 with a valid LCP measurement. The LCP statistics in this case study rest on those 44 sites.
  • 01

    One-shot measurement.

    Each site was measured once, from one point, one time. Lighthouse is lab data, not real-user measurement (CrUX/RUM). A site being slow at that moment does not mean it is always slow.

  • 02

    Small cells.

    Audited site counts per sector range from 0 to 10. Medians for sectors like veterinarians (3 sites) or dentists (2 sites) are indicative, not decisive. Bodegas (10 sites) is the most reliable cell.

  • 03

    One row could not be classified.

    1 of the 52 rows could not be matched to a sector because the domain changed after a redirect, and is published as “desconocido” (unknown) in the dataset.

  • 04

    Google’s local pack is not a universe.

    The sample consists of the businesses visible in those searches at that time; it is not a representative sample of all businesses in Mendoza. It skews toward businesses that already have visibility — meaning the true situation is probably worse than what we measured.

Performance claims

LCP and font figures rest on Lighthouse measurements taken with a throttled mobile profile during development. These are lab measurements, not field data (CrUX). Figures like “8.2 seconds” are single readings taken under those conditions, on that date.

What we did not publish

  • 01

    No conversion rate.

    There is no stored GA4 export in the repository, and the contact form does not send data to a server (it defers to WhatsApp), so there is no server-side lead record either. A conversion rate at this volume would be meaningless anyway.

  • 02

    No revenue.

    The commercial outcomes of this property are outside the scope of this study.

  • 03

    No business identities.

    The Radiografía dataset is anonymized: business name, domain, URL and address removed. Row IDs are a stable hash of the domain — irreversible for anyone who does not already know the source domain. Sector and all metrics are preserved.

Correction policy

If we find a published figure on this page to be wrong, we add the correction here with its date rather than silently updating the page. No corrections so far.

08 — Evidence files

Evidence and reproduction

This page is a measurement window closed on August 22, 2026. Every number in the text is matched with its source file, measurement window and data source.
  • Evidence file

    Every figure in the text, matched with its source, measurement window and data source (Search Console only / Search Console + Bing).

    evidence.json (JSON)
  • Open dataset

    Radiografía Web Mendoza — 52 anonymized rows; business names, domains, URLs and addresses removed (CC BY 4.0).

    radiografia-web-mendoza.json (JSON, CC BY 4.0)
  • Charts

    Generated from the evidence file, not drawn by hand; the figures should be regenerated from the evidence file rather than redrawn.

  • Method and limitations

    Covered in full as chapter 07 of this page; it documents how the data was produced and what it does not prove.

Bring measurement discipline to your own site

To build the same wave system — measure, publish, verify in the next window — on your own site, start with our SEO services or the free site speed test.