How I Built a Receipt Scanning PWA for French Freelancers (and What I Learned)
A few months ago, I launched ScanCompta — a Progressive Web App that lets French freelancers and small business owners scan their receipts and manage expense reports, directly from their phone or browser.
Here's what I learned building it.
The Problem I Was Solving
France has around 4 million self-employed workers — freelancers, tradespeople, VTC drivers, consultants. Most of them handle their own bookkeeping. And they all deal with the same nightmare: paper receipts.
Under French law, receipts must be kept for 10 years (article L.123-22 of the Code de commerce). But since 2017, a regulation (the "arrêté du 22 mars 2017") allows a digital photo to legally replace the paper original — as long as the scan meets specific quality standards.
The problem: no one knows about this rule. And even fewer people had a simple, affordable tool that actually handled the French-specific stuff: VAT rates (there are 4 in France: 20%, 10%, 5.5%, 2.1%), URSSAF plafonds, the kilometric allowance (which changes every year), etc.
Existing tools like Expensify or Dext are either too expensive, too complex, or not designed for the French regulatory context. That was my opening.
The Stack
I built ScanCompta as a PWA for a simple reason: I wanted one codebase that works on iOS, Android, and desktop without going through the App Store review process or paying 30% fees.
Here's what I used:
- React — component library
- TanStack Router — for SSR and file-based routing (a genuinely underrated tool, especially for SEO since it makes server-side rendering straightforward)
- Lovable — AI-assisted development platform that accelerated the initial build significantly
- Cloudflare — for CDN, security headers, cache rules, and Brotli compression
- OCR — for receipt scanning and data extraction
The SSR part was important. A PWA that is 100% client-rendered is essentially invisible to Google. Getting SSR working properly with TanStack Router took some trial and error — their documentation for SSR patterns is still maturing — but it's worth it.
The SEO Challenge: Ranking for Hyper-Specific French Queries
Building the product was only half the battle. The harder part was getting discovered.
French freelancers don't search for "expense management software." They search for very specific things:
- Combien de temps garder ses tickets de caisse auto-entrepreneur
- TVA récupérable péage VTC
- Ticket de caisse perdu urssaf que faire
- Indemnités kilométriques ou frais réels 2026
So I built dedicated landing pages and blog articles for each of these queries. Some examples:
- How long to keep receipts as a sole trader
- VAT on fuel and toll receipts for VTC drivers
- What to do with a lost receipt
- Mileage allowance vs actual expenses in 2026
The key insight: in a niche market, long-tail informational content outperforms generic product pages. People landing on a "lost receipt" article are exactly the kind of users who would benefit from a receipt scanning app.
The JSON-LD Layer
One thing I spent a lot of time on that paid off: structured data.
Every page has properly implemented schema markup:
-
SoftwareApplicationon the homepage with pricing, OS compatibility, app category -
BlogPostingon every article withdatePublished,dateModified,author(Organization, not a person),speakablesections -
BreadcrumbListon every page -
FAQPageon key landing pages -
WebSitewithSearchActionfor sitelinks search box
For a small product competing against established players, structured data gives you a disproportionate advantage. Google's AI Overviews and Perplexity both favor sources with clean semantic markup.
Lessons for Other Indie Builders
1. Pick a market with regulatory complexity. French accounting rules are boring to most people but fascinating to French freelancers who are trying not to get audited. Regulatory complexity = less competition + high user anxiety = strong intent to find a solution.
2. SSR matters more than you think for SEO. If you're building a SaaS and care about organic traffic, don't ship a pure SPA. TanStack Router's SSR mode, Next.js, Nuxt — pick one. The traffic difference is real.
3. Build one genuinely useful free tool. I created a free kilometric allowance calculator that gets consistent organic traffic. It converts to signups better than any ad campaign because the intent is perfect.
4. Structured data is underinvested by most indie makers. It takes a few hours to implement properly and the payoff in Google Search and AI-powered search engines is significant.
5. Localization is not just translation. Building for the French market meant understanding French-specific tax rates, legal references, and terminology. A direct translation of an English SaaS would have missed all of that.
What's Next
I'm currently working on:
- Enhanced OCR accuracy for faded thermal receipts (a very common problem with French supermarket receipts)
- Direct export to accounting software used by French accountants
- Automatic kilometric log from GPS data
If you're building something in the "boring but necessary" category — accounting tools, legal document managers, tax calculators — I'd love to hear about it.
And if you're a French freelancer drowning in paper receipts: give ScanCompta a try. It's free to start.
Built by the ScanCompta team. Questions? Comments? Drop them below — I read everything.
Top comments (1)
Hi everyone