About GridPulse CRM
Internal campaign intelligence for Tibber's CRM operations
GridPulse CRM
v1.0 · Internal Tool · Tibber CRM TeamGridPulse is Tibber's internal campaign intelligence dashboard. It connects to Braze to sync campaign and Canvas metadata, ingests Currents messaging events, detects message overlaps and conflicts, and surfaces everything in a dashboard with per-user journey timeline views. The goal is to give the CRM team full visibility into what each customer actually experiences across all campaigns — and to catch problems before they cause churn, unsubscribes, or spam complaints.
What GridPulse Does
Pulls all active campaigns and Canvases from Braze via cron, including tag-based classification (journey stage, intent, CTA category, team owner).
Ingests Braze Currents events (sends, opens, clicks, bounces, spam) via R2, normalises them into a unified schema enriched with campaign metadata.
A pluggable rule engine evaluates per-user event streams and generates alerts when anti-patterns are detected — timing floods, competing CTAs, dead zones, and more.
Visual dashboards covering KPIs, journey timelines, lifecycle analysis, heatmaps, collision maps, dead zones, and a conflict resolution workflow.
Conflict Detection Rules
GridPulse runs 7 configurable rules against per-user event streams. Each rule generates alerts with severity levels and suggested fixes. Thresholds and windows are tuneable via the Rules page.
| Rule | What It Catches | Severity |
|---|---|---|
| Timing Flood | 3+ messages within 24 hours | High |
| Channel Flood | 3+ messages on the same channel within 48 hours | High |
| Discount Before Sales | Discount CTA sent shortly before a sales-intent campaign | High |
| Competing CTAs | Messages with 2+ different CTAs within 24 hours | Medium |
| Onboarding Dead Zone | 3+ day communication gap during first 14 days | Medium |
| Post-Spam Send | Message sent to a user who reported spam within 7 days | Critical |
| Re-onboarding Active | Active user (30+ days) enrolled into onboarding journey | Low |
Architecture
Braze REST API ──(cron)──> Worker ──> D1 (campaigns, canvas_steps) Braze Currents ──> R2 ──(cron)──> Worker ──> D1 (unified_events) │ ├──> Queue ──> Conflict Detector ──> D1 (alerts) │ SvelteKit (Pages) <──── API routes <──┘
Build Roadmap
Why GridPulse Exists
As Tibber's CRM programme scales — more campaigns, more markets, more channels — the risk of campaigns interfering with each other grows. Braze provides excellent campaign execution, but it lacks retrospective intelligence about cross-campaign customer experience. GridPulse fills that gap:
See the full picture of what each customer receives across all campaigns, channels, and teams — not just individual campaign performance.
Automatically catch anti-patterns — message floods, competing CTAs, dead zones — that erode customer trust and drive unsubscribes.
Give CRM teams across markets and functions a shared operational view, replacing tribal knowledge with data-driven conflict resolution.
Tech Stack
Access & Security
Live Braze data is password-protected. The password is never stored in the client — only a SHA-256 hash is shipped in the bundle. The hash also serves as a Bearer token for server-side API validation.
Unlock state is stored in sessionStorage — it resets when you close the tab or browser. Each new session starts locked to mock data by default.
After 5 failed password attempts, the input is locked for 30 seconds to prevent brute-force attacks.
API requests for live data require a valid Bearer token. Requests without the token receive a 401 Unauthorized
response — preventing direct curl access to production Braze data.
The API only accepts requests from the deployed Pages domain and localhost development servers. Cross-origin requests from other domains are rejected.
Contains anonymised external user IDs and campaign metadata. No PII is stored directly.
CRM Operations Team — reach out on Slack for questions, feedback, or access requests.