PWA app for businesses in Kenya
# TAFUTA
**Kenyan Business Directory and single page websites**
A PWA app for businesses in Kenya
*README*
---
## Document Information
**URL:** tafuta.ke
**API URL:**
tafuta.ke
**Legal Entity:** eBiashara Rahisi Ltd
**Target Server:** s4.pamoja.ke (currently managed by Rafiki OpenClaw)
---
## Executive Summary
Tafuta is a super simple low cost business directory with single page website hosting. It will be rolled out in Kenya and serve the low-end of the market. It also provides user and business identity management. It includes authentication, a payment hub, alerts/reminders and a config panel for customers to manage their own content.
"I would rather make no money and create 10,000 jobs than make a boat load of money and have the economy continue to struggle." So please build me a platform that empowers businesses and creates jobs.
## APP Requirements and Design
See /docs/tafuta-Vision.md
See /docs/tafuta-Requirements.md
See /docs/PRD*.md
and other related documents in the /docs folder
## APP Frontend
See /frontend/README.md
## APP Backend
See /backend/README.md
## Analytics (Google Analytics 4)
Tafuta ships with Google Analytics 4 (`gtag.js`) hardcoded into frontend/index.html, measurement ID `G-Y9F58NBE8H`. Since `index.html` is the single entry point for the Vite SPA, this tag loads on every page.
Tafuta is a client-routed SPA (React Router) — in-app navigations don't trigger a full page load, so `gtag.js` only sees them if it's listening for `pushState`/`popstate` changes. We rely on GA4's built-in **Enhanced Measurement** for this instead of a manual `page_view` event:
- **GA4 → Admin → Data Streams → web stream → Enhanced measurement → "Page changes based on browser history events" must stay ON.** This is what makes route changes within the app register as pageviews.
- If this setting is ever turned off, in-app navigation will stop being tracked (only the initial page load will fire).
- Do **not** add a manual `gtag('event', 'pag …