Schema drift
Added, removed, and retyped columns. The first clean check stores the schema. A later check opens an anomaly when a column disappears or a type changes, even if the job stays green.
For small data teams
Pipelines succeed while row counts collapse, columns disappear, and freshness slips. Row Monitor is data quality monitoring for the tables you name: schema drift, volume, and lag, in plain English.
Monitors
Northwind demo| Table | Signal | Observed | Baseline | Status | Alert |
|---|---|---|---|---|---|
| public.orders | Row count | 6,920−62% | 18,420 | Drift | Slack |
| public.orders | Schema | coupon_code removedcolumn gone | present | Drift | Slack |
| public.events | Freshness | 3 days behindupdated_at | under 6 hours | Stale | |
| analytics.sessions | Volume | 41,202within band | 40,880 | Healthy | — |
| mart.customers | Schema | 18 columnsmatch | 18 columns | Healthy | — |
| staging.payments | Freshness | 14 minwithin band | under 1 hour | Healthy | — |
Why · public.orders
The load still finishes, but orders is about a third of its baseline and the coupon column is gone. A filter in the model, or an upstream delete, does this without failing the job.
Reads and alerts through
What it watches
dbt and Airflow tell you a task failed. They stay quiet when the task succeeds and the table is wrong. Row Monitor watches schema drift, data freshness, and row-count anomalies — the breaks a green job will not page.
Added, removed, and retyped columns. The first clean check stores the schema. A later check opens an anomaly when a column disappears or a type changes, even if the job stays green.
Freshness lag when updated_at stops moving. Row Monitor compares the newest timestamp with the threshold you set and alerts when the table goes quiet.
Volume spikes and drops against the baseline row count. A collapse like the demo’s 62% drop on orders is an anomaly, not a successful load.
Each workspace keeps one Slack incoming webhook and an alert address. The message carries the table, the check, and the diff. Without a Resend key in dev, it is printed and stored as a console delivery.
Claude writes a plain-language root cause from the diff when an API key is set. Without one, you still get a template explanation of the schema, volume, or freshness break.
You also get a schema.yml snippet: a row-count band, a recency test, or the columns the baseline still expects. Paste it. Row Monitor does not open a pull request.
Passwords are encrypted at rest. The role you create gets SELECT. Row Monitor never writes to the warehouse.
Name the tables. The first clean check stores columns, types, row count, and the newest timestamp. Nothing alerts until there is a snapshot to compare. No weeks of rules.
No credentials yet? Load Northwind, a fixture that can break on command: a missing coupon column, a 62% row drop, and a timestamp three days stale.
How a check works
Nothing alerts until there is something to compare.
01
Add a Postgres read-only role, or load the demo warehouse. Passwords are encrypted with APP_ENCRYPTION_KEY.
02
Pick tables. The first check stores schema, count, and freshness. Nothing alerts until there is something to compare.
03
A later check that drifts opens an anomaly, pages Slack or email, and suggests a schema.yml test you can paste.
Plain language
Claude writes a plain-language cause from the diff. You also get a schema.yml snippet — a row-count band, a recency test, or the columns the baseline still expects.
Why · public.orders
The load still finishes, but orders is about a third of its baseline and the coupon column is gone. A filter in the model, or an upstream delete, does this without failing the job.
dbt_expectations.expect_table_row_count_to_be_between
Small teams
Metaplane, Monte Carlo, Bigeye, Anomalo, and dbt-native tools such as Soda and Elementary all talk about freshness, volume, and schema. Those platforms also sell lineage, data CI, and coverage across many warehouses. Row Monitor is the Postgres version of the three checks a small team feels first.
| Capability | Row Monitor | Enterprise observability |
|---|---|---|
| Schema drift, freshness, and row counts | Included, against a baseline you accept | Typical |
| Slack and email alerts with the diff | Included | Typical, often with more channels |
| Plain-English cause and a dbt snippet | Included | Varies by product |
| Read-only access, encrypted credentials | Postgres today | Common |
| Price for a small team | Free, $39, or $99 a month | Usually a platform contract |
| Snowflake and BigQuery | Waitlist | Usually included |
| Column-level lineage | Waitlist, not shipping | Often included |
| Data CI and unsupervised ML at warehouse scale | Not in this product | Often the main pitch |
Coming later, and not live today: Snowflake, BigQuery, and richer lineage. Row Monitor does not claim column-level lineage, data CI, or unsupervised models over billions of rows.
Pricing
Free stops at 3 monitors. Pro is $39 and Team is $99. That is Postgres monitoring, not a quote for column lineage or a multi-warehouse platform. Checkout runs when Stripe keys exist; without them you can preview a plan so the product is not blocked.
Free
$0/ mo
A side project or a first warehouse
Pro
Hourly checks$39/ mo
The analytics team that feels every silent break
Team
$99/ mo
More than one person on call for the warehouse
Row Monitor
Pipelines succeed while row counts collapse, columns disappear, and freshness slips.