I Built a Free Tool for Spanish Tax Authorities. Then I Had to Decide Whether to Kill It or Monetize It.

Projects· 5 min read

I Built a Free Tool for Spanish Tax Authorities. Then I Had to Decide Whether to Kill It or Monetize It.

There was a moment, at the end of January 2026, when I sat in front of the Vercel dashboard and asked myself the question every builder avoids for as long as possible:

How long can I keep this free?

Conversor IAE CNAE had been indexing for months. The 2,247 detail pages—one for each official code among the 1,187 IAE epigraphs and 1,060 CNAE 2025 codes—were ranking. Organic traffic was growing without spending a single euro on ads.

But the server isn’t free. Neither is time.

What I did next wasn’t slapping aggressive banners on it and hoping for the best. It was designing a three-layer monetization architecture that wouldn’t destroy the tool I’d built.

Here’s how I did it.

Why the monetization model matters more than the tool itself

The classic technical builder mistake: you build something useful, throw in some aggressive ads, and three months later your bounce rate has spiked and Google has buried you on page 4.

In the case of Conversor IAE CNAE, the typical user is a freelancer, tax advisor, or someone at an accounting firm who needs to convert an IAE code to CNAE (or vice versa) to comply with AEAT or Social Security requirements. This is a user with very specific intent and very low patience.

The right question wasn’t how do I monetize? but how do I monetize without the user leaving before completing their search?

The three monetization layers

Layer 1: Google AdSense with deferred loading

The most obvious option, but implemented thoughtfully. Instead of loading ads aggressively at the start, I built AdSlot and AdContainer components with lazy loading and CLS (Cumulative Layout Shift) prevention.

Why does CLS matter? Because it’s a Core Web Vitals metric that directly affects Google rankings. An ad that causes layout jumps can cost you positions in search results. Ironic: bad ad placement can destroy the very SEO that generates the traffic the ads depend on.

The technical solution was reserving the ad space—with fixed dimensions—before it loads, so the layout doesn’t shift when the ad appears.

Layer 2: Offerwall with metered paywall

This was the most interesting decision. The Offerwall lets users access premium features by watching interactive ads, without paying. It’s a model that balances two things:

  • Users who don’t want to pay have an alternative
  • The business generates revenue without blocking users who don’t yet trust the product

I implemented a custom choice API that connects with the consent management system. The flow: user hits the free query limit → offered the option to watch an Offerwall ad or subscribe → based on their choice, their access state updates.

Technically, this relies on a subscription context provider that tracks the user’s authentication state in real time.

Layer 3: Stripe subscriptions

The most predictable layer from a business perspective. I integrated Stripe with webhooks to manage subscription states (active, cancelled, expired) with both monthly and annual plans.

What’s relevant here isn’t Stripe itself—anyone can integrate that—but the design decision: what stays free and what’s paid?

My answer: basic conversion is always free. What gets metered are bulk queries, exports, and advanced features. The product fulfills its core function for 90% of users without them paying anything.

The consent management problem (and how I simplified it)

This is where many developers get lost: GDPR, cookies, consent banners.

Instead of integrating a third-party CMP—which adds weight, dependencies, and complexity—I used Google Consent Mode v2 with Google Funding Choices as the single solution.

Concrete advantages:

  • Integrates directly with AdSense (same ecosystem)
  • Reduces third-party dependencies
  • dataLayer initialization before ad scripts load, ensuring consent propagates correctly

The February 8, 2026 commit (2d155d8) consolidated all of this: Offerwall, lazy loading, CLS prevention, and new ad placements.

What I learned about monetizing niche B2B tools

There’s an enormous difference between monetizing a mass-market product and monetizing a specialized tool for freelancers and tax advisory firms in Spain.

The B2B user has higher price tolerance but lower friction tolerance. Put up an aggressive paywall and they’ll just find the alternative on Google. Offer a smooth experience with reasonable options and they convert.

The three decisions that had the most impact:

  1. SEO first, monetization second. Don’t put payment layers on a product that has no traffic yet. SEO generates the user; monetization captures the value. In that order.
  2. Core Web Vitals aren’t optional when you have AdSense. Poorly implemented ads tank your rankings. Every ad placement has to pass the CLS test before going to production.
  3. Offerwall is underestimated in Spanish B2B niches. Most builders associate it with gaming or entertainment apps. But in a professional-use tool, the option to ‘watch an ad instead of paying’ can be exactly what a user needs when they’re not yet sure of the product’s value.

Project status in March 2026

As of today, Conversor IAE CNAE has:

  • 2,247 detail pages dynamically generated from Supabase
  • Three monetization layers active and running in production
  • Full-text search in Spanish with tsvector and GIN indexes across all 2,247 codes
  • Zero euros in paid advertising since day one

The last significant commit was February 24 (0ca3def): AdSense placement optimization on detail pages and subscription prompts.

The work now isn’t adding more features. It’s optimizing conversion within the three layers that already exist.

Takeaway

If you’re building a niche tool—especially in the Spanish B2B market—monetization isn’t a product decision you make at the end. It’s an architecture decision you make from the beginning.

Two concrete actions you can take today:

1. If you have AdSense, check your CLS in PageSpeed Insights. If you have layout jumps from ads, you’re paying the cost in SEO.

2. Before hard-blocking with a paywall, consider an Offerwall. In niches where users have alternatives, friction costs you more than the paywall generates.

We keep building.

Brian Mena

Brian Mena

Software engineer building profitable digital products: SaaS, directories and AI agents. All from scratch, all in production.

LinkedIn