Plentific · Data PM case study

Solution shaping — my thinking

Solution options

Thinking through possible solutions. Each one is evaluated against the same checklist.

What the customer actually needs

From the brief: "They want raw or lightly modelled data, on a dependable schedule, with a schema they can build pipelines against and trust not to break."

Note: The delivery mechanism options below (file drop, data share, API, warehouse access) are different ways to deliver this. They are Phase 3 decisions. The hard work is in Phases 0-2.

The real problems to solve

These are from the brief. They are blockers before any delivery mechanism matters.

What the brief saysWhy it's hardWhat has to happen first
"The warehouse is not modelled for outsiders, not governed to the standard needed" Before you can export anything, you need to fix the warehouse. That's a big internal project with no visible client value Internal platform work. Hard to fund because clients can't see it
"Not properly separated client-by-client" Tenant isolation doesn't exist. You can't export client A's data if you might accidentally include client B's Security-critical fix. Blocker for everything else
"Has never had to withstand a client's scrutiny" First security review will ask: "prove you can't leak data." They can't prove it today Needs to pass penetration testing and audit before any client goes live
"They ship continuously and will not slow down" The export mechanism is easy. Keeping the schema stable while shipping fast is the organisational challenge Process and discipline, not just code. Who approves schema changes?
"Good margin at 10 clients can be no margin at a hundred" Pricing model is unsolved. Costs scale with data volume. Revenue needs to scale too Unit economics must be modelled before committing to pricing
"Data is partly monetised" Some clients think they already paid for this. Commercial conversation is hard Need clear positioning: what's included vs what's an add-on

Phased approach

PhaseWhatWhy it's hardEffort
Phase 0 Fix tenant isolation in warehouse No client value. Hard to fund. But blocker for everything. Must pass security review Depends on current state. Could be weeks or months
Phase 1 Define scope — which tables, which columns Product decision. What to include, what to exclude. Saying no is hard. Every field you expose is a field you must maintain forever 2-4 weeks of product work, stakeholder alignment
Phase 2 Build versioning layer (views on top of tables) Technical work, but also needs process: who approves changes? What's the deprecation policy? 4-6 weeks engineering
Phase 3 Build delivery mechanism — pick one: file drop, data share, API, or warehouse access Actually the easy part — well-understood patterns 6-8 weeks engineering
Phase 4 Onboard first client (pilot) Proves it works. Finds gaps. Probably breaks things. Need a client willing to be a guinea pig 4-8 weeks including fixes
Phase 5 Productise — self-service config, pricing, documentation, support Makes it scalable beyond "we configure each one manually" Ongoing

Why Phase 0 (multitenancy) is a must to sell a product

We want to sell a data product. But we can't sell it until clients' security teams approve it. Their security teams will ask how we isolate data. We need an answer that passes their audit. Product asks Engineering to build whatever is needed so we can say YES with evidence.

Product asksEngineering delivers
"Prove tenant isolation" RLS policies on all tables
"Show it can't be bypassed" Automated tests that try to access other tenants' data and fail
"Document it for auditors" Security documentation explaining the controls
"Pass penetration testing" Fix any gaps found in the pen test

What happens if we get this wrong:

Regulatory and legal exposure:

RiskWhat it means
GDPR breach Personal data exposed to wrong party. Must report to ICO within 72 hours
ICO fines Up to £17.5 million or 4% of global annual turnover, whichever is higher
Client lawsuit Breach of contract, negligence claims, damages
Reputational damage Press coverage, other clients lose confidence, deals blocked
Retrofitting cost Fixing it after a breach costs 10x more than doing it now — plus legal fees, plus fines

Delivery mechanism 1: Nightly file drop

What it is (simple terms)

Every night, Plentific generates files (like spreadsheets but for machines — Parquet or CSV) and drops them into the client's cloud storage bucket (S3, Azure Blob, Google Cloud Storage). The client's data pipeline picks them up automatically.

How it works: one product, many destinations

Each client gets their own destination configured — but the same export code runs for everyone.

ClientDestinationConfig stored
Notting Hill Genesiss3://nhg-data-bucket/plentific/Row in config table
Peabodys3://peabody-warehouse/incoming/Row in config table
Southern Housingazure://southern.blob.core.windows.net/plentific/Row in config table

Not bespoke per client. Same code, different config. Adding a new client means adding a row to a database, not writing new code.

What happens when the schema changes?

This is the hard part. Two types of changes:

Change typeExampleClient noticeAction required by client
Additive (non-breaking) New column uprn added to locations Changelog only, no advance notice needed None — their pipelines ignore new columns
Deprecation Column legacy_category_code will be removed in 90 days 90 days advance notice, changelog, direct email Update their pipelines before deadline
Breaking Column tenant_name renamed to resident_name, or type changed 90+ days notice, changelog, direct email, migration support Must update pipelines or break
New version v2 schema released with restructured tables Changelog, migration guide, support both versions Migrate when ready, within support window

We do not modify per client. We maintain one schema per version. All clients on v2023-02-01 get identical files. Versioning absorbs the change, not manual work.

Tech and effort to build this

Today: someone gets a request, writes SQL, exports CSV, emails it. No tracking, no SLA, no consistency.

Automated version:

ComponentTech optionsEffort
Export jobPython script, Airflow DAG, or dbt job. Runs SQL, writes Parquet2-3 weeks
SchedulerAirflow, Dagster, AWS Step Functions, or cron1 week
Destination connectorsAWS SDK (S3), Azure SDK (Blob), GCS SDK. Libraries exist1-2 weeks
Config managementDatabase table: client → destination → credentials → schedule1 week
Monitoring and alertsAlert if job fails. Logs of what was sent, when, file sizes1 week
Client UI (optional)Self-service: configure bucket, see history, trigger re-export2-4 weeks

Total: 8-12 weeks for a solid v1 with one engineer.

Impact across product, commercial, engineering, governance

Scenario: large housing association wants raw data

Example: Notting Hill Genesis (66,000 homes)

Their ask: "We have a data team. We want raw repairs data in our Snowflake warehouse every night so we can build our own dashboards and join it to our tenancy data."

What we give them:

  • Parquet files dropped to their S3 bucket at 2am UTC
  • Tables: repairs, bookings, inspections, locations, reference_data
  • Schema version v2023-02-01 — same as the API version
  • Changelog notifications to data-team@nhg.org

What they do with it:

  • Their Airflow pipeline picks up files, loads into Snowflake
  • They join to their tenancy data using UPRN
  • They build dashboards showing repair times by estate, by vulnerability status
  • They generate their own regulator returns using their definitions, not ours

Is this bespoke? No. The only thing specific to NHG is one row in the config table: their bucket, their credentials, their schedule. The export code is identical for every client.

Is it scalable? Yes. Client 2 is the same process: add config row, test connection, go live. No custom code. Onboarding takes days, not weeks.

Customer problem it solves

Need (from the brief)How this solves it
Raw or lightly modelledFiles are direct table exports. Minimal transformation. Client does their own modelling
Dependable scheduleRuns every night at configured time. Monitoring alerts on failure. SLA tracked
Stable schemaVersioned schema. Columns only change with notice. Breaking changes = new version
Build pipelines againstFiles land in bucket automatically. Client's Airflow/dbt picks them up. No manual clicks

Challenges and pushback

Scalability and pricing (10 to 100 clients)

ClientsCost driversPricing model
10 clients Compute for export jobs (minimal). Egress to their buckets (main cost). Support for setup Flat fee per client, included in premium platform tier. Or: per-property pricing
100 clients 100x the egress. Some clients have 10x more data than others. Photos are the killer (large files) Usage-based: per GB exported monthly. Or: tier by property count. Photos excluded from base tier — separate add-on

Key insight: The export code scales fine (same job, 100 configs). The cost that scales is egress — moving data out of our cloud. So pricing must track data volume, not client count.

Value, effort, risk

DimensionRatingWhy
Volume potentialHighEvery client can use it. No warehouse compatibility required
Build effortMedium (8-12 weeks)Export jobs, scheduling, monitoring, per-client config. Not trivial, but well-understood
Ongoing effortLowAutomated. Support tickets for setup issues, occasional failures
RiskLowWell-understood pattern. Many B2B SaaS companies do exactly this
BespokeVery lowSame export for everyone. Only config differs. No custom code per client

Metrics to measure success

When to revert or try something else

Technical: multitenancy and APIs

User journey example

  1. Client signs contract including data export add-on
  2. Client's IT provides an S3 bucket ARN with write permissions for Plentific's IAM role
  3. Plentific ops adds config: tables = repairs, bookings, inspections. Schedule = 2am UTC. Destination = client's bucket
  4. Test export runs. Client's data engineer confirms files appeared
  5. Production export starts running nightly
  6. Client builds pipeline in dbt/Airflow to load files into Snowflake
  7. Every morning, fresh data is in their warehouse, ready for dashboards
  8. When schema changes: client gets email, updates their pipeline if needed, no disruption

Delivery mechanism 2: Data sharing (zero-copy)

What it is (simple terms)

Instead of copying files, the client sees a live view of their data that lives in Plentific's warehouse. Snowflake calls this "Data Sharing", BigQuery calls it "Analytics Hub". No files move. The client queries the data directly, but can only see their own records.

Why it could work

Impact by area

AreaImpact
ProductPremium tier feature. Need UI to manage shares, see usage
EngineeringBuild secure views per client. Ensure row-level security is bulletproof
GovernanceData stays in Plentific's warehouse — more control, but also more liability
ComplianceNeed to verify client can only see their data. Audit logging essential

Customer problem it solves

NeedHow this solves it
Raw or lightly modelledDirect access to tables (via views), minimal transformation
Dependable scheduleNo schedule needed — always live
Stable schemaVersioned views. Old views stay available during transition
Build pipelinesClient queries the share from their own warehouse. Native integration

Challenges and pushback

Scalability and pricing (10 to 100 clients)

ClientsCost driversPricing model
10 clientsStorage (shared), compute for views. Low marginal cost per clientPremium add-on fee. Flat per client or per-property
100 clientsManaging 100 secure shares. Row-level security complexity. Support load increasesTiered by usage or property count. Consider query volume caps

Value, effort, risk

DimensionRatingWhy
VolumeMediumOnly works for clients on compatible warehouse
EffortMedium-HighRow-level security, view management, cross-account sharing
RiskMediumSecurity failure = data breach. Must be bulletproof
BespokeLowSame views for everyone, filtered by tenant

Metrics to measure success

When to revert or try something else

Technical: multitenancy and APIs

User journey example

  1. Client (on Snowflake) asks for real-time access
  2. Plentific creates a Snowflake share scoped to that client's data
  3. Client's admin accepts the share in their Snowflake account
  4. Client sees tables appear as a new database in their Snowflake
  5. Client queries directly: SELECT * FROM plentific_share.repairs WHERE ...
  6. Data is always current — no waiting for exports

Delivery mechanism 3: Bulk API endpoints

What it is (simple terms)

Add new API endpoints designed for pulling large amounts of data at once. Instead of calling the API 10,000 times for 10,000 jobs, the client calls one endpoint and gets all jobs in one response (paginated). They pull when they want, as often as they want.

Why it could work

Impact by area

AreaImpact
ProductNew API tier or add-on. Rate limits, authentication, documentation
EngineeringBuild bulk endpoints, pagination, change tracking (watermarks). Medium effort
GovernanceData leaves via API. Same as current API, but higher volume
ComplianceExisting API security applies. Need rate limiting to prevent abuse

Customer problem it solves

NeedHow this solves it
Raw or lightly modelledAPI returns records as-is, JSON format
Dependable scheduleClient pulls on their schedule. Availability SLA on the API
Stable schemaAPI versioning (already exists: 2023-02-01). Additive-only within version
Build pipelinesClient calls API from Airflow/dbt, loads into warehouse

Challenges and pushback

Scalability and pricing (10 to 100 clients)

ClientsCost driversPricing model
10 clientsAPI compute, bandwidth. Depends on call frequencyInclude in premium API tier. Rate limit per client
100 clients100 clients all pulling at midnight = spike. Need infrastructure to handlePer-call or per-record pricing. Or monthly quota

Value, effort, risk

DimensionRatingWhy
VolumeHighAny client can use it. No warehouse compatibility needed
EffortMediumNew endpoints, but builds on existing API infrastructure
RiskLow-MediumAPI patterns well understood. Risk is in scaling
BespokeLowSame endpoints for everyone

Metrics to measure success

When to revert or try something else

Technical: multitenancy and APIs

User journey example

  1. Client's data engineer gets API credentials with bulk access enabled
  2. They write a script: call GET /v1/bulk/jobs?since=2026-09-10
  3. API returns paginated JSON with all jobs changed since that date
  4. Script loads JSON into their warehouse (Snowflake, BigQuery, whatever)
  5. They schedule this to run every hour via Airflow
  6. Their dashboards stay fresh within ~1 hour

Delivery mechanism 4: Read-only warehouse access

What it is (simple terms)

Give clients a username and password to connect directly to a read-only copy of their data in a database. They can run SQL queries, connect BI tools (Tableau, Power BI), or extract data however they want.

Why it could work

Impact by area

AreaImpact
ProductPremium feature. Credential management, usage monitoring, query limits
EngineeringProvision isolated schemas per client. Read replicas. Query governors. High effort
GovernanceData stays in Plentific's infrastructure. Full audit trail possible
ComplianceHighest scrutiny. Client running arbitrary SQL against live data. Security critical

Customer problem it solves

NeedHow this solves it
Raw or lightly modelledDirect table access — as raw as it gets
Dependable scheduleAlways available. 99.9% uptime SLA
Stable schemaVersioned views layer on top of tables. Old versions maintained
Build pipelinesConnect any tool that speaks SQL/JDBC/ODBC

Challenges and pushback

Scalability and pricing (10 to 100 clients)

ClientsCost driversPricing model
10 clientsRead replica capacity, query compute, storage for per-client schemasPremium tier, flat fee. Query time limits included
100 clientsInfrastructure scales significantly. Query isolation becomes critical. Support scales tooPer-seat or per-query pricing. Compute quotas. Overage charges

Value, effort, risk

DimensionRatingWhy
VolumeMediumOnly for sophisticated clients with data teams
EffortHighPer-client isolation, query governors, credential management
RiskHighSecurity breach, performance issues, support load
BespokeMediumEach client gets their own schema, some config

Metrics to measure success

When to revert or try something else

Technical: multitenancy and APIs

User journey example

  1. Client signs up for warehouse access tier
  2. Plentific provisions a read-only user with access to views filtered to their data
  3. Client receives connection string: host=data.plentific.com, user=nhg_readonly, ...
  4. Client's BI analyst connects Tableau directly to the database
  5. They build dashboards that refresh in real-time from live data
  6. No pipelines, no exports, just SQL

Quick comparison

Dimension Nightly file drop Data sharing Bulk API Warehouse access
Freshness Daily Real-time Hourly possible Real-time
Client effort Low — just receive files Low — just query Medium — build pipeline Low — just connect
Plentific effort Medium Medium-High Medium High
Works for any client Yes No — same warehouse only Yes Yes
Security risk Low Medium Low High
Cost at scale Egress grows Low marginal Compute grows Infrastructure grows
My recommendation Start here Phase 2 for Snowflake clients Already have API — extend it Only if clients demand it

Forward-looking: AI and automation

Once the basic data product exists, there are opportunities to add value with AI and automation.

AI-powered features

MCP (Model Context Protocol) and agent integration

SaaS-style features on top of the data product

Why this matters for the case study

The data product is not the end state — it's the foundation. Once data flows reliably to clients, you can build services on top. The question is: what do you build yourself vs. what do you let clients build in their own warehouse?