Skip to main content
Blog

Building Multi-Tenant SaaS for Africa: An Engineering Postmortem

Twelve things we got wrong while building Papyrus, and how we eventually got them right. A field guide for African SaaS builders.

Building Multi-Tenant SaaS for Africa: An Engineering Postmortem

We launched Papyrus 18 months ago. A lot of what we believed on day one turned out to be wrong. Here's the list, in case it saves someone else the same trips.

1. We over-engineered tenant isolation up front

We started with a “database per tenant” model. The architecture was elegant. The operational cost was crushing — migrations, backups, monitoring all multiplied by N tenants.

We moved to shared-database / per-row tenancy with strict query filters. Operational cost dropped 80%. Audit findings on isolation: zero. The right answer wasn't the architecturally pure one.

2. We under-engineered the audit log

We started with simple table logging — “user X did Y at time Z”. Three months in, a customer asked: “can you prove this wasn't altered?” We could not.

We rebuilt with hash chaining. Should have done this on day one. Retrofitting an audit log to hash-chain after a year of data is awkward — we ended up with a “v0 audit log” for the pre-chain period and a “v1 audit log” going forward.

3. We assumed network reliability

The early UI fired API calls on every keystroke. On a dependable 200ms RTT connection, that's fine. On a 1500ms RTT Kenyan mobile connection, the UI felt broken.

Now: debounce, batch, optimistic-update, and a visible offline-queue indicator. The mobile app especially treats the network as a condition, not a constant.

4. We picked the wrong vector store first

We started with a self-hosted vector DB. It was fine for 10k documents. At 100k documents it became a single-tenant operational headache.

Moved to Qdrant Cloud. The cost is real but the operational saving is bigger.

5. We treated KRA eTIMS as a Phase 2 feature

It should have been Phase 1. Half our prospects couldn't onboard without it. We rushed eTIMS in 7 weeks after launch when it should have been part of the original 0-to-1.

6. We didn't have a Swahili strategy

We launched English-only “with Swahili coming”. Within 60 days a tenant uploaded 40% Swahili content. Our classifier struggled; OCR struggled. We spent 6 months catching up.

If you're building for Africa, Swahili (or French or Arabic depending on region) is a Phase 1 concern, not Phase 2.

7. We over-priced

Our original Starter plan was $99/month. Too high for most Kenyan SMEs. We saw signups, free-tier usage, and Free-to-paid conversion below 1%.

Repriced in KES at materially lower absolute numbers. Conversion went from <1% to ~6%. Pricing in dollar for African markets, even unit-economically rational pricing, is a non-starter.

8. We tried to be SharePoint

The first product pitch was “SharePoint, but better.” Customers nodded politely and didn't buy. Pivoted to “AI-native document management, purpose-built for Kenya.” Pipeline tripled in 60 days.

Position by what's different, not by what's similar.

9. We didn't budget for change management

We sold to CIOs who thought “we just need the tool”. Six months later, adoption rate at those customers was 30%. We started insisting on a customer-side internal champion as part of the contract; adoption rates doubled.

Software doesn't change behaviour. People change behaviour, with software.

10. We deferred mobile

Mobile was on the roadmap for “later”. Field-officer-heavy customers (NGOs, government, agribusiness) needed mobile day one. We lost some deals. We shipped mobile in month 9 of operations.

If your customer base includes field workers, mobile is Phase 1.

11. We had bad observability for 9 months

OpenTelemetry was on the roadmap. Production debugging was painful for the first 9 months. The day we shipped distributed tracing, several customer issues that had been mysterious for weeks became 20-minute fixes.

Observability is not optional. It's not “Phase 2”. It's day 1.

12. We undersold the AI

For the first year, we positioned AI as a feature. Customers were buying document management. The AI conversations went like: “yeah it has AI, but tell me about retention policies”.

We re-positioned: AI is the platform; document management is the surface. Pipeline conversations shifted entirely.

What we got right

To be fair to ourselves, some calls were good:

  • Choosing .NET for the backend (the talent pool in Kenya is strong)
  • Choosing Blazor for the web (saved us a SPA build)
  • Going multi-tenant from day one
  • Choosing PostgreSQL… wait, we went SQL Server. That was a debatable choice. Talk to us in another year.

Closing

Most of these mistakes were predictable if we'd been more honest with ourselves about the market context. The Silicon Valley playbook doesn't perfectly translate to building for African enterprises. The good news: each lesson has a recoverable arc. Pivot, ship, learn.

Rejoining the server...

Rejoin failed... trying again in seconds.

Failed to rejoin.
Please retry or reload the page.

The session has been paused by the server.

Failed to resume the session.
Please retry or reload the page.