The join layer for operational data

Build analytics-ready rows before they land.

JoinLayer sits between operational databases and analytics targets. Map fields, join lookup context, preview the exact output, validate the target contract, then run full, realtime, backfill, or scheduled syncs.

For teams where copying tables is not enough: customer names, segments, pricing tiers, plan metadata, and target constraints should be handled before the destination becomes a cleanup queue.

PostgreSQL source/target MySQL / MariaDB source/target BigQuery target Kafka source/target ClickHouse source/target Lookup joins
pipeline: orders_to_analytics
realtime + backfill Checks passed
Source
orders
id1042
customer_id501
statuspaid
->
Join
customer_lookup
501Acme
segmententerprise
addsname + segment
->
Target
orders_sink
order_id1042
customerAcme
segmententerprise
Shape
idorder_id
total_centsgross_cents
customer_namecustomer_name
Preview
ordernamesegment
1042Acmeenterprise
1043Brightgrowth

Why raw replication breaks

The pipeline is green.
The data still isn't useful.

A raw copy can pass while the target table is full of service IDs, missing context, and shapes analysts cannot safely query. The familiar workaround is to load everything first and repair it later. That turns the warehouse into a cleanup queue.

Source tables speak in app internals

Fields like customer_id, plan_id, status codes, and pricing references make sense to services, not to analytics users.

Fix-later logic becomes permanent

Renames, filters, joins, null handling, and lookup rules spread through downstream transformations because the pipeline never declared the output row.

Bad shape fails at the worst moment

Missing target columns, NOT NULL constraints, lookup misses, and write errors usually surface only after someone presses run.

Operators need answers, not archaeology

Run status, worker allocation, usage, cache state, and row diagnostics should be visible without asking someone to dig through logs.

The missing layer

Make the final row explicit before anything writes.

JoinLayer sits at the point where source fields, lookup context, target constraints, and run capacity are all visible. That is where the row should be shaped, checked, and explained.

Target contractOutput columns first
shape
Lookup joinContext before write
enrich
Preflight guardPreview, checks, diagnostics
prove
Shape
Map the target contract directly. Declare the output columns instead of landing service-shaped fields and repairing them later.
Join
Add lookup context inside the pipeline. Customer names, segments, catalog attributes, pricing tiers, and reference labels become part of the written row.
Prove
Preview and validate before launch. Required fields, lookup output, unsafe nulls, worker capacity, and row diagnostics are checked before the run starts.

Common pipeline patterns

Concrete jobs where raw replication is not enough.

JoinLayer is for database syncs where the destination needs business-ready rows: mapped fields, lookup enrichment, previewed output, target validation, and readable diagnostics before the run writes.

PostgreSQL->BigQuery

Orders enriched with customer context

Replicate orders while joining customer name, segment, region, or account metadata before the analytics table receives the row.

lookup enrichmenttarget previewschema checks
MySQL CDC->Postgres

Subscriptions shaped for reporting

Map application fields, filter unwanted statuses, and enrich plan_id with plan name, billing period, and pricing tier.

CDC pipelinefield mappingfilters
Catalog+Events

Product activity with catalog labels

Turn product_id, SKU, or category codes into readable analytics rows using lookup tables instead of repeating joins downstream.

reference dataproduct catalogrow shaping
Backfill+Realtime

History loaded through the same rules

Use the same mappings, filters, lookup joins, and target constraints for historical backfill and ongoing realtime replication.

transactional targetsrun checksDLQ diagnostics

Before / after

Stop landing rows that still need interpretation.

JoinLayer turns application-shaped records into target-shaped records before the run writes them.

Raw source row
customer_id501
total_cents4820
statusdraft
plan_idpro_annual
->
Target-ready output
customer_nameAcme Corp
gross_cents4820
row_filterdraft skipped
customer_segmententerprise

Design the output row first. Then run the pipeline.

The setup flow keeps source shape, lookup context, target contract, and run mode in one path.

01

Connect

Choose the source table, lookup data, and destination table for one concrete pipeline.

02

Shape

Map target fields, filter unwanted rows, and add enrichment fields from lookup tables.

03

Preview

Inspect the final rows exactly as they will be written, including joined lookup values.

04

Run

Start a full load, schedule, or connector-compatible realtime mode only after checks pass.

Lookup enrichment

Make lookup context part of the pipeline.

If an order only carries customer_id, JoinLayer can fetch customer_name and segment from a lookup table and write the enriched business row to the target.

Use direct lookups when freshness and simplicity matter. Use a materialized DuckDB cache when repeated enrichment traffic needs to move closer to the worker.

Direct lookup Fresh reads from the lookup source. Good for small indexed tables and simple joins.
Materialized cache Worker-local lookup data for higher-volume enrichment paths with controlled refresh.

orders

{
  "id": 1042,
  "customer_id": 501,
  "status": "paid"
}
+

customer_lookup

{
  "id": 501,
  "name": "Acme Corp",
  "segment": "enterprise"
}

orders_sink

{
  "order_id": 1042,
  "status": "paid",
  "customer_name": "Acme Corp",
  "customer_segment": "enterprise"
}

When a run fails, the product should say why.

Checks, worker state, usage, lookup cache telemetry, and row-level diagnostics are visible in the product instead of disappearing into logs.

run checks · orders_to_analytics
Ready
OK
Target write shape checkedRequired columns are mapped, enriched, nullable, or intentionally ignored.
preflight
OK
Lookup contract verifiedcustomer_lookup is reachable, keyed, and returns the selected output fields.
12ms p50
OK
Preview matches target outputSample rows include mappings, filters, and enriched values before launch.
sample
OK
Worker capacity reservedThe run can be claimed by the assigned worker pool without blocking the API.
pool-a

Runtime

Workers are separate from the API path.

Each worker reports heartbeat, active claim, throughput, throttling, row failures, and lookup cache state.

1.2k/sworker throughput
0blocking checks
2enriched fields
3DLQ diagnostics

Start where product data actually lives.

SQLDatabases and warehouseNow

Read, shape, enrich, and deliver operational rows across supported databases and analytical targets.

PostgreSQL source PostgreSQL target MySQL / MariaDB BigQuery target ClickHouse source / target

EVTEvent streamsNow

Consume and publish JSON or Avro records through Kafka with explicit schema and offset contracts.

Kafka source Kafka target Schema Registry JSON / Avro

JOINEnrichment sourcesCore

Lookup data is first-class because it turns technical source rows into business records.

Customer tables Product catalogs Pricing tables Reference datasets
Focus

The first focus is relational application data and analytical destinations where row shape matters before write.

Expansion

Connector coverage grows around real customer pipelines. The durable value stays the same: map, enrich, preview, validate, and explain the row.

Production scope

Built for serious operational pipelines.

The production scope covers relational databases, Kafka event streams, analytical targets, lookup enrichment, target preview, write checks, worker diagnostics, and clear failure handling.

managed service worker-separated runtime observable runs credential-aware access
Now
PostgreSQL, MySQL/MariaDB, Kafka, ClickHouse, and BigQuery connector paths. Use database snapshots or CDC, Kafka JSON/Avro streams, and supported analytical targets to build target-ready rows.
Core
Mapping, filters, lookup joins, supported previews, validation, scheduling, realtime, and run diagnostics. Coordinated realtime with history is available only on compatible PostgreSQL and MySQL target routes.
Runtime
Designed around a separated API, scheduler, and worker runtime. The back office stays out of the data plane while workers report heartbeats, claims, throughput, throttling, and row diagnostics.
Next
Snowflake, Redshift, and customer-driven connector expansion. Connector breadth grows around teams that bring real messy pipelines and clear destination requirements.

Different platforms start from different problems.

Read practical, sourced comparisons of connector platforms, managed ELT, and stream processing—without pretending every workload needs the same tool.

Our approach

Each article begins with the other platform's strengths, then explains the product boundary where JoinLayer fits.

Plain answers

What JoinLayer is, and what it is not.

These answers are intentionally direct. JoinLayer is a data pipeline product for teams that want operational database rows to be understandable, enriched, and checked before they become analytics inputs.

What is JoinLayer?

JoinLayer is a pipeline layer between operational databases and analytics destinations. It maps source fields to target fields, enriches rows with lookup data, previews the final output, validates write constraints, and runs the pipeline with visible diagnostics.

How is it different from raw database replication?

Raw replication focuses on moving tables. JoinLayer focuses on the target-ready row. It helps teams avoid landing raw service-shaped data and then rebuilding meaning later in downstream transformations.

Does JoinLayer replace the warehouse or downstream modeling?

No. JoinLayer prepares cleaner landing tables before data reaches the analytics target. Warehouses, BI tools, and modeling layers still matter, but they should not have to repeat basic lookup joins and contract checks that the pipeline already knows.

What does lookup enrichment mean?

Lookup enrichment means a source row can use a key such as customer_id, product_id, plan_id, or region_code to pull fields from another table before writing the target row. Common examples include customer name, segment, pricing tier, catalog attributes, and reference labels.

Which connectors are available?

JoinLayer supports PostgreSQL and MySQL/MariaDB sources and targets, Kafka JSON or Avro sources and targets, finite ClickHouse sources and append targets, and BigQuery targets. Snowflake and Redshift remain planned.

Who should care about JoinLayer?

JoinLayer is built for SaaS, marketplace, and data teams that sync product databases into analytics systems and keep rediscovering the same problem: the data moved successfully, but the rows still need business context before anyone can use them.

Bring us your first messy pipeline.

Create a workspace, connect your systems securely, and validate the target-ready row before the first run.