CLIENT: Mavikoru Home🇹🇷Türkiye

Dokuma - Governed Data Warehouse and Pipeline Operations Console

Data Platform Console for an Istanbul Home Textiles Brand

Designed and built a clickable operations console for a direct-to-consumer home textiles brand's cloud data platform: freshness against SLAs per domain, every pipeline run with retries and a suggested fix, lineage from raw tables to marts, and column-level PII tagging with masking by default under KVKK and GDPR.

Scope of Work
Product design, UI build and clickable demo
Industry
Data & Analytics / Data Warehouse & ETL
Enterprise
Compliance & Certifications
KVKK (Law No. 6698)KVKK cross-border transfer rulesVERBISKVKK retention and destructionGDPRGİB e-Fatura and e-Arşiv

Most of our work is under NDA. Per agreement, we can share the work but not the company details - all names and identifying information shown here have been changed.

Impact

5 Screens
Clickable end to end

Dashboard, runs, run detail with a Gantt of every attempt, models and lineage, and PII and classification. Retry, cancel, rebuild, confirm and reclassify all respond on local state.

25 Models
Lineage from raw to marts

9 raw tables, 7 staging, 3 intermediate and 6 marts in one left-to-right graph. Selecting a model lights up everything upstream and downstream of it.

9 PII Types
Masked by default

Name, email, phone, address, national ID (TCKN), IP address, payment reference, free text and date of birth each map to a default masking policy that is applied when a tag is confirmed.

14 Sources
Realistic demo data

Storefronts, marketplaces, payments, ad platforms, ERP, e-Fatura, two 3PLs and Zendesk, feeding 16 pipelines, 78 runs since yesterday 17:00, 3 incidents and 10 staff users.

The Problem

Mavikoru grew from one Istanbul storefront to two storefronts, two marketplaces and two currencies in three years. Every report was a spreadsheet stitched together by hand from Shopify exports, the ERP, iyzico and Stripe statements and ad dashboards. Finance and marketing disagreed on revenue every month, a few cron scripts broke silently when an API field changed, and nobody knew which tables held customers' names, phone numbers or addresses, or who could see them.

Our Solution

Dokuma pulls every source system into one cloud warehouse, models it in layers with full lineage, and gives the small data team one console to run it: freshness against SLAs, runs with retries and a suggested next step, the model graph from raw tables to marts, and PII tagging down to the column with masking applied in the warehouse.

The Challenge: One Warehouse, Two Privacy Laws

Mavikoru sells in Türkiye and, through its Dutch subsidiary Mavikoru Home B.V., in the EU. Its data comes from fourteen systems hosted in Türkiye, the EU and the US, and lands in one warehouse that has to answer to KVKK and the GDPR at the same time.

Pipelines That Failed Silently

Cron scripts loaded some data, stopped when a credential expired or an API field changed, and nobody noticed until a report looked wrong. The team needed to see every run, why it failed and what to do next, before the business asked.

No Agreed Number for Revenue

Finance and marketing counted returns, VAT and marketplace commission differently. Without shared models and lineage, nobody could show which source a figure came from or which marts a broken source would affect.

Personal Data Nobody Could Find

Customer names, phones, addresses and Turkish ID numbers arrive from storefronts, marketplaces, 3PLs, e-invoices and support tickets, sometimes hidden in free text. KVKK and GDPR both expect the brand to know where that data sits and who can see it.

Data That Crosses Borders

The warehouse and several SaaS sources sit outside Türkiye, and EU customer data flows to Türkiye. Each source has to record its hosting region and the transfer mechanism relied on, for counsel to confirm.

Our Approach: From Data Rules to a Clickable Console

01

Spec and Rules Research

Mapped 8 user roles, from data engineer and analytics engineer to the data protection officer and source owners, 39 screens across the console and the Data hub, and the data model for sources, pipelines, runs, models, contracts, PII columns, masking policies, grants and retention rules. Wrote down the rules the design follows: KVKK and its 2024 cross-border transfer amendments, VERBIS, KVKK retention and destruction, the GDPR including Article 30 records, and GİB e-Fatura and e-Arşiv invoice data.

02

Clickable Demo on a Production UI Kit

Built 5 key screens on a production dashboard kit: the dashboard with freshness KPIs, a freshness board per domain, today's runs on a timeline and My work by role, the runs table with status counts and filters, run detail with the failed step, error class, suggested next step and linked incident, the lineage graph with a model quick view, and PII review with confirm, change classification and not personal actions that require a reason.

03

What a Production Build Adds

Integration with Shopify, Trendyol, Hepsiburada, iyzico, Stripe, the ad platforms, Logo Tiger, a GİB-licensed e-invoice integrator, both 3PLs and Zendesk through Fivetran or Airbyte, a Snowflake or BigQuery warehouse in the EU, dbt and Dagster or Airflow. Single sign-on with roles, masking enforced in the warehouse, an append-only audit log, Slack and PagerDuty alerts, and the remaining screens: sources, schema changes, backfills, contracts, access requests, retention, catalogue, cost and the Data hub.

Why It Works: Fresh, Traceable and Private by Default

Freshness First

The dashboard opens on whether today's data can be trusted: a tile per domain with its last load and SLA target, such as Finance by 07:30, in green, amber or red, and every run since midnight on one timeline coloured by result.

Failures Explain Themselves

A failed run shows the step, the error class and the raw message, then a suggested next step, such as rotating an expired e-Fatura token. Retries follow a back-off of 5, 15 and 45 minutes, and the operator can retry from the failed step or the whole run.

Lineage You Can Follow

Every model carries a status dot and a lock when it holds masked PII. Selecting a failing mart highlights the staging and raw tables behind it, so a stale invoice sync is traced to the revenue numbers it blocks.

Personal Data Tagged to the Column

Columns are suggested from name patterns and value sampling, with a confidence score and a masked sample. Confirming applies the default masking policy, and changing a classification or marking a column not personal needs a reason that is audited.

Related case studies

View all: Data & analytics
Logo
Oceanlab

Enterprise Software Engineering - Human + AI

Languages

Locations

Global Headquarters

21 Merchant Road, 3rd Floor, Singapore 058267

Main corporate office and leadership operations

North America Office

548 Market Street, PMB 12345, San Francisco, CA 94104

Client operations and business development

India Office

402 Shivalik Shilp II, SG Highway, Ahmedabad 380015

Engineering and delivery center

© 2026 - Copyright. All Rights reserved Oceanlab