Skip to content
Public methodology

How the numbers are made

Every salary, savings, and ranking figure on this site is either measured (computed from reviewed reports by tech workers) or modeled (an estimate produced by a documented model). This page explains both, end to end: where the data comes from, how it is screened, and exactly where judgment enters. The method is public. The raw dataset is not: individual reports are only ever shown anonymized, and there is no bulk export. You should not have to trust us to check how a number was produced.

Reports received

1,513

every one reviewed
Published

1,492

approved into the dataset
Rejected

21

kept out of every aggregate

Crowdsourced salary reports: the measured side

The salary, savings, and livability data on /data, in the compensation report, and across the research library comes from tech workers reporting their own numbers. No report reaches a public aggregate without passing the pipeline below.

1. Submission

Reports arrive through the contribute form, anonymously. A report must carry the fields the analysis needs (country, city, pre-tax total compensation, after-tax pay, yearly savings, lifestyle, household size, and share of household expenses); happiness and infrastructure ratings are optional. The form is rate-limited per IP and carries a hidden honeypot field, so bulk bot submissions are dropped before they are stored.

2. The outlier gate

Unusually high claims are challenged at the door. A report whose pre-tax pay is at least 3x the current median for its country (with a €150,000 floor so low-median countries do not over-trigger) must include a contact email before it is even stored, so a human can verify it instead of guessing. The same gate fires on self-contradicting money, such as savings above gross pay. An outlier we cannot verify is rejected by default. The email stays private and is never published.

3. Automatic integrity checks

Every stored report starts as pending, and deterministic checks run on every review pass. They are arithmetic, not AI, so they behave the same way every time. Among them:

  • Money that contradicts itself: take-home above gross, savings above take-home, negative amounts.
  • Values outside their own domain: households of zero, expense shares outside 0 to 100 percent, ratings outside the 0 to 10 scale.
  • Plausibility flags: an annual gross that is really a monthly figure, an effective tax rate no European country charges, a country label we cannot recognize.

On top of that, an AI cross-check can compare a report against the same reference model the job board uses (is this pay plausible for that city and level?). Its output is advisory: it never approves or rejects anything on its own.

4. Human review, recorded

A human makes the final call on every report, with the checks above in front of them. Every decision is recorded (who reviewed, when). Rejected reports are kept and flagged, never silently deleted, and are excluded from every public number. As of today that trail covers 1,513 reports: 1,492 published, 21 rejected. These counts are live from the database, not copywriting.

5. Publication

  • Only approved reports enter the aggregates, which recompute from the live database and are cached for at most an hour.
  • Everything public is anonymized: aggregates by country and city, plus anonymized individual entries with no names, emails, or free text. The full dataset is not available for download.
  • Sample sizes are shown on every ranking row. Rows backed by fewer than 25 reports are marked in amber: read them as indicative, not definitive. A place needs at least 5 reports to be ranked at all.
  • The Overall ranking blends financial outcomes and livability 60/40, with Bayesian shrinkage (k=10) pulling thin samples toward the population average so a country with two ratings cannot swing the board. The full formula, with all three safeguards, is on /data under "About this data".

Job-board pay and savings figures: the modeled side

The 15,000+ European jobs and 3,000+ remote jobs on the boards mostly arrive without a posted salary, so every job card shows an estimated total compensation and savings figure instead of a blank. These are model outputs, labeled as estimates on the board, and this is the model. If a posting itself states pay, the posting is the authority; our columns are estimates around it.

How an estimate is built

  • Location baseline. Hand-maintained reference tables hold what top-of-market employers pay in each city at each level, from entry to principal. A job matches its city first, then falls back to the country average.
  • Seniority from the title. Levels are classified from the job title, with company-specific corrections where titles are known to run inflated (an Oracle or Microsoft "Principal" maps to the level the wider market would call it).
  • Company pay tier. Companies map to four tiers, T0 to T3, that scale the baseline by 1.3, 1.15, 1.0, and 0.65. Any company not on the list gets the neutral tier (1.0).
  • Savings. Savings are modeled as total compensation minus cost of living minus tax, per country, level, and lifestyle (frugal, comfortable, luxurious), from hand-maintained tables. Above senior (staff and principal), where independent table data is thin, savings are synthesized from the senior row plus the slope of pay growth: extrapolated, and labeled here as such.
  • Coverage fallbacks, board only. A job in a country the tables do not cover borrows the nearest comparable covered country (Belgium reads France, Greece reads Spain), with a European median as the last resort, so a card is never blank. These imputed values exist only on the job board: the aggregates on /data and in the compensation report never include one.

Where judgment enters, on purpose

Tier assignments start from measured pay data (published senior engineer salary benchmarks, normalized to euros) and are then curated by hand. That curation is a judgment call, and we own it: for a few companies we deliberately keep the tier above their measured median, where we think the published median undersells what real European offers look like. A tier is data-informed judgment, not a pure measurement, and every estimate built on it inherits that. The crowdsourced side carries no such adjustment: what tech workers report is what the aggregates show.

Treat every estimate as an estimate. A real offer depends on the interview, the team, the year, and you; it can land outside our range. The estimates exist to make jobs comparable at a glance, not to promise you a number.

Who pays, and how ranking works

EuroTopTech is candidate-funded: members pay for access, and that is the entire business model. Employers pay nothing and cannot pay anything. Jobs are found by our ingestion pipeline and curated by us; they are not submitted, sponsored, or boosted by the companies behind them. There are no promoted listings and no featured placement. The boards sort by what is on the card: newest first by default, or pay and savings estimates, your filters, and your CV match if you sort by those. No employer can buy a position in the feed, which also means no listing you see is there because someone paid for your attention. More on how the site makes money on the trust page.

What to keep in mind

  • Self-reported data has self-selection: people who read a European tech careers site and choose to share skew toward the engaged top of the market. The data describes top-of-market European tech, not average pay.
  • Sample sizes vary a lot by country. The n is shown on every row; trust a 200-report median more than a 6-report one.
  • Modeled estimates inherit their assumptions, including the curated tiers above. When a job posting states real pay, believe the posting.

Spotted a number that looks wrong? Email info@eurotoptech.com and a real person will check it.


See it in practice

The dataset sharpens with every report: contributing takes 2 minutes, anonymously.