We built a private analytics dashboard for digital agency 6ixsenses so their retail client's management team has one URL that answers a single question: are we on track for our growth target? Store, ads, email and on-site search data flow in on a nightly schedule and roll up into one composite score.
6ixsenses manages the marketing stack for a retailer whose data lived in six separate platforms — analytics, paid search, on-site search, email, and the store itself. Pulling a weekly picture meant logging into each one. The brief was a single, private dashboard that gathers all of it automatically, presents it in plain English for a non-technical management team, and treats customer privacy as a hard requirement rather than an afterthought.
Scheduled jobs pull from each platform's API, normalise the results and upsert them into one Postgres database — historical data is never overwritten. Every run records what it did, so the admin panel can show the last sync time and record counts per source.
Sessions, channels, funnels and geography — 7 reports, synced nightly.
Campaign spend, clicks, conversions and ROAS, synced nightly.
On-site search terms, zero-result queries and search geography, weekly.
Per-campaign email revenue, open and click rates, synced nightly.
Orders and line items via a guided CSV import that maps columns automatically.
The composite growth-index score combines five weighted inputs: revenue against the year-over-year target, blended paid ROAS, email revenue share, on-site search trend and conversion rate.


Revenue, orders and average order value for a selectable period with year-over-year comparison, a six-month trend chart, and the composite growth-index score.
Website traffic by source and channel from GA4, plus Google Ads and Klaviyo email performance, in collapsible sections.
Where site visitors are located, by region and city, from GA4 session geography.
Top-selling products and a category-by-month revenue heatmap, built from imported order line items.
Klevu search analytics — top terms, zero-result searches with suggested fixes, and where searches come from.
Connector setup with test buttons, Smart Import for CSV uploads, sync-health monitoring, and user management.
The dashboard handles real order and campaign data, so the privacy rules were fixed before the first sync was written and every feature has to follow them.
Customer names, phone numbers and street addresses are never stored — there is no database column for them. Emails are reduced to their domain plus a consumer/institutional label; identity is kept only as a one-way keyed hash.
Row-level security is on for every table with no access policies, so the database cannot be queried directly over the internet. The application server is the only way in.
API keys entered in the admin panel are encrypted with AES-256-GCM before storage and never sent back to the browser — the panel only shows whether a credential is saved.
Every analytics connection requests campaign-level aggregates only. The app never calls an endpoint that would return an individual customer’s browsing or purchase history.
It is a Next.js app on Vercel with a Postgres database and Prisma for every query. Auth is a short-lived signed token with central role checks, bcrypt password hashing and IP-based brute-force lockout. Charts are Recharts. Scheduled syncs run as Vercel cron jobs, each guarded by a secret only the scheduler knows.
Every external API call has a hard timeout and a capped retry, so a slow or flaky upstream platform produces a skipped sync with a clear error rather than a hung dashboard — and those error messages are scrubbed of any email or phone pattern before they are stored.
Book a free 30-minute call. Tell us which tools your reporting lives in today, and we will tell you honestly what it takes to bring them together.