Tabu Methodology Overview

A conversation about pay without numbers is just narrative - both sides guess, and the stronger side wins.

Pay should be set by the work someone does, not by how well they negotiate. Unless negotiating is the work.

Tabu exists so that those numbers exist. This page explains where they come from, how they are calculated, and where their limits are.

Three things people say most often about Tabu

"Only unhappy people enter their salary"

The results are built from salaries entered or refreshed in the last 18 months - several thousand people. Fifteen to twenty new or refreshed entries arrive every day.

Every month we compare the average gross salary in Tabu with the one the Croatian Bureau of Statistics publishes for the IT sector. Over the past year the two have matched to within about 98%. Some months Tabu sits slightly above the Bureau's figure, some months slightly below.

If only unhappy people entered their salary, that gap would be neither small nor random. It would be large and always in the same direction - Tabu would consistently show lower salaries than the official statistics, and it doesn't.

In any case, Tabu never asks whether anyone is satisfied. It asks what they are paid.

"The numbers are made up"

The filter we wrote throws out entries we don't trust. Salaries like 1234, juniors on an implausibly high salary, or salaries below the minimum wage. People with more years of experience than years of life. Too wide a gap between the gross and net figures entered, and plenty more. The filter is called bullshit, and only salaries that get through it end up in the results.

Tabu never asks for the company name. That is deliberate: if a fake salary cannot hurt anyone in particular, there is no reason to lie.

Tabu's figure is often lower than the one other aggregators show. Not because our data is worse - others read job ads and don't filter extreme entries properly. At Tabu we try to show the actual situation, with context.

"Tabu works for employers"

A company using Tabu never sees anyone's individual salary, only medians, averages and ranges for a group. We do not sell or share data that could identify an individual - neither GDPR nor conscience allows it.

Companies pay for access to Tabu. That is what Tabu lives on, and that is why it is free for employees. That is the entire model, and we have no need to hide it.

The objection still doesn't hold up. A company that wants to pay as little as possible has no reason to buy market salary data - a company like that has no use for it. Companies that do buy Tabu tend to discover they are below the market, and then they raise salaries. We have heard that more than once.

The median a company sees and the median employees see are the same number. Tabu does not change the figure depending on who is looking.

The limits of this data

We do not verify entries, other than through the bullshit filter. Nobody sends in a payslip and there is no way for us to ask for one, so the filter catches the obvious nonsense but not the subtle kind.

If there are fewer than five people in a given combination of position and seniority, that comparison is shown to nobody - not to employees, not to companies. That way nobody can be identified by their salary.

Salaries older than 18 months do not enter the results. They are only used through projection, and the projection is accurate to around 90%. The projection is turned on in the filters.

Rare positions do not have enough data and stay out of the comparison.

Exactly how we calculate gross, how the projection works, and what we send to OpenAI for personalized advice - it is all below.

After the individual Tabu users complete a tailored questionnaire, their responses are stored in Google BigQuery for efficient processing and future use. Once processed, the data is presented in the Tabu application at app.tabu.hr as clear and readable reports.

Individual users can update their information every three months. When updates are made, the most recent data is used for all calculations. If a user confirms that their data remains unchanged, their previously submitted information is retained. To ensure accuracy, date filters in the dataset prioritize the latest entry for each individual, regardless of the time frame being analyzed.

To calculate average salaries, only data within three standard deviations of the overall salary distribution and above the minimum wage is considered. Years of experience and team size - key metrics users provide - are grouped to prevent the possibility of identifying individuals.

Salaries are displayed exactly as entered, without adjustments for the number of working days, ensuring transparency in representation.

Tabu applies a "bullshit filter" to exclude certain entries from salary comparisons, ensuring the reliability of results. The following types of data, among others, are removed:

This filtering process helps maintain the integrity and accuracy of the dataset.

By default, only data entered or updated within the last 18 months is included, as older entries are deemed outdated and less relevant for accurate comparisons.

Default filters

For the individual users, the default filters are set to include only the entries matching the following criteria:

For business users, the default filters are much the same, whether they are comparing their own employees or looking at the general market.

Net and Gross 1 Salaries in Tabu

Unfortunately, over 60% of Croatians do not fully understand gross salary. Instead of considering their gross salary - their official, total salary before taxes and contributions - they focus only on the amount they receive in their bank accounts each month. They call this "net" salary, even though it often includes additional tax-free allowances, such as transportation, meals, and performance bonuses, further adding to the confusion.

To address the widespread lack of understanding about gross salaries, Tabu initially allowed users to enter only their "net" salary, asking them to provide the total amount they receive each month, including allowances. However, as of March 21, 2023, gross salary entries are also supported. Users are asked whether they know their gross 1 salary. If they do, they provide both their net salary with allowances and their gross 1 salary. If not, they enter only their net salary with allowances, and Tabu calculates their gross 1 salary based on several parameters.

This is why the default setting on the Tabu platform is to look at net salaries with allowances - it's mandatory for individuals to enter it, and most communicate in it anyway.

If you'd like to learn more about gross salary and how it's calculated, check out our webinar with Toni Milun (in Croatian).

Approximate Gross 1 salary calculation

Croatia

For entries from 2022 and 2023, the following formula is applied:

((((salary - 132) - 763) * (1 / (1 - (case when salary - 132 >= 3981 then 0.3 else 0.2 end * (tax / 100) + case when salary - 132 >= 3981 then 0.3 else 0.2 end)))) + 763) * 1.25

For entries from 2024, the following formula is applied:

((((salary - 132) - 840) * (1 / (1 - case when salary - 132 >= 4200 then higher_rate else lower_rate end))) + 840) * 1.25

For entries from 2025 onwards, the following formula is applied:

((((salary - 132) - 900) * (1 / (1 - case when salary - 132 >= 5000 then higher_rate else lower_rate end))) + 900) * 1.25

Explanation:

Serbia

The formula used to convert net salary to gross for Serbia depends on the entered net salary amount.

If the net salary is lower than 4,376.70 + 21.29 EUR, the following formula is used:

(salary - 21.29) / 0.701

If it is higher, the following formula is used:

6242.08 + ((salary - 21.29) - 4376.70) / 0.9

Explanation:

Bosnia and Herzegovina

The formula used to convert net salaries to gross in Bosnia and Herzegovina is as follows:

((salary - 153) + 22.95) / 0.58

Explanation:

Projection of salaries older than 18 months

For users who haven't updated their salary in the last 18 months, we automatically estimate what it would be today. Those entries can then be included in the peer pool as if they were fresh.

Why: a large portion of Tabu data is older than 18 months. Without projection, those entries fall outside the peer pool, meaning less data for comparison. With projection, the peer pool is significantly larger and statistically more reliable.

How we calculate it:

  1. For each combination of position, seniority, and country, we calculate how the median salary has grown over the years.
  2. The old entry is multiplied by the appropriate growth factor from the year of entry to today.
  3. The factor is adjusted to the salary range (low salaries grow at different rates than high ones), so we use 5 percentiles (P10/P30/P50/P70/P90) with linear interpolation between them.
  4. If we don't have enough data for the narrowest combination (e.g. Backend Senior 1), we use a broader one (Backend Senior, or Backend overall).

Accuracy: the average absolute error of the estimate is around 10-11% in back-tests against actual salaries. It's larger for very low and very high salaries (up to 10% bias) due to inherent limitations of statistical models.

What we don't project: for rare positions (e.g. some leadership or niche roles) where we don't have enough data for the projection to be reliable, the old entries aren't included in the peer pool. This is about 10% of the total sample.

The filters determine whether only fresh salaries are included, or also the projected older ones.

OpenAI personalized advice

The OpenAI API is used to generate personalized advice on how to increase a salary. A Data Protection Agreement is in place with OpenAI to ensure GDPR compliance. Neither the user's name nor email address is sent to the OpenAI API - what is sent is salary and profile data, along with an internal identifier that distinguishes the entry from the others.

For the purpose of market comparison, the salary data of other users is also available to OpenAI, in the same form and without any identifier. That dataset sits permanently in an OpenAI vector store - it is not sent only at the moment an individual piece of advice is generated.

For each user with an up-to-date salary, advice is requested separately, using that identifier.

Advice is updated periodically, especially after a new salary entry. OpenAI does not use Tabu data for any other purpose, such as improving its LLM.

OpenAI prompt used for generating advice:

You have access to market salary data.

The salaries listed are monthly net or gross salaries: "salary" field is monthly net salary with monthly allowances, "salary_bruto" field is monthly gross salary.

You will be provided with a JSON description of a single user marked with a unique_id - this user is referred to as Advisee.

Use the market data only to REASON about where the Advisee stands: compare them to others on the same position, seniority, company type and contract type, and identify what higher-paid comparable people have in common.

Your task is to give the Advisee concrete, actionable advice on how to increase their salary, addressed directly to them (it will be sent to them).

The advice must be realistic, e.g. moving to another company type or size, a change of contract type, working in an IT company or not, or attaining higher education.

The advice can't be that the Advisee should change their seniority or position.

For development positions, you can advise a change of technology if comparable people on the same position and seniority using other technologies are paid noticeably more.

Pay attention to seniority and years of experience.

If the Advisee is female and comparable male colleagues at the same seniority are paid more, advise her to raise the gender pay gap in her company.

Company type 'Primarno vlastiti proizvod' means a product company, while 'Djelomično agencija i vlastiti proizvod' means it is partially an agency and partially a product company.

Do NOT state specific salary figures of other people and do NOT invent exact peer amounts - describe market comparisons qualitatively (for example: 'people at your level in product companies earn noticeably more'), never as a precise number attributed to a colleague. The only salary the advice may mention as a number is the Advisee's own.

Focus on the concrete action the Advisee can take, not on quoting numbers.

Return ONLY a JSON object with exactly these two keys and no other text: {"advice_hr": "<the advice in Croatian>", "advice_en": "<the advice in English>"}.

advice_hr must be natural standard Croatian only (not Serbian or Bosnian) and address the user informally ("ti").

advice_en must be natural English.

Neither advice may reduce the person to a commodity: never advise increasing one's 'value' or 'worth'; in Croatian never use 'vrijednost' or 'tržišna vrijednost' for a person, and instead frame the advice around what the salary could or should be.

Keep each advice to one or two short sentences, roughly 30 words maximum. Both values must contain no line breaks and must not contain the word 'Advisee'.

Terms of use for Tabu data

The data shown in Tabu is aggregated and anonymized - it never reveals an individual's salary or identity, only statistical indicators (median, average, ranges) for a group.

Allowed:

Not allowed without our agreement:

For commercial use or licensing of the data, contact us at info@tabu.hr.

Do you have questions related to the Tabu survey, your results or salary analysis? Fill out an anoymous contact form!

Contact us
Žuta zraka Tabu sticker
Linkedin logo

© 2026 Tabu