Plate 03 — Commercial Data Integration · Independent MVP · 2026

Turning fragmented commercial data into one usable view.

I designed and built a working data-integration MVP that combines simulated CRM, e-commerce and chatbot activity into a unified customer database and live commercial dashboard.

Growth Dashboard commercial data integration MVP
Role
Product & developer
Type
Independent MVP
Sources
CRM · Shop · Chatbot
Database
PostgreSQL · Supabase
Backend
Node.js
Status
Live demo

01 — Problem

The data existed. The useful view did not.

Commercial information often lives in separate systems. Customer details may sit in a CRM, purchases in an e-commerce platform, and new leads in a chatbot.

Each system can work correctly on its own while still leaving the business without a clear answer to simple questions: Who is this customer? What have they bought? Are they already a lead? What is happening to revenue and pipeline?

I wanted to explore how a lightweight MVP could connect these sources without attempting to replace the systems themselves.

3

Data sources

1

Unified database

8

Dashboard metrics

3

Interactive actions

02 — Architecture

Different systems. One integration layer.

CRM

API · Polling

Contacts and deals are pulled from a simulated CRM API.

E-commerce

API · Polling

Customers and paid orders are imported from a simulated shop.

Chatbot

Webhook

Lead creation events are pushed into the integration layer.

Unified storage

PostgreSQL

Supabase stores customers, deals, orders and chatbot events in related tables.

Data flow

CRM + e-commerce + chatbot → integration layer → unified customer records → PostgreSQL → dashboard API → live dashboard.

03 — Integration decisions

One person can have three different IDs.

The CRM and e-commerce system do not share customer IDs. A person might be crm_001 in one source and shop_101 in another.

For the MVP, I normalised email addresses and used them as the matching key. Once a customer is resolved, their orders, deals and chatbot events reference one internal customer record.

CRM IDcrm_001
Shop IDshop_101
Matching keyanna@example.com
Unified IDcustomer_id = 1

04 — Data integrity

The interesting bug was not visual. It was duplication.

During polling tests, an order was imported more than once. Application-level duplicate checking was not enough to guarantee data integrity.

I fixed the issue at the database level by adding unique constraints to external identifiers such as order IDs, CRM deal IDs, chatbot conversation IDs and customer emails.

That changed the architecture from “the importer should avoid duplicates” to “the system cannot store the same source record twice.”

Unique constraint

customers.email

Unique constraint

orders.shop_order_id

Unique constraint

deals.crm_deal_id

Unique constraint

chatbot_events.conversation_id

05 — Interactive MVP

Don't just look at it. Change the data.

01

Create Demo Order

Creates a €99 paid order and immediately recalculates order count, revenue and average order value.

02

Create CRM Deal

Creates a new €250 open deal and updates the CRM pipeline metrics.

03

Send Chatbot Lead

Creates a new lead event and updates the chatbot lead count.

Interactive Growth Dashboard showing revenue, orders and demo actions
Interactive demo actions update the underlying data and metricsOverview
Growth Dashboard commercial metrics and connected data sources
Unified commercial metrics and connected source systemsData layer

06 — Reflection

What this taught me about systems thinking.

  1. 01

    A dashboard is only as trustworthy as the data behind it.

  2. 02

    Identity resolution is a product problem as much as a database problem.

  3. 03

    Push and pull integrations solve different kinds of source behaviour.

  4. 04

    Data integrity should not depend only on application logic.

  5. 05

    A small interactive demo communicates architecture better than a static diagram.

  6. 06

    Reliable data should come before adding an AI layer.