Discuss project

hinnaguru.ee: A Price Directory Built on Estonian Open Data

I launched a directory of service prices and providers in Estonia on Business Register and Tax Board data. What open records reveal and why Google's top 10 is not a shortlist.

Vladislav KrivorutskoAugust 11, 202612 min read
Contents

TL;DR - key points

  • hinnaguru.ee answers two questions on one page: what a service costs in Estonia and who to hire for it
  • The data is not hand-collected but pulled from state registers — the Estonian Business Register and the Tax Board's debtor list are both open and free
  • The key figure no directory carries is a company's turnover in that specific field of activity, not its total revenue
  • Google's top 10 and the list of the largest companies in a niche overlap poorly: some significant players are invisible in search entirely
  • The site only just opened to indexing — there is no traffic or ranking data yet, so this is an architecture and data teardown, not a results case study

What the project is

hinnaguru.ee is a directory of service prices and providers in Estonia. Someone arrives with the question "what does a move cost and who should I hire" and gets the answer on a single page: real prices from company price lists, a range and a median, and alongside them a provider list carrying data from state registers.

The difference from a conventional directory comes down to one thing: companies do not pay to be listed, and what is known about them is not their own account of themselves. Years in business, headcount, turnover in that field of activity and any tax debt come from the open Business Register and Tax Board extracts, with a date and a source next to every value. So far 66 services are covered, with 1,096 companies listed and 3,487 price entries.

Let me state the limits up front: the site has only just opened to indexing. I have no traffic, no rankings and no enquiries to show, and I am not going to pretend otherwise. This article is about how the project is built and what surfaced in the data, not about results.


Where it came from: people do not want to fill in forms

My previous project in this niche was a request marketplace: the user describes a job, companies respond. Almost nobody submitted a request. The post-mortem surfaced an uncomfortable finding — the audience was not there for brokerage. It was there for two things: to understand what the job should cost, and to get the contractor's contact details. The form between those two steps was not a service but an obstacle.

Hence the central architectural decision behind hinnaguru.ee: there are no enquiry forms at all. Company contacts are open, the link to the company's own site is direct, and the project does not place itself in the middle. That deliberately cuts off the most obvious way to monetise — selling leads — in exchange for the page honestly answering the question the visitor arrived with.

The lesson generalises beyond directories: when users do not complete the action you want, the problem is not always the button and not always conversion mechanics. Sometimes the action on offer is simply not the one they came for. It is the same conversation as the gap between traffic and enquiries, except the answer here was "remove the form", not "redesign the form".


What Estonian open data actually gives you

This is the most underused part. Estonia publishes machine-readable extracts for free under an open licence, and hardly anyone builds on them.

SourceLicenceWhat it gives
Business Register open dataCC BY 4.0Name, registry code, VAT number, registration date, address, fields of activity, headcount, turnover broken down by field of activity, annual reports
Tax and Customs Board debtor listCC BY-SA 3.0Outstanding tax debt, updated daily
The companies' own websitesPrice lists, service composition, identifiers for matching against the register

The project database holds the register in full — 376,043 legal entities. The register refreshes weekly, the debtor list daily.

The key row in that table is turnover broken down by field of activity. That single field is what turns a directory from another list of phone numbers into a tool. Total revenue answers how big a company is in general, not whether it does the thing you came for and at what scale.


The main finding: Google's top 10 is not the niche's shortlist

I ran the first service — moving — through the pipeline by hand, before the pipeline was even written, specifically to see whether the data would diverge from search results. It did, and more sharply than I expected.

What the data shows and search does not:

  • A company with €1.3M in revenue does €86,000 of it in this niche — 6.6%. It is a haulage firm that handles moves as a sideline. In search results it looks like a major player; within the niche it is smaller than a small firm doing €160,000 of moves and nothing else.
  • A company with €1.4M of turnover specifically in moving appeared on none of the first five pages of results. It was found by back-filling from the register by activity code. Weak site, no SEO — as far as Google is concerned it barely exists.
  • A company showing positive reviews in search results carried a five-figure tax debt. Nothing in the results hints at it.
  • A company registered a year earlier, with €17,700 in revenue, sat in the results beside twenty-year-old firms.

The conclusion I take from this as an SEO: search ranks websites, not businesses. That is obvious as a sentence, but putting two columns side by side — search position and niche turnover — shows how loosely they are coupled. For a strong company with a weak site that is good news: the competitors above you often hold those positions not through scale but because somebody worked on their website. What that gap looks like from inside a niche is something I showed in the casino affiliate niche teardown — the same picture by different means.


What turned out harder than the spec assumed

The honest part. On paper the pipeline looked simple: take the search results, parse the sites, match to the register, collect prices. The very first manual run surfaced four things the spec did not contain.

1. Matching a website to a legal entity is twice as hard as it looks. The registry code on the site — "the most reliable signal" — was present on 5 sites out of 10. The VAT number added three more, including the only company with a proper price list. Total: 8 of 10. Two sites gave neither.

2. Site networks turned out to be routine. One company had four separate domains for a single service; two others had two each. Without deduplicating by registry code the list would have been twice as long and twice as useless, with the same company occupying half a page under different names.

3. Two legal entities on one website. One site carried two registry codes — different companies, different counties, different founding years. Taking whichever came first would have meant attributing data to the wrong one.

4. Prices in identical units are not comparable. Six rows all read €/hour, but €25/h is one worker with no vehicle and €68/h is a worker with a 14 m³ van. An average across that set lies in both directions. Service composition had to become part of the model: today the moving page calculates a median separately per composition — "van up to 15 m³ + 1 worker" and so on — and prices with unstated composition are flagged as non-comparable and excluded from the median. Of 34 companies, 13 publish prices in any form.

One small tactic that paid off unexpectedly well: domains for register-sourced companies were found not by paid search queries but by trying obvious variations of the company name and verifying the registry code on the site itself. Four hits out of fifteen attempts, at no cost.


Why this is programmatic SEO, not page spinning

The 66 service pages are assembled from a database through one template — formally exactly what gets called programmatic SEO. The difference from the usual meaning lies in the data source: the pages are not built by permuting words in a template but from data competitors do not have. A service page exists because a register, price lists and niche statistics have been gathered behind it, not because there was one more name on a list.

That produces rules I hold strictly:

  1. A publication threshold. Fewer than three providers and the page does not ship: it fails to answer "who should I hire".
  2. A section appears when there is data for it. An empty block tells the reader the project does not know the thing it set out to explain.
  3. Never invent. No price means the page says there is none. If the legal entity could not be identified, no link is made. Attributing someone else's data to a company is worse than showing no data at all.
  4. No value judgements. "Trading since 2011" is a fact. "Reliable company" is a judgement that eventually arrives as a complaint.

Where that line runs and what Google actually penalises in generated pages is covered separately in the article on programmatic SEO. The short version: scale itself is not the problem, scale without data is.

Technically it is Next.js with static generation over PostgreSQL, with the collection pipelines split out into separate Python scripts. The two pipelines — the register loader and the site analyser — are deliberately separate: the first runs on a schedule and breaks when an export format changes, the second runs one service at a time and breaks when somebody redesigns their site. Merging them would produce a system that stops entirely for either reason.


What you can take from this

Even if you have no use for the directory, the open data is useful right now.

If you are choosing a contractor in Estonia — ten minutes of checking:

  1. Find the company in the Business Register by name or registry code.
  2. Check the year of registration and whether annual reports have been filed for recent years. Gaps are a signal.
  3. Check the turnover in the exact field of activity you came for, not the total.
  4. Check the company against the Tax Board's debtor list.
  5. Confirm that the registry code on the company's website matches the entity you are looking at — site and legal entity are far from always obviously linked.

If you provide services yourself — look at your own company the same way. Is the registry code published on your site, is there a price list with the service composition stated, is it visible how long you have been trading? This is not SEO as such; it is that the data about you is already public and will eventually end up in a table next to your competitors. The only open question is who builds that table first.

If you are building a content project — look for data competitors do not have before you think about structure and copy. Working out what to build your site structure from is far easier once you know what makes your page different from ten identical ones. Without such a source, generating pages programmatically will not rescue it.


What the project deliberately does not do

Limits matter more than capabilities, so here they are directly.

  • It does not sell placement. Not through paid profiles, not through advertising. A paid profile buys a logo and a self-written description — and not one position upward.
  • It does not rate quality of work. The score on the page describes the completeness and transparency of public data, not whether the company does good work. No reviews are collected.
  • It does not broker. The enquiry goes straight to the company; the project is not a party to the transaction.
  • It deletes nothing. Rejected records stay in the database with a reason — for re-checking, and for the honest line "there are N companies in this niche, we show M".
  • It is Estonian only for now. These services are searched for predominantly in Estonian, and splitting effort before the model is validated is not justified. Why I treat that as a separate decision at all is covered in which language to target for SEO in Estonia.

The next test is not traffic but data: how many services clear the threshold of three providers with verified identifiers. If a niche cannot reach three, it gets no page, however attractive the query looks.


What comes next

The near-term plan is simple: extend the list of services, raise the share of companies with comparable prices, and watch how what is already published gets indexed. I will write about results when there are results — with numbers rather than impressions.

If you need a data-driven content project of this kind — from collection and data model through to web development and search optimisation — this is exactly the work I do on my own projects and on client ones. The only difference is that on my own I risk my own time first.

Results

Services covered

66

pages with prices and providers

Companies listed

1,096

with register data

Price entries

3,487

each with a source link and date

Legal entities in the database

376,043

the entire Business Register

Frequently asked questions

What is hinnaguru.ee?
It is a directory of service prices and providers in Estonia. Each service gets one page: a price range and median taken from company price lists, a provider list carrying state register data — years in business, headcount, turnover in that field of activity, whether the company has tax debt — and an explanation of what drives the price. There are no enquiry forms: company contacts are open and the visitor approaches the company directly.
Where does the company data come from?
From two state sources. The Estonian Business Register open data (CC BY 4.0) provides the name, registry code, VAT number, registration date, fields of activity, headcount and turnover broken down by field of activity. The Tax and Customs Board debtor list (CC BY-SA 3.0) provides outstanding tax debt. Prices are taken from public price lists on the companies' own sites, and every price carries a link to the source page and a collection date.
Can I check an Estonian company on open data myself?
Yes, and for free. For a one-off check the Business Register and the Tax Board's debtor list are enough. Look at four things: the year of registration, whether annual reports have been filed for recent years, the headcount, and the turnover in the exact field of activity you came for. Doing this at scale is a different job — it needs the open data extracts and a database, not manual lookups.
Why does turnover in a field of activity matter more than total revenue?
Because total revenue answers a different question. A company can report over a million euros in revenue and do the service you need on the side for a few tens of thousands — in my moving-services sample one such case worked out to 6.6% of total revenue. The client sees a large company, while inside the niche it is smaller than a small firm that does nothing else. The breakdown by field of activity is in the Business Register open data, and it is what answers the question of whether they actually do this work at all.
Does a top 10 ranking in Google mean these are the best companies in the niche?
No, and the data shows it plainly. Search ranks websites, not businesses: whoever invested in a site and SEO gets to the top. Cross-checking search results against the register by activity code regularly turns up companies with substantial niche turnover that appear on none of the first five result pages — usually because their website is weak or barely exists. The reverse holds too: some sites at the top belong to companies with minimal turnover in that field.
How is the provider order decided, and can a position be bought?
A position in the list is not for sale at any price — the whole point of the project rests on that. The order comes from a calculation whose formula is written out in full on the methodology page: 100 points across seven parts — years in business, consistency of annual reports, size within the field of activity, headcount, tax debt, price list publication and website transparency. An important caveat: this score describes the completeness and transparency of public data, not the quality of the work. The project collects no reviews and does not rate workmanship.
What language is the site in, and will there be other versions?
The first version is Estonian only, and that is a deliberate decision rather than a shortage of time: these services are searched for predominantly in Estonian, and spreading resources across three languages before the model itself is validated makes no sense. The data structure is ready to take a second language, so other versions are possible — but only after the Estonian one shows the model works.

Conclusion

The main takeaway from this work is not about the directory but about the data: Estonia publishes enough to learn more about a prospective contractor in one evening than they will tell you on their own website — and almost nobody uses it. Turnover in a specific field of activity, years in business, headcount and tax debt all sit in open Business Register and Tax Board extracts under a free licence. If you are choosing a contractor, spend ten minutes checking. If you are the contractor, look at what open data says about you, because your clients will be looking at it soon enough.

About the author

Vladislav Krivorutsko — founder of ADLAB
Vladislav Krivorutsko

Founder of ADLAB OÜ · SEO and Google Ads

Over 20 years in search traffic and monetization, and on the Estonian market since 2017. I work solo: I run the audit, build the strategy and deliver the project myself — no subcontractors, no templates. I only write about what I have tested on my own and client sites.

  • 20+ years in search traffic
  • 50+ end-to-end projects
  • Own sites in competitive niches
  • SEO for ru/et/en in one market
More about me

Read next