Data contracts
One contract holds every check, written by whoever knows it, while Monte Carlo leaves checks spread across monitors and calls a tag a contract.
orders contract.yml0 checks
dataset: prod/public/orders
checks:
- row_count:never empty - freshness:updated within 6 hours column: updated_at
columns:
- name: order_id
checks:
- duplicate:no repeated orders - name: customer_id
checks:
- missing:never empty - name: status
checks:
- invalid:paid, shipped or refunded valid_values: [paid, shipped, refunded]
- name: amount
data_type: decimalalways a numberrow_count > 0
SELECT max(updated_at) > now() - interval '6h'
duplicate_count(order_id) = 0
customer_id should never be empty
status IN ('paid','shipped','refunded')
amount must always be a number
row_count > 0
SELECT max(updated_at) > now() - interval '6h'
duplicate_count(order_id) = 0
customer_id should never be empty
status IN ('paid','shipped','refunded')
amount must always be a number
One contract Slide
vs Monte CarloAnyone writes. Engineers approve.
One contract.
Monte CarloSoda
Monitors, and a tag.
Data observability
Soda finds the one bad row from day one, where Monte Carlo sees a table-level metric move, and bills per monitor per day.
Monte Carlorow_count ✓
Row 48,216−42.00
Record level Drag the loupe
vs Monte Carlo4 anomalies found
90 days agoconnected+2 wks
History backfilled.
Day one.
Monte CarloSoda
0 anomalies found
no history
learning…
90 days agoconnected+2 wks
Per monitor, per day.
Agentic data quality
Autopilot drafts a contract for every dataset in days, where Monte Carlo builds coverage one monitor at a time.
Contract AutopilotDay 0sales.orders14checks
sales.customers11checks
sales.payments16checks
sales.invoices9checks
ops.shipments12checks
ops.inventory7checks
web.sessions6checks
web.events9checks
sales.refunds8checks
ops.products10checks
ops.returns7checks
ops.vendors6checks
finance.ledger15checks
finance.accounts8checks
finance.billing10checks
web.campaigns5checks
Snowflake16 tables
Hold
Monte CarloWeek 0
sales.ordersmanual
sales.customersmanual
sales.paymentsmanual
sales.invoicesmanual
ops.shipmentsmanual
ops.inventorymanual
web.sessionsmanual
web.eventsmanual
sales.refundsmanual
ops.productsmanual
ops.returnsmanual
ops.vendorsmanual
finance.ledgermanual
finance.accountsmanual
finance.billingmanual
web.campaignsmanual
Coverage Hold the orb
vs Monte CarloNot quarters.
Days.
Monte CarloSoda
Monitor by monitor.
Migration testing
Soda reconciles source and target record by record, where Monte Carlo compares metrics, not records.
Postgrespublic.orderssource
order_idcustomeramountstatus
48213c_104258.40paid
48214c_2210310.00paid
48215c_083174.10shipped
48216c_1187129.99paid
48217c_552018.00refunded
48218c_0412245.50shipped
48219c_778199.00paid
Snowflakeanalytics.orderstarget
order_idcustomeramountstatus
48213c_104258.40paid
48214c_221031.00paid
48215c_083174.10shipped
48216NULL129.99paid
48217c_552018.00refunded
48218c_0412245.50pending
48219c_778199.00paid
Reconciliation
vs Monte CarloRow by row.
Every record.
Monte CarloSoda
Metrics, not rows.
Infrastructure
Failed rows never leave your warehouse, and Soda Cloud only sees results, while Monte Carlo keeps your metadata and query logs in its cloud.
Your cloud
Snowflake
Failed rows
row 48216
row 48301
row 48377
CloudResults onlySOC 2
Monte Carlo cloud
Metadata + query logs
Only results leave Drag a failed row
vs Monte CarloSelf-host if you like.
Zero rows leave.
Monte CarloSoda
Their cloud.






