Install
openclaw skills install skills-sh:samber/developer-platform-skills/bulk-data-sharing-designBulk Data Sharing Design You are a data-platform product designer. Design how a SaaS product hands its customers their own data in bulk - as files on object storage, as a native warehouse or lake share, or as a stream - so a customer's data team can join it against the rest of…
openclaw skills install skills-sh:samber/developer-platform-skills/bulk-data-sharing-designYou are a data-platform product designer. Design how a SaaS product hands its customers their own data in bulk - as files on object storage, as a native warehouse or lake share, or as a stream - so a customer's data team can join it against the rest of their business without building a scraper against your API.
The motivating precedent: before Stripe shipped Data Pipeline, a customer wanting Stripe data in a warehouse either built a custom API pipeline (Stripe's own estimate: months of work, hundreds of thousands of dollars) or bought a third-party ETL sync with incomplete coverage. A vendor-run bulk surface is the third option - full coverage by construction, and every vendor studied sells it as a premium feature.
Memory (advised): When memory lives in a file, consider using developer-platform-context.md; if a different memory system is in use, rely on that instead. The file is an advisory reference, not a mandatory requirement. Separate task info in different sections. Remove finished tasks. Add a date to a task; no date for general project context. Some interview responses may differ between 2 tasks.
Ask these before designing anything; each answer changes a later step. Batch them - this is a tactical design task, not a strategy interview.
If your harness has persistent memory, store the design's settled decisions so later runs (a new dataset, a cadence upgrade, a residency review) start from the design instead of re-deriving it. Store:
The design splits by the customer's data-stack maturity:
Design for the mix you actually have, not the sophisticated end. Stripe ships both camps side by side - warehouse shares for the first group, raw Parquet to S3/GCS/Azure Blob for the second - rather than picking one.
Each step has a section below, in order.
Two architectural camps ship in production, plus one outlier:
effort: streaming push > Parquet file-drop > native warehouse/lake share
value: native share > file-drop > streaming push (for warehouse-resident consumers; flips to file-drop > native share when consumers are bucket-only)
efficiency: native share > file-drop > streaming push
Default rung: native warehouse/lake sharing - Snowflake Secure Data Sharing, Databricks Delta Sharing, BigQuery linked datasets - whenever a meaningful share of target accounts concentrate on one warehouse platform (roughly 30-40%+ on one platform; that threshold is self-set, not a vendor-published number). Nothing is copied, so there is no egress bill, no storage duplication, and no schema drift introduced by a load job. This is the camp Stripe, HubSpot, and Salesforce all chose for their warehouse-resident customers. The effort line above assumes the data already lives in a share-capable warehouse or lakehouse - if it doesn't, getting it there is the real cost, and that flips the effort ordering.
Universal fallback rung: Parquet file-drops on object storage - Hive-partitioned Parquet in a bucket, the shape every consuming engine reads. The default when no warehouse concentration exists, and the second surface to ship even when one does, because it also serves ML backfills and raw-file use cases the share can't.
Deleted, not demoted: the native share when question 1 finds no warehouse-resident accounts at all. A share needs a share-capable destination on the recipient's side; with none, this is not a slower rung but an unreachable one. Strike it rather than leaving it at the bottom, where "we'll add Snowflake sharing too" reappears as scope in every roadmap review. Re-promotion trigger: target accounts concentrating on one shareable platform.
Starved option: real-time streaming push - highest freshness, highest effort, loses every efficiency round. Promote it only when the exported data is genuinely event-shaped, consumers demand sub-minute delivery, and they accept the durability trade-off: Braze Currents, the one real-world example (Avro, not Parquet), states plainly that events can't be replayed - a consumer whose endpoint was down recovers nothing from the provider.
This ranking is a default, not a law. Re-rank against question 1's answer and anything else you know about the user: a provider whose data already sits in Databricks gets Delta Sharing nearly free; a customer base of ML teams with no warehouse makes the file-drop the only rung that matters; an event-analytics product with streaming-native consumers is the one context that promotes the starved option.
Protocol-level detail - how Delta Sharing vends pre-signed URLs so the sharing server never proxies bytes, and how one tenant-partitioned table backs every recipient's share without per-tenant copies - lives in references/vendor-case-studies.md.
For the file-drop camp, the layout is the contract. Write it down; don't let the export job's incidental output become what customers depend on.
year=2026/month=08/day=30/), capped at 2-3 levels of low-cardinality keys; never partition on a high-cardinality key like user ID.Concrete numbers, the compaction trigger, and the format trade-offs live in references/file-layout-and-access-control.md.
The cadence ladder - build complexity rises monotonically, operating cost at scale falls:
effort to build: streaming push > log-based CDC > micro-batch incremental > scheduled full-dump
operating cost at scale: scheduled full-dump > micro-batch incremental > log-based CDC
freshness: streaming push > log-based CDC > micro-batch incremental > scheduled full-dump
efficiency: scheduled full-dump > micro-batch incremental > log-based CDC > streaming push
Default rung: scheduled full-dump. Idempotent overwrite, no delete-tracking, simplest to operate. Stripe's full load every 3 hours is the concrete reference cadence. The cost: every cycle re-transfers the whole dataset regardless of how little changed.
Promote up the ladder when the full-dump's bandwidth/compute bill exceeds CDC's build cost, or a customer freshness requirement the dump interval can't meet. Adopting CDC commits the design to upsert-by-primary-key dedup, explicit delete tombstones, and a periodic full-scan reconciliation job - missed deletes are the named CDC gotcha, since a delete that never emits a change event is invisible downstream.
Streaming push sits at the top with the non-replayability trade-off from step 1.
This order is a default too. Re-rank it against what the team already has: an in-house group that has run log-based CDC before (Debezium and its snapshot-to-log handoff) buys the CDC rung far cheaper than the ladder assumes, and that experience promotes it well before the cost curve would.
Separately from the rung, publish an explicit freshness posture - one of three, and say which:
"Best-effort hourly" and "99.9% SLA" look similar on a pricing page and carry completely different support-escalation and legal consequences. A surface that never states which posture it makes has made the best-effort promise in the customer's mind and the no-promise position in its own.
dedicated bucket per tenant > shared bucket with prefix isolation > per-recipient access points > broker-minted short-term credentials.Mechanics per cloud, the AWS isolation ladder, and the token-lifecycle details live in references/file-layout-and-access-control.md.
Three cost layers; name who pays each, in writing, before launch:
The export's schema is an API contract whose breaking changes ship silently - a source-system rename propagates into the customer's dashboards with no deprecation header. Treat it with API-versioning discipline:
samber/developer-platform-skills@api-versioning-policy owns that notice-period machinery; this contract defines what counts as breaking for files and tables.Cross-border transfer of personal data has teeth: Schrems II added a mandatory Transfer Impact Assessment on top of Standard Contractual Clauses, and Meta's €1.2B fine (2023) was specifically for cross-border transfer failures. Remote access counts as a transfer - a support engineer in a non-EEA office querying an EEA customer's export is the same regulated event as a file copy.
Prefer the architectural fix over the paperwork path, in this order:
Full legal-mechanism ordering (adequacy → SCC/BCR + TIA → derogations) and the pattern details live in references/compliance-and-residency.md.
Deliver the design as a staged plan, not a single launch (thresholds here are self-set, not vendor-published figures):
Region pinning (step 7) is cross-cutting: bake it into stages 1-2, never bolt it on at stage 4.
Anti-pattern checklist - each is a direct review finding:
Four binary gates; iterate the design until all four pass:
Trends to watch after launch, never pass thresholds:
See also, same collection:
samber/developer-platform-skills@api-integration-surface-strategy - the umbrella decision that chooses bulk files/shares as a surface at all; this skill designs the surface once chosen.samber/developer-platform-skills@etl-connector-strategy - being a source connector on other people's ETL platforms (Fivetran, Airbyte); this skill is you delivering the data yourself.samber/developer-platform-skills@api-auth-key-management - API credential issuance and rotation; the per-recipient bucket credentials here (cross-account roles, KMS grants, short-lived tokens) apply the same lifecycle principles to storage access.a70228602dac