Skip to main content
BlogSaaS Building

Why We Built Carriva: 18 Months Shipping a SaaS for Retirement Advisors

An honest account of choosing a niche nobody else wanted, the moats we found by accident, and the bugs that taught us what advisors actually need.

Why We Built Carriva: 18 Months Shipping a SaaS for Retirement Advisors

In April 2024, we sat down with a CGP in Grenoble who showed us a 14-page PDF document called a Relevé Individuel de Situation (RIS). He explained, in the resigned tone of a man who has done this 800 times, that he would now spend the next 90 minutes hunting for missing trimesters, MDA enfants flags, and bad employer codes. We watched him squint at scanned columns from 1987. We made him a coffee. By the time the coffee was cold, we had decided to build Carriva, a vertical SaaS retirement advisors could plug into and stop bleeding hours.

Eighteen months later, Carriva is live on carriva.fr with 534 prospects in our pipeline, 20 reached in mid-April, and an active tester (Jean-Luc Caturla) who logged six bugs on April 22 that taught us more in one phone call than a quarter of analytics could. This post is what we wish someone had told us when we picked the niche.

The niche was the moat, and we almost picked the wrong one

When you tell engineers you are building software for French retirement-advisory firms, the most common reaction is a polite head tilt followed by "is that actually a market?" That reaction is exactly why the niche works.

The total addressable market in France is roughly 3,000 CGP and CGPI cabinets serving an aging population that increasingly suspects (correctly) that their RIS contains errors. The dominant incumbent is Factorielles with a product called Zoom Carrière. We assumed at first that Factorielles was a generic CRM player and we could win on AI. We were wrong. Factorielles is a real, focused competitor and the head-on framing was a mistake.

What saved us was reframing what Carriva actually does. We are not a simulation tool projecting a retirement date. We are an audit tool for the past, finding errors and omissions in an existing official document. That distinction sounds pedantic. It is not. It changes the SEO targets ("erreur RIS", "anomalie RIS", "vérification trimestres" instead of the saturated "simulation retraite gratuite"), it changes the sales pitch (advisors do not want another simulator, they want an evidence layer for the conversation they already have), and it changed what we built.

The difference between AUDIT and SIMULATION is not marketing. It is a different product, a different customer pain, and a different SEO universe.

If you are evaluating a vertical, do not just ask "is there a competitor?" Ask "is there a sub-niche inside the niche where the dominant player is weaker than they look?" For us that sub-niche was the audit angle plus a free B2C detector that brings end-clients into the funnel and gives advisors a tool to share at their first meeting.

The technical decisions we did not regret

We built Carriva on Next.js, Postgres, Stripe, and a RAG-powered assistant that retrieves from a corpus of pension-rules documentation. The whole thing runs on a single VM (VM 106) on a Proxmox host we own, behind a Cloudflare Tunnel, with deploys done by SSH and a deploy.sh script. Yes, really.

We made three calls early that we still endorse:

  1. Multi-tenant from day one. Even when we had zero customers, every table had a tenant_id and every query was scoped. The day a CGP cabinet asked "can I onboard my three associates?", we said yes in 20 minutes instead of 8 weeks. We wrote up the multi-tenant playbook for small studios separately because it deserves its own post.
  2. RAG, not fine-tuning. Pension rules in France change. The Code de la Sécurité Sociale gets updated. Fine-tuning a model would have been a maintenance nightmare. A vector store of authoritative documents that we can refresh without retraining anything is the only sane path. We unpacked how RAG behaves in regulated industries in another post.
  3. Single VM, owned hardware, real DNS. We pay one electricity bill, not a Vercel bill that scales with marketing campaigns. We have full control of the database. When we need to dump the Postgres for a tester at 11pm on a Tuesday, we do.

The decision we are still chewing on is the LLM provider. We use OpenRouter behind a router so we can swap. So far we have stayed with one provider, but the day prices spike or quality drops, the swap is a config change.

The 6 bugs Jean-Luc reported in 36 minutes

On April 22, Jean-Luc Caturla called us. He is a CGP in active practice. He had been using Carriva on real client files for two weeks. He spent 36 minutes on the phone walking us through six bugs:

  • A Francs to Euros conversion was applying the 6.55957 rate to a column that was already in Euros.
  • The base régime and complémentaire totals did not cross-check (off by 1.5 trimesters in his test case).
  • The RCI line was being parsed as a regular activité salariée, which inflates trimester counts.
  • The 1965 cohort was getting a wrong réforme cutoff (we had hardcoded 1964).
  • A specific employer code (we will not name it publicly) caused a silent skip of an entire year of contributions.
  • The export PDF cut off the assistant's last paragraph if it ran longer than 1,800 characters.

Three of these bugs we would never have found in a unit test. They required a human who has read 4,000 RIS documents to look at our output and say "no, this is wrong, here is why." That is the moat of a vertical. You cannot fake the domain knowledge, and the domain expert testing your product is worth more than any synthetic dataset.

We ship every bug fix the day it is reported when feasible. By April 25 all six were closed. Jean-Luc is now an evangelist, not because we paid him but because we listened and shipped fast.

What 534 prospects taught us about cold outreach

We built our prospect list manually from public CGP directories. By April 14 we had reached out to 20 of them. The conversion to a meaningful conversation was lower than we wanted (around 18%) and the lessons were sharp:

  • Cold email subject lines about "AI" got worse open rates than subject lines about "anomalies dans le RIS de votre client". AI is not the value proposition. The outcome is. We rewrote everything.
  • "Free B2C detector" landed in 5 out of 5 first calls. Advisors immediately understood that a public-facing tool that finds errors on a prospect's RIS is a marketing weapon for them.
  • The price needs to be visible. Our first version hid pricing behind a contact form. Prospects assumed we were enterprise-tier and stopped reading. Putting the price on the page roughly doubled qualified inbound.

The brutal truth is that 18 months in, our biggest growth lever is not the product, it is the willingness to do customer development weekly. We borrowed heavily from Rob Fitzpatrick's book and wrote about running Mom Test interviews on Carriva prospects as a separate playbook.

The mistakes we are still paying for

In the spirit of honesty:

We over-engineered the early admin panel. We spent 3 weeks building a multi-tenant superadmin UI before we had two tenants. That was 3 weeks we did not spend on the audit engine accuracy. The first version of the admin panel got rebuilt twice anyway.

We used a role field on the session for admin checks for too long. Eventually we standardized on is_platform_admin because the role enum bloated and was used inconsistently across pages. If you are starting fresh, design your auth role boundary on day one and never sneak a "kind of admin" check past it.

We delayed analytics. For the first 6 months we had no funnel visibility. We could not answer the question "of the 100 people who landed on the pricing page, how many clicked Stripe?" That is malpractice. The lesson is to wire analytics from week one even if it is the simplest possible setup.

What is next for Carriva (and what we wish we had known)

Right now we are doubling down on three things:

  1. More CGP testers in active practice. Synthetic test data is fine for unit tests. It is useless for product judgment.
  2. The free B2C detector as a top-of-funnel acquisition channel. It is cheaper than ads and it gives us SEO surface area on terms that the incumbents do not target.
  3. Onboarding speed. Right now from "I want to try Carriva" to "I am auditing my first client RIS" is around 12 minutes. We want it to be 4.

If you are weighing whether to build a vertical SaaS retirement advisors actually need, or any deeply niche professional tool, we will save you the existential crisis: yes, there is a market in places that look boring on the surface, and yes, the moat is the domain knowledge you accumulate by talking to one practitioner per week for 18 months.

The bigger question is whether you can stand to spend two years caring about RIS PDFs, MDA flags, and the cohorte 1965 cutoff. If you can, the moat is real and it grows every week.

The free B2C detector, and why it changes the funnel

A specific feature worth a paragraph because it shapes how the whole product works.

Most B2B SaaS products lock everything behind a login. We did the opposite: we shipped a free, public, no-account-required tool where any French citizen can paste in their RIS and get a quick summary of potential anomalies. No paywall. No "enter your email" gate. Just a free check.

The reasoning was not generosity. It was funnel design. A retirement-age citizen who runs the free check and sees "this RIS has 3 potential issues" has a problem. They can fix it themselves (slow, painful, requires expertise) or they can take it to an advisor. We surface a list of advisors in their area (the ones using Carriva) and let them book a meeting.

The advisor pays for the lead. The citizen gets free awareness. We get a marketing channel that does not look like marketing.

The B2C detector now drives a meaningful share of the qualified meetings our advisor customers book. It is the single feature that shifted Carriva from "useful internal tool" to "useful external acquisition tool", and it would never have shipped if we had not been listening to the advisor who said in interview number 4 "the hardest part of finding a new client is they don't know they have a problem yet". That sentence rewrote the roadmap.

Where to start if you want to copy this

Pick one practitioner. Sit with them for 90 minutes. Build the smallest possible thing that removes 30 minutes of their day. Charge for it within 60 days. If you can do that, you have a vertical SaaS retirement advisors (or accountants, or notaires, or veterinarians) will pay for. The hard part is not the code. The hard part is wanting to be in the room with them long enough to learn what is actually broken.

We are still learning. Every Tuesday at 6pm a CGP shows us something we did not know about pension law. We write it down. We ship something the next morning. That is the entire game.

A small thing

Want to work with us?

We are a small studio shipping focused B2B SaaS for niche professional verticals. If your problem looks like one of ours, we would love to chat.