← all posts

Flipping the Noindex Switch, and Learning What My Paywall Was Hiding

2026-09-28

Last week Calculador Neto didn't exist on Monday. This week it's live and indexable, which sounds like a small step and turned out to be most of the work. Meanwhile Mind Journeys got a round of builder polish and, more importantly, the analytics to tell me whether any of it makes money. And the agent I was "poking at" a week ago started doing real cards.

Calculador Neto Goes Public

Before a Spanish tax calculator can ask Google for traffic, it has to be something Google — and a Spanish regulator — would be comfortable pointing people at. So the week started with the unglamorous part: an aviso legal, a privacy policy and a cookie notice. The site is run by my Australian company and serves Spanish users, so the legal pages have to explain why the identifiers are Australian and which EU rules still apply.

Analytics came next, and it's the piece I'm happiest with. PostHog only loads after a visitor accepts the analytics category — decline and posthog-js is never even downloaded. Calculator inputs travel in the query string (so a result is shareable), which means a naive setup would ship everyone's salary to an analytics server in every pageview URL. Every URL property is stripped to origin + pathname before sending, autocapture and session replay are off, and events are whitelisted per name so a stray property gets dropped instead of forwarded. I also chose to keep it in my existing US PostHog org rather than spin up an EU account, and the privacy page now says so plainly.

Then SEO. Each calculator got its own canonical landing page, the home page became a hub instead of competing with them, and every page got worked examples computed by the tax engine at render time — so an example can never drift from the calculator sitting right above it. There's a /metodologia page whose source list is generated from the citations attached to the tax data rather than typed by hand.

The part I'd copy into every project: the SEO baseline is locked down with tests. Unique titles, self-referencing canonicals with no query strings, sitemap completeness, and — the real point — no page is allowed to override robots itself, so indexability lives behind exactly one switch. On Friday I flipped it. preLaunchNoindex: false, the sitemap Search Console had been failing to fetch started resolving, and the launch-guard test now asserts the launched state, so going back would be a decision rather than an accident.

One self-inflicted mess worth remembering: I merged three stacked PRs within fifty seconds of each other, and GitHub only retargets a stacked PR once its parent branch is deleted. Two of them quietly merged into their parent branches instead of main. Lesson: merge stacks slowly, or not at all.

The week ended with the result redesigned so the monthly net is the hero, and a draft of eight curated "X euros brutos, cuánto neto" pages — deliberately small until Search Console shows me what people actually search for.

Mind Journeys: Builder Polish, Then the Money Question

Four small features for the journey builder, each fixing something that was technically possible but practically invisible. You can now audition a background sound on its own instead of previewing the whole journey to find out what Rain sounds like. Journeys can glide their tone over a step, not just the beat — with old saved journeys decoding the new field as nil so nothing changes for them. And editing a saved journey, which only ever lived behind a long-press nobody would find, now has visible Edit buttons.

The bigger piece was the paywall funnel. Monetisation was instrumented right up to "paywall requested" and then went dark until someone tapped Restore. Which plan did they land on? Which placement converts? Where do they bail? No idea. The catch is that the paywall is a Superwall web view the app doesn't draw, so there's no call site to hang events on. Instead a delegate maps Superwall's own events onto paywall_viewed, product_selected, purchase_started and friends, each carrying the same placement and experiment context so conversion reads per placement without a join. Nothing about the payment itself — price, currency, receipt — ever leaves the device.

Treating the App Store Like a Search Engine

The rest of the Mind Journeys work was marketing, done with the same rigour as code. A proposal for new English App Store metadata, checked against App Store search data rather than just Google volume — which showed the live subtitle hadn't ranked for either of its own phrases in seven weeks. Then a locale-by-locale proposal for the eight localised listings, which turned up literal translations that miss the term native speakers actually search for, plus a few sleep-aid claims that break my own no-health-claims rule.

Both are proposals only; App Store Connect is untouched until I decide. The marketing site also got a sitemap, SEO funnel events and editorial guidelines with a three-tier rule for scientific statements, so future pages can't turn preliminary binaural-beat research into efficacy claims.

Eve Starts Taking Cards

Last week eve was a toy. This week my Eve development agent routed a test PR across two repos, resolved a merge conflict on the legal pages, shipped the Mind Journeys paywall funnel from a Notion card, and has the English SEO pages open as a PR now. The branch names say retry-2 and retry-3, which is the honest part — it doesn't one-shot things, but it retries on its own and stops at a PR for me to review.

Next up: see what Search Console makes of Calculador Neto, decide on the App Store metadata, and let the paywall funnel collect a week of real data before I touch a single price.

#seo#nextjs#ios#analytics#automation