Semantics.rs
Semantics.rs/Case studies/How the map was built
Decision log

How the topical map for taxi.co.rs was built.

The case study shows what was done. This page shows how it was decided — which pages were rejected, on what criterion, and what the data later said about each decision, including one that did not work out.

Author: Precise Search SEO · Published and checked:
On this page
  1. Where it started
  2. Four decisions and their criteria
  3. What was rejected and why
  4. What the data says about each decision
  5. Three things we would do differently

Where it started

A national aggregator of taxi services with no physical location. That means no business profile and no local pack, so the organic result is the only entrance — and every structural decision has a direct consequence.

The macro topic is “taxis in Serbia”. The first question was not which pages to build but what unit carries the data. A fare is not national; it is set by the city. That single fact determined the whole map.

The decision method is described on the query template page; here it is applied to a specific project, with the decisions that were taken and the ones that were refused.

Four decisions and their criteria

Decisions taken and the metrics that justified them
DecisionMetrics passedReasoning
A city hub per cityDemand, different entity, patternEach city is a separate entity with its own services; the pattern “taxi [city]” exists for all of them.
A city fare page separate from the hubDemand, low similarity, patternThe predicates differ: the hub answers “who to call”, the fare page “how much it costs”.
One national fare pageDemand, different entityThe query “how much does a taxi cost in Serbia” asks for a comparison that no single city page can provide.
One calculator for the whole siteDemand, patternThe function is identical in every city; twenty-three calculators would be twenty-three near-identical pages.

The third decision was the most contested. A national fare page repeats data that already exists on the city pages, which is overlap by definition. The justification was that aggregation carries value no individual page has — comparison across cities — on the condition that the aggregation always returns the reader to the source.

That condition was not built in from the start, and it later became a finding in the audit.

What was rejected and why

The rejected pages are the more useful half of a map. Each of them looks reasonable until the threshold is applied.

Pages considered but not opened
ProposalWhich metric it failsWhere the content ended up
A page per intercity routeDemand — a handful of searches per route per yearA row in the intercity price table
A page per taxi serviceLow similarity — services share the same attributesA card in the list on the city hub
A separate page for the night tariffLow similarity — same entity, same predicateA row in the tariff table
A page per city districtDemand and entity — a district has no fare of its ownNot covered anywhere
A page per vehicle typeDemand — searched in combination with a city, not aloneA section on the city hub

The first row matters most. An aggregator carrying every route between twenty-three cities would produce more than five hundred pages, most of them with no query that deserves an index. That is the classic way projects of this kind fail — not through poor content but through volume.

What the data says about each decision

Figures come from the project owner's Google Search Console, 15 May – 14 August 2026, exported on 16 August. They are not publicly verifiable.

Performance by page type
PageClicksImpressionsPosition
Belgrade fare page65217,5954.01
National fare page35415,2695.35
Subotica fare page1202,3245.44
Vranje hub1106,4914.95
Belgrade hub866,6137.55
Home page772,9508.38

Separating the fare page from the hub paid off. The Belgrade fare page has nearly three times the impressions of the Belgrade hub and a markedly better position — 4.01 against 7.55. Merged, one page would have had to serve both intents and would probably have served neither fully.

The national fare page justifies its existence. 15,269 impressions at position 5.35 for a query no city page targets.

Three things we would do differently

The data also exposes one decision that did not work out — the one that seemed neutral when it was made.

  1. The home page is the weakest page on the site. 2,950 impressions at position 8.38 — worse than most city hubs. It was built as a junction to twenty-three cities, with no dominant intent of its own. The rule says the most important service-and-location pair should be targeted by the strongest page; here the home page targets no pair at all, so the strongest page became the Belgrade fare page. Not a disaster, but a missed opportunity.
  2. The national fare page began reproducing the Belgrade table. The condition attached to the third decision — that aggregation always returns to the source — was not built in from the start, so the hub started competing with its own subpage.
  3. A price guide was opened alongside the national fare page. Two pages for one query, the weaker of which ended at position 9.35. It cleared the demand threshold but failed on similarity, and that was not checked in time.

The second and third items have since been resolved and documented in the audit example. The first is still open.

Limitation: this is a decision log for one project, not a recipe. Every decision was made for a national aggregator with no physical location; for a local service with a business profile the priorities differ, as the control case shows.

Frequently asked questions

Why does each city have both a hub and a fare page rather than one page?

Because the predicates differ. The hub answers “which service to call in this city”, the fare page answers “how much it costs”. Same entity, different intent, so under the QDP criterion these are two pages.

Why is there no page for every route between cities?

Because it fails on demand. A route like “Belgrade to Kikinda taxi” has a few searches a year, so a separate URL consumes crawl budget without a single query that deserves an index.

Can the decisions in this map be transferred to another project?

The method yes, the numbers no. The demand threshold and the list of cities apply to this project. The leskovac.taxi control case shows the same approach producing a markedly weaker result elsewhere.