Why data ingestion suddenly matters (again)
If you work in product analytics, growth, or data engineering, you’ve probably felt the shift: teams want numbers that update now, not tomorrow. But “real-time” means different things depending on whether you’re tracking feature adoption, fraud signals, in-app funnels, or logistics events. The ingestion method you choose can quietly decide whether your dashboards are trustworthy, your cloud bill stays sane, and your team sleeps at night.
This post compares three practical ways to move data into your warehouse/lakehouse: batch loads, change data capture (CDC), and event streaming. We’ll look at what each one is best at, what it costs (in complexity and money), and how to choose a combo that fits your reality.
The three approaches (and what they really mean)
1) Batch loads: scheduled snapshots
Batch is the classic: export data on a schedule (hourly, daily), then load it into your analytics system. This is still everywhere because it’s simple, predictable, and works for tons of use cases.
- Common tools: dbt + warehouse ELT, SFTP dumps, managed connectors (Fivetran/Stitch/Airbyte), cloud storage drops.
- Typical latency: 1 hour to 24 hours.
- Best for: finance reporting, slower-moving KPIs, historical backfills, systems that don’t support streaming/CDC.
2) CDC: database-level changes as a stream of row updates
Change Data Capture captures inserts/updates/deletes from a database log (like MySQL binlog or Postgres WAL) and ships those changes downstream. You can think of it as “near real-time replication for analytics,” usually landing changes into a warehouse with merge/upsert logic.
- Common tools: Debezium, AWS DMS, Fivetran/HVR, Kafka Connect.
- Typical latency: seconds to minutes (depending on throughput and downstream merges).
- Best for: operational analytics, near-real-time dashboards based on transactional tables, keeping a warehouse in sync without full reloads.
3) Event streaming: the product emits events as they happen
Event streaming means the application (web/mobile/backend) publishes events like signup_completed, checkout_started, feature_toggled, or delivery_delayed. A streaming platform (Kafka, Kinesis, Pub/Sub) transports them, and consumers process them for real-time analytics or operational actions.
- Common tools: Kafka/Confluent, AWS Kinesis, Google Pub/Sub, Segment, RudderStack; stream processing with Flink, Spark Streaming, Kafka Streams.
- Typical latency: sub-second to a few seconds.
- Best for: product analytics, personalization, anomaly detection, live ops monitoring, behavioral funnels.
Comparison: which approach fits which job?
Latency & freshness
If your team asks, “Why does the dashboard lag?” start here.
- Batch: predictable but stale between runs. “Today” often means “yesterday.”
- CDC: fast enough for most operational reporting, but downstream merge workloads can introduce minutes of delay.
- Streaming: best-in-class freshness; ideal when value decays quickly (fraud, outages, flash sales, logistics).
Data modeling: what you get vs what you want
- Batch: you usually get clean, modeled tables after transformations. Easy to reason about.
- CDC: you get row-level mutations. Great for “current state” tables, but you’ll need careful handling for deletes, late-arriving changes, and schema evolution.
- Streaming: you get behavioral facts. This is gold for analytics, but it’s messy if you don’t standardize event names/properties and enforce contracts.
Cost profile (hidden and obvious)
Costs aren’t just tool pricing. They show up as engineering time, operational overhead, and downstream compute.
- Batch: cheaper to run, cheaper to debug. Warehouse compute spikes during loads.
- CDC: moderate. You pay for replication infra and for warehouse merges/upserts (which can get expensive at scale).
- Streaming: potentially the most expensive to build and operate well (brokers, schemas, monitoring, replay). But it can reduce warehouse load if you pre-aggregate or filter earlier.
Reliability & “trust factor”
Fresh data is worthless if it’s wrong.
- Batch: fewer moving parts; failures are obvious (“job failed”). Reprocessing is straightforward.
- CDC: robust if configured right, but subtle bugs happen (e.g., missing delete events, out-of-order updates, primary key changes).
- Streaming: failure modes can be sneaky: duplicate events, late events, consumer lag, broken schemas. You need strong observability and clear replay procedures.
Real-world examples (what teams actually do)
Ecommerce: blending streaming + batch to avoid chaos
An ecommerce team wants a live view of “orders placed per minute” for promo monitoring. They use event streaming for order_placed and payment_failed events, which powers a real-time operations dashboard. But finance reconciliation still runs on batch-loaded order tables nightly, because refunds, adjustments, and edge cases settle over time.
Actionable tip: define a “real-time dashboard” metric and a “finance-grade” metric as two separate definitions. Label them clearly to prevent internal arguments.
SaaS product analytics: streaming events, CDC for billing truth
A SaaS company instruments events like invite_sent, integration_connected, and report_exported to understand activation. That’s event streaming. But subscription status lives in the billing DB; they use CDC to keep the warehouse updated with near-real-time plan changes. Joining both gives “activation by plan tier” without waiting for a daily batch.
Actionable tip: store event time (event_ts) and ingestion time (ingested_ts) separately. This helps you spot delays and correct funnels when events arrive late.
News & media: fast spikes and the need for resilient pipelines
Traffic can spike unpredictably. When a major story breaks, editorial and ad ops teams want minute-by-minute signals. Many publishers rely on streaming for pageview and engagement events, but keep batch as a backstop for attribution and long-range reporting.
Also, public interest topics often drive data literacy. For example, broader discussions about data usage and policy show up in mainstream reporting—one handy starting point for context and data-driven coverage is The Guardian’s data and interactive journalism, which regularly showcases how data is collected, validated, and communicated to the public.
Decision framework: choose based on questions, not hype
Ask these 6 questions
- 1) How fast does the business need to react? If the window is minutes, batch is out. If it’s hours, batch might be perfect.
- 2) Are you tracking behavior or state? Behavior (clicks, views, steps) leans streaming. State (accounts, invoices, inventory) leans CDC/batch.
- 3) What’s your tolerance for duplicates? Streaming often requires idempotency (dedupe keys). If duplicates would be catastrophic, design for it upfront.
- 4) How often does your schema change? Fast-moving products break pipelines. Streaming benefits from explicit schema/versioning (contracts). CDC needs careful handling of DDL changes.
- 5) Who will operate this at 2 a.m.? Streaming is powerful but operationally demanding. If you’re a small team, consider managed services or start with batch + selective CDC.
- 6) What’s your “source of truth”? Decide which system wins when data disagrees: event stream, OLTP DB, or an internal ledger.
Practical setup options (including a “most teams should do this” path)
Option A: Batch-first (simple, solid)
Choose this if: you’re early-stage, data volumes are moderate, and “yesterday + today so far” is good enough.
- Run hourly micro-batches for critical tables (orders, users).
- Run daily full refresh for slow-changing dimensions (plans, regions).
- Use a lightweight event tracker only for a few key events (signup, purchase) to sanity-check trends.
Watch out for: dashboard users assuming numbers are real-time when they aren’t. Put the data freshness timestamp directly on dashboards.
Option B: CDC + Batch (near-real-time without full streaming complexity)
Choose this if: your core metrics come from transactional tables and you want faster updates without redesigning the app to emit events.
- Use CDC for high-value tables (payments, orders, subscriptions).
- Keep batch for everything else (reference data, long-tail systems).
- Model “current state” tables with merges; model “history” with append-only change tables.
Watch out for: merge/upsert costs and performance. Partitioning and clustering (or primary key indexing strategies, depending on your platform) matter a lot.
Option C: Streaming + CDC + Batch (the grown-up stack)
Choose this if: you need real-time behavioral analytics and reliable state from databases.
- Streaming for user/product events and operational signals.
- CDC for transactional truth (billing, inventory).
- Batch for backfills, reprocessing, and low-priority sources.
Watch out for: governance. Without clear event naming standards and data contracts, streaming can turn into an expensive firehose.
Actionable tips to make any approach work better
- Add a freshness SLA: e.g., “Core revenue metrics update within 10 minutes.” Then monitor it like uptime.
- Instrument lineage in plain language: “This chart uses streaming events; refunds come from CDC; final totals settle nightly.”
- Design for replay: even batch pipelines need re-runs; streaming absolutely needs replay plans (what happens when you change event schema?).
- Track data quality like product quality: add checks for null spikes, volume drops, and duplicate rate. A simple threshold-based alert catches a lot.
- Use a stable event ID: for streaming, generate a unique ID at the client/server and carry it through to storage to dedupe safely.
Conclusion: the “best” ingestion method is usually a mix
Batch loads are still the champs for simplicity and cost control. CDC shines when you need near-real-time accuracy from transactional systems without rewriting your app. Event streaming wins when user behavior and instant reaction are the whole point—but it demands discipline.
If you’re unsure, start with a baseline batch pipeline, then add CDC for the handful of tables where freshness matters. Add streaming when you have a clear, high-value real-time use case (fraud, live ops, activation funnels) and the team capacity to run it. In data services, boring and reliable beats flashy and fragile—until the moment real-time genuinely moves the needle.

