DataAcuity — Technical Data Flow
From user action → anonymised insight → business product → revenue → back to user
Classification: Internal technical specification
Links: AppInfo/DataAcuity/DataAcuity_Full_Proposition.md — business context
Links: AppInfo/DataAcuity/DataAcuity_External_Pitch.md — public-safe version
Links: docs/WOLVERINE_HEALING_PIPELINE.md — Wolverine architecture reference
Memory: .claude-memory/banking-compliance-rules.md, .claude-memory/aether-global-compliance.md
Status: Architecture defined. Event schemas and API specs to be implemented.
Overview: Five Layers
┌─────────────────────────────────────────────────────────┐
│ LAYER 1: Event Emission │
│ User performs consented action in any TGN app │
│ → Structured event emitted (PII stripped at source) │
└────────────────────┬────────────────────────────────────┘
│ Wolverine event bus (WolverineAPI:5014)
┌────────────────────▼────────────────────────────────────┐
│ LAYER 2: Privacy Gate + Ingestion │
│ Strip identifiers → pseudonymous cohort ID │
│ k-anonymity check → differential privacy noise │
│ Jurisdiction stamp → consent-version stamp │
└────────────────────┬────────────────────────────────────┘
│
┌────────────────────▼────────────────────────────────────┐
│ LAYER 3: Aggregation + Cohort Builder │
│ Group into demographic cohorts │
│ Suppress cohorts < 1,000 users │
│ Build time-series and cross-app journey signals │
└────────────────────┬────────────────────────────────────┘
│
┌────────────────────▼────────────────────────────────────┐
│ LAYER 4: Product Surfaces │
│ B: Industry Reports (SQL → PDF/dashboard) │
│ C: Pro API (REST endpoints) │
│ D: Wolverine SaaS (event infra as product) │
└────────────────────┬────────────────────────────────────┘
│ Revenue received from buyers
┌────────────────────▼────────────────────────────────────┐
│ LAYER 5: Revenue Reverse Flow │
│ 1% gross → social pledge │
│ 5% net revenue → Qi Pool → back to contributing users │
│ 35% net profit → community arms → member cashback │
└─────────────────────────────────────────────────────────┘
Layer 1: Event Emission — Per App Schema
Design rules for all events
- PII stripped at source. No phone number, no name, no email in any event.
- Location precision: Province + zone only. Never street address or GPS coordinate.
- Amounts: Banded (e.g., R0–R100, R101–R500, R501–R2000, R2000+). Never exact.
- Timing: Rounded to day (no hour-level precision for most events; exception: Panik SOS where time-of-day band is the signal, not the exact time).
- Consent flag: Every event carries
consentVersionandconsentScope— events without valid consent are dropped at the privacy gate. - Mesh flag:
source: "internet" | "aether"— flags whether the event came from a mesh relay (geographic intelligence for offline zone mapping).
SDPKT — WalletEvent
{
"eventType": "WalletEvent",
"timestamp": "2026-04-18",
"cohortId": "<pseudonymous-rotating-id>",
"karmaT ier": "Sprout",
"eventSubtype": "purchase | transfer | topup | withdrawal",
"categoryCode": "airtime | electricity | grocery | transport | retail | entertainment | other",
"amountBand": "R0-R100 | R101-R500 | R501-R2000 | R2000+",
"merchantType": "formal | informal | peer | utility",
"locationZone": "GP-JHB-SOUTH | WC-CPT-NORTH | KZN-DBN-CENTRAL | ...",
"source": "internet | aether",
"consentVersion": "1.2",
"consentScope": "financial-behaviour"
}
Business value: Consumer spend patterns by category, zone, economic tier, and time.
The Job Center — LabourEvent
{
"eventType": "LabourEvent",
"timestamp": "2026-04-18",
"cohortId": "<pseudonymous-rotating-id>",
"karmaT ier": "Seedling",
"eventSubtype": "search | view | apply | outcome-success | outcome-fail",
"roleCategory": "learnership | internship | scholarship | bursary | entry-level | skilled | management",
"sector": "retail | construction | healthcare | tech | education | hospitality | other",
"locationZone": "GP-JHB-SOUTH",
"salaryBand": "R0-R5000 | R5001-R15000 | R15001-R40000 | R40000+",
"source": "internet | aether",
"consentVersion": "1.2",
"consentScope": "labour-market"
}
Business value: Labour market demand signals, skills gaps by province, learnership uptake rates.
txtMe! — MessagingMetadataEvent
{
"eventType": "MessagingMetadataEvent",
"timestamp": "2026-04-18",
"cohortId": "<pseudonymous-rotating-id>",
"eventSubtype": "individual | group | channel | community",
"groupSizeBand": "1 | 2-10 | 11-50 | 50+",
"messagingFrequencyBand": "daily | weekly | occasional",
"primaryLanguageCode": "zu | xh | af | en | fr | pt | ...",
"source": "internet | aether",
"consentVersion": "1.2",
"consentScope": "communication-patterns"
}
IMPORTANT: No message content. No recipient identifiers. Metadata only. Business value: Language usage patterns, community size dynamics, Aether vs internet ratio (network quality signal).
TagMe — TagEvent
{
"eventType": "TagEvent",
"timestamp": "2026-04-18",
"cohortId": "<pseudonymous-rotating-id>",
"tagCategory": "food | transport | accommodation | entertainment | safety | retail | event | service | infrastructure | other",
"sentimentScore": "positive | neutral | negative",
"locationZone": "GP-JHB-SOUTH",
"locationType": "fixed | mobile | temporary",
"online": true,
"source": "internet | aether",
"verifiedPresence": true,
"consentVersion": "1.2",
"consentScope": "location-social-graph"
}
Business value: Physical-world footfall by category and zone, sentiment by place-type, offline activity mapping, real-world social graph signals.
Special value of source: "aether": Tags submitted via mesh when no internet = presence confirmed in an offline zone. This is unique to TGN — no other provider can capture this.
SleptOn — ContentEvent
{
"eventType": "ContentEvent",
"timestamp": "2026-04-18",
"cohortId": "<pseudonymous-rotating-id>",
"eventSubtype": "publish | purchase | view | review",
"contentCategory": "course | music | art | video | writing | template | photography | other",
"priceBand": "free | R1-R50 | R51-R200 | R201-R500 | R500+",
"creatorLocale": "zu-ZA | en-ZA | fr | pt | ...",
"buyerLocale": "zu-ZA | en-ZA | fr | pt | ...",
"locationZone": "GP-JHB-SOUTH",
"source": "internet | aether",
"consentVersion": "1.2",
"consentScope": "content-economy"
}
Business value: Informal creative economy signals, content category demand by language/locale, price sensitivity by economic tier.
KiffStore — CommerceEvent
{
"eventType": "CommerceEvent",
"timestamp": "2026-04-18",
"cohortId": "<pseudonymous-rotating-id>",
"eventSubtype": "browse | wishlist | purchase | return",
"productCategory": "food | clothing | electronics | homeware | beauty | sport | other",
"priceBand": "R0-R100 | R101-R500 | R501-R2000 | R2000+",
"sellerType": "local-small | local-medium | formal-retail",
"localSeller": true,
"locationZone": "GP-JHB-SOUTH",
"source": "internet | aether",
"consentVersion": "1.2",
"consentScope": "commerce-behaviour"
}
Business value: Consumer preference by category, local vs formal retail preference, price sensitivity by zone and economic tier.
Panik — SafetyEvent
{
"eventType": "SafetyEvent",
"timestamp": "2026-04-18",
"cohortId": "<pseudonymous-rotating-id>",
"alertType": "sos | check-in | silent | area-warning",
"timeOfDayBand": "00-06 | 06-12 | 12-18 | 18-24",
"dayType": "weekday | weekend | public-holiday",
"locationZone": "GP-JHB-SOUTH",
"responseReceived": true,
"resolvedWithin": "5min | 5-30min | 30min+ | unresolved",
"source": "internet | aether",
"consentVersion": "1.2",
"consentScope": "safety-patterns"
}
MAXIMUM SENSITIVITY. Cohort minimum for Panik data: 5,000 (not 1,000). Location precision reduced to metro-area only (not zone). No time-of-day in individual zone reports — only in metro-aggregated form.
Business value: Safety hotspot identification by area and time-band (for urban planners, NGOs, government — NOT for insurance risk scoring without explicit consent).
TrustSeal — VerificationEvent
{
"eventType": "VerificationEvent",
"timestamp": "2026-04-18",
"cohortId": "<pseudonymous-rotating-id>",
"documentType": "affidavit | id-copy | contract | certification | other",
"verificationOutcome": "success | failed | pending",
"locationZone": "GP-JHB-SOUTH",
"source": "internet | aether",
"consentVersion": "1.2",
"consentScope": "document-verification"
}
Business value: Where legal/document infrastructure is failing (high failed-verification rates = infrastructure gap). Demand for specific document types by region.
ShhMoney — FinancialPlanningEvent
{
"eventType": "FinancialPlanningEvent",
"timestamp": "2026-04-18",
"cohortId": "<pseudonymous-rotating-id>",
"eventSubtype": "savings-goal-set | deposit | withdrawal | investment-opened | investment-closed",
"goalType": "emergency | education | housing | business | general",
"depositFrequencyBand": "daily | weekly | monthly | irregular",
"amountBand": "R0-R500 | R501-R2000 | R2001-R10000 | R10000+",
"karmaT ier": "Sapling",
"source": "internet | aether",
"consentVersion": "1.2",
"consentScope": "financial-planning"
}
Business value: Savings behaviour trajectory by economic tier, financial goal priorities by demographic.
Takemehome.co.za — MobilityEvent
{
"eventType": "MobilityEvent",
"timestamp": "2026-04-18",
"cohortId": "<pseudonymous-rotating-id>",
"eventSubtype": "search | book | complete | cancel",
"originZone": "GP-JHB-SOUTH",
"destinationZone": "GP-JHB-NORTH",
"routeType": "urban | peri-urban | rural | inter-city",
"departureBand": "00-06 | 06-12 | 12-18 | 18-24",
"distanceBand": "0-10km | 11-50km | 51-200km | 200km+",
"priceBand": "R0-R50 | R51-R150 | R151-R500 | R500+",
"source": "internet | aether",
"consentVersion": "1.2",
"consentScope": "mobility-patterns"
}
Business value: Transport demand by route, time, and economic tier. Infrastructure gap identification (high cancel rates = poor service supply).
Bruh! — EcosystemEngagementEvent
{
"eventType": "EcosystemEngagementEvent",
"timestamp": "2026-04-18",
"cohortId": "<pseudonymous-rotating-id>",
"appsUsedInSession": ["SDPKT", "JobCenter", "txtMe"],
"sessionDurationBand": "0-5min | 5-30min | 30min+",
"sequencePattern": "wallet-first | jobs-first | messaging-first | ai-first",
"karmaT ier": "Tree",
"primaryLanguage": "zu",
"source": "internet | aether",
"consentVersion": "1.2",
"consentScope": "ecosystem-engagement"
}
Business value: Cross-app journey patterns, which apps are used together, economic life-stage signals from app combination (wallet + jobs = early-stage; wallet + savings + investment = advanced-stage).
Layer 2: Privacy Gate + Ingestion
Processing steps (in order)
1. Receive event from Wolverine event bus
2. Validate consent: consentVersion >= current minimum, consentScope matches event type
→ IF invalid: DROP event, log consent-drop metric (no data, no Qi)
3. Strip all direct identifiers (cohortId was generated at app layer — already pseudonymous)
4. Validate location precision: reject anything more granular than zone
5. Apply temporal rounding: round timestamp to day
6. Apply differential privacy noise to continuous signals (amounts, frequencies)
→ Add calibrated Laplace noise (ε=1.0 by default — adjust per sensitivity tier)
7. Stamp jurisdiction: derive from locationZone + user registration locale
→ Determines which community arm receives distribution (SA / NL / JP)
8. Write to DataAcuity ingestion queue (separate from operational databases)
9. Emit QiEarnedEvent back to IncentivesAPI:5162 — user earns Qi for the consented event
Cohort ID rotation
Cohort IDs are pseudonymous — not user IDs. They rotate on a 90-day cycle to prevent longitudinal re-identification. Consequence: cross-90-day journey tracking uses cohort-level aggregates, not individual tracking.
Layer 3: Aggregation + Cohort Builder
Cohort dimensions
Users are grouped into cohorts by combinations of:
| Dimension | Values |
|---|---|
| Karma tier | Seedling / Sprout / Sapling / Tree / Forest / Baobab |
| Location zone | Province + metro zone (e.g., GP-JHB-SOUTH) |
| Primary language | ISO locale code |
| Economic trajectory | Improving / Stable / Declining (inferred from wallet + savings signals over rolling 90 days) |
| Employment status | Seeking / Informal / Employed (inferred from Job Center + SleptOn + ShhMoney signals) |
| Ecosystem depth | Single-app / Multi-app / Super-app (Bruh! user) |
Suppression rule
Any cohort query returning fewer than 1,000 contributing users → result suppressed.
Response: { "suppressed": true, "reason": "cohort_too_small", "minimumRequired": 1000 }
This prevents re-identification even for rare demographic combinations.
Panik data: minimum 5,000 (higher threshold due to safety sensitivity).
Time-series signals
For Industry Reports, cohort signals are stored as time-series (TimescaleDB hypertables). This enables:
- Quarter-on-quarter trend analysis
- Before/after event analysis (e.g., economic impact of a policy change)
- Seasonal patterns (spend before month-end vs after payday)
Layer 4: Product Surface Outputs
B — Industry Report Query Pattern
-- Example: Township consumer spend by category, Q1 2026, Gauteng
SELECT
locationZone,
categoryCode,
amountBand,
karmaT ier,
COUNT(*) AS eventCount,
DATE_TRUNC('month', timestamp) AS period
FROM wallet_events
WHERE
locationZone LIKE 'GP-%'
AND timestamp BETWEEN '2026-01-01' AND '2026-03-31'
AND consentScope = 'financial-behaviour'
GROUP BY locationZone, categoryCode, amountBand, karmaT ier, period
HAVING COUNT(*) >= 1000 -- suppression rule enforced in query
ORDER BY period, locationZone, eventCount DESC;
Output → formatted into report template (PDF + interactive dashboard).
C — Pro API Endpoint Patterns
GET /v1/cohorts/spend?zone=GP-JHB-SOUTH&category=grocery&period=2026-Q1
GET /v1/cohorts/labour?province=GP§or=tech&roleCategory=learnership
GET /v1/cohorts/mobility?originZone=GP-JHB-SOUTH&destinationZone=GP-JHB-NORTH
GET /v1/cohorts/sentiment?tagCategory=food&zone=GP-JHB-SOUTH&period=2026-Q1
GET /v1/infrastructure/offline-zones?province=GP&threshold=0.4
GET /v1/cohorts/journey?sequence=wallet-first&karmaT ier=Sprout
All responses include:
{
"query": { ... },
"period": "2026-Q1",
"cohortSize": 12450,
"suppressed": false,
"consentCoverage": 0.94,
"jurisdictions": ["ZA"],
"data": [ ... ]
}
consentCoverage tells the buyer what % of events in this cohort had valid consent —
a quality signal unique to DataAcuity (no other provider publishes this).
D — Wolverine SaaS
Separate product. Not derived from user data.
The Wolverine event pipeline itself, sold as infrastructure.
See docs/WOLVERINE_HEALING_PIPELINE.md for the technical architecture.
Layer 5: Revenue Reverse Flow
Qi attribution
When a DataAcuity invoice is paid, the QiPool receives 5% of net revenue.
The attribution model:
Total Qi distributed = 5% of net revenue / total contributing events in the reporting period
Per-user Qi = (user's contributing event count / total events) × Total Qi distributed
Example: R45,000 net revenue from a report. Qi pool = R2,250. Report covered 500,000 contributing events. User contributed 47 events. User's Qi = (47/500,000) × R2,250 = R0.21 = 21 Qi
Qi is distributed via IncentivesAPI:5162 → credited to user's SDPKT wallet.
Community trust distribution
35% of net profit is distributed annually to community arms:
- Allocation by jurisdiction: based on where the contributing events originated
- SA events → Bengu Community Trust SA (Rand denominated)
- NL-routed events → Bhengu Stichting NL (EUR denominated)
- JP-routed events → Bhengu San Zaidan JP (JPY denominated)
Community arms distribute to members annually. The mechanism: members of the ecosystem (registered TGN users with active accounts) receive distributions proportional to their engagement depth and Karma tier.
Social pledge
1% of gross revenue is pre-committed before any other distribution. Managed by the community arms jointly. Directed to: schools, clinics, community infrastructure, disaster relief. Amount is fixed at gross revenue level — cannot be reduced by operating losses.
Open Implementation Tasks
- Implement event emission in each app (add to each app's service layer)
- Create DataAcuity ingestion service (new API:
DataAcuityAPI— port TBD) - Build privacy gate (consent validation + differential privacy noise library)
- Create cohort builder (TimescaleDB hypertables for time-series)
- Build Pro API (ASP.NET Core minimal API, JWT-authenticated for paying clients)
- Connect QiEarnedEvent → IncentivesAPI:5162 for Qi attribution
- Build Industry Report query templates (SQL → PDF/dashboard pipeline)
- Create
AppInfo/DataAcuity/DataAcuity_API_Spec.md(OpenAPI 3.1 spec for Pro API) - Create
AppInfo/DataAcuity/event-schemas/folder (one JSON Schema file per app)