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.