Illustrative case study

A fictional business. The figures are a modelled scenario, not a client result.

Varanda Imóveis · Property portal · São Paulo

How a São Paulo portal turned 96 bairros into rankable, crawlable pages

+231%organic sessions
in 13 months · Home & Real Estate
Organic sessions / month
210k → 695k
Neighbourhood pages indexed
140 → 2,300
Server response time
1.4s → 0.3s
Isometric city block of eight bairro clusters at month 13: 2,300 neighbourhood pages indexed.
Sessions
695k
Indexed
2,300
TTFB
0.30s

140 pages at month 0, 2,300 pages at month 13. Solid floor ≈ 25 indexed pages; dashed floors exist but are not indexed yet.

Inspect a cluster

Pinheiros: 12 bairros, 290 of 290 pages indexed (12 of 12 floors). Template: /imoveis/sp/pinheiros/aluguel/

The challenge

Ninety-six bairros. Forty-one thousand URLs. Almost none of them ranking.

Neighbourhood search pages were generated from parameters, duplicated, slow, and largely ignored by Google.

Varanda Imóveis lists rentals and sales across São Paulo, but its neighbourhood pages only existed as search results. Every combination of sort order, price band and page number produced a new address, so Google met the same Pinheiros listings under hundreds of URLs and trusted none of them. Only 140 bairro pages made it into the index, and the ones that did loaded in 1.4s.

Crawled last week · one bairro

  • /busca?bairro=pinheiros
  • /busca?bairro=pinheiros&ordem=preco
  • /busca?ordem=preco&bairro=pinheiros
  • /busca?bairro=pinheiros&pagina=1&quartos=2
  • /busca?bairro=pinheiros&ordem=recente&min=3000
  • …and 431 more variants of the same page

Diagnosis

What the logs, the crawl and the templates told us.

TechnicalF01

41,600

URL variants

Parameter explosion

Sort, page, price and filter parameters combined freely, turning 96 bairros into tens of thousands of crawlable, near-identical URLs with no canonical.

CrawlF02

91%

of Googlebot hits

Budget spent on duplicates

Log analysis showed nine in ten crawler requests landing on parameter variants; core bairro pages were recrawled every 19 days on average.

TechnicalF03

0

crawlable page-2 links

Pagination behind a button

A JavaScript “ver mais” button loaded listings 21+ with no href, so most inventory in large bairros was never discovered.

PerformanceF04

1.4s

median TTFB

Uncached search on every hit

Each request ran a live listings query. Crawlers and users waited the same 1.4 seconds before the first byte.

ContentF05

38

unique words / page

Swapped-name templates

Bairro pages shared one paragraph with the name swapped in. No prices, transport, schools or stock signal that a buyer could use.

SchemaF06

0

structured-data types

Invisible to rich results

No BreadcrumbList, ItemList or listing markup; Google had no machine-readable link between a page, its bairro and its zone.

The strategy

Zone the city. Then build it up, floor by floor.

Built on our Signal plan: technical foundations first, so every page we published landed on clean, fast, crawlable ground. Four tactics, in the order the city needed them.

  1. 01

    Programmatic SEO

    /imoveis/sp/{bairro}/{intent}/

    One clean template per bairro × intent (venda, aluguel, apartamento, casa, 2-quartos, perto-do-metrô), published only when live stock passed a minimum of 12 listings, with real price medians, transit lines and stock counts written in.

  2. 02

    Pagination

    <a href="?pagina=2" rel="next">

    Replaced the JS button with plain linked pages, self-canonical on each page, a view-all cap of 60 listings, and noindex on sorted variants so depth became crawlable but not duplicated.

  3. 03

    Crawl budget

    Disallow: /*?ordem=

    Robots rules and parameter stripping for sort and filter combinations, XML sitemaps split by zone with lastmod from stock changes, and edge caching that took TTFB from 1.4s to 0.3s.

  4. 04

    Structured data

    "@type": "ItemList"

    BreadcrumbList from zone to bairro to intent, ItemList for the listing grid and Place data per bairro, validated against every template before each release.

13 months, 13 floors

How the block went up.

  1. M01Audit

    Log files and crawl map

    30 days of server logs mapped against 41,600 discovered URLs.

    152
  2. M02Audit

    Template inventory

    96 bairros scored for stock depth, demand and duplication.

    214
  3. M03Foundation

    Parameters fenced

    Sort and filter variants stripped or blocked; canonicals set.

    380
  4. M04Foundation

    Edge cache live

    Listings cached at the edge; TTFB falls under 0.8s.

    615
  5. M05Build

    First 24 bairros

    Highest-demand cluster published on the new URL scheme.

    890
  6. M06Build

    Linked pagination

    Page-2+ links shipped; deep inventory starts to be crawled.

    1,170
  7. M07Build

    Schema everywhere

    Breadcrumb, ItemList and Place markup across all templates.

    1,450
  8. M08Scale

    All 96 bairros

    Remaining clusters released; zone sitemaps submitted.

    1,715
  9. M09Scale

    Intent pages

    Casa, cobertura and 2-quartos variants where stock allowed.

    1,925
  10. M10Scale

    Transit layer

    Perto-do-metrô pages for 31 bairros on metro lines.

    2,080
  11. M11Refine

    Thin-page pruning

    148 pages below stock threshold merged into parents.

    2,190
  12. M12Refine

    Internal links

    Neighbour-bairro modules close the last orphan pages.

    2,262
  13. M13Refine

    Steady state

    2,300 pages indexed; crawl waste under 12%.

    2,300

Bars: neighbourhood pages indexed at the end of each month.

Results

+231% organic sessions, on a city the crawler could finally walk.

Modelled scenario for a fictional business — not a client result. Rankings and traffic are never guaranteed; see our Terms.

Organic sessions / month210k to 695k
0k200k400k600k800kM1M3M5M7M9M11M13+231%
Neighbourhood pages indexed140 to 2,300
012345678910111213
Server response time1.4s to 0.3s
Before1.4s
After0.3s

Bairro queries, before and after

Google positions for sample neighbourhood queries, month 0 versus month 13
Query (pt-BR)BairroSearches / moBeforeAfter
apartamento para alugar pinheirosPinheiros9,900413
imóveis moemaMoema6,600242
casa à venda vila marianaVila Mariana4,400524
apartamento 2 quartos moocaMooca3,600not in top 1005
studio para alugar repúblicaRepública2,900676
casa à venda butantãButantã2,400443
cobertura santanaSantana1,300not in top 1007
apartamento perto do metrô lapaLapa1,000not in top 1004
Before · position 41

varanda-imoveis.example › busca?bairro=pinheiros&ordem=preco&pagina=3

Busca de imóveis - Varanda

Encontre imóveis. Resultados da busca para pinheiros ordenados por preço…

After · position 3

varanda-imoveis.example › imoveis › sp › pinheiros › aluguel

Apartamentos para alugar em Pinheiros, SP | Varanda Imóveis

412 apartamentos disponíveis · aluguel mediano R$ 4.300 · linha 4-Amarela e 2 estações de metrô.

1 quarto2 quartosPerto do metrôCom varanda

Illustrative results-page mock-ups for the query “apartamento para alugar pinheiros”. Positions, page copy and stock counts are modelled for illustration.

Your city, rebuilt

Get a plan like this

Hundreds of location or category pages that Google ignores? Signal fixes the ground before anything goes up on it.