SQL and dbt for customer reporting

Bring your reporting models into the product.

Start with the SQL or dbt definitions behind your customer reports. eddy keeps their results updated as source records change. Your app can query the data, or eddy can send it to other systems.

We'll email you to find a time. Early access and pricing.

Check sources and SQL support →

01 · Your existing models

Keep the logic. Try one report.

Already using dbt with Snowflake or Databricks? Bring one report's compiled SQL and the tables it depends on. You can keep the rest of your analytics stack while trying eddy for that report.

Bring the definition

eddy reads compiled SQL and dependencies from a dbt manifest. A folder of SQL works too. Check warehouse-specific syntax and functions.

Connect the data

Work out how the underlying tables and their changes reach eddy. Check table names, column types and the keys that identify each customer.

Compare the results

Preview the model, compare it with your current report as records change, then connect your app.

Model reuse and source access are separate checks. For Snowflake or Databricks projects, we'll work through the supported data connection with you.

02 · Support

Check the SQL before building the model.

eddy supports familiar reporting SQL, including joins, aggregates and window functions. A preview explains unsupported SQL so you can decide whether a rewrite makes sense.

22 / 22

TPC-H query definitions

All definitions pass the recorded correctness checks through inserts, updates and deletes.

12 / 13

dbt Jaffle Shop models

Twelve models are maintained in the recorded run, with a deterministic tie-break added to ambiguous window ordering.

Your model

Preview before building

Check the SQL and output before committing to the model.

These are recorded correctness checks, not official TPC-H certification or a claim of full dbt compatibility.

03 · Updates and corrections

The report should change when the records do.

A refund changes revenue. An amended invoice changes a balance. A deleted record changes a count. eddy updates the model's result under those changes.

  • Check the numbersCompare with your warehouse or source query as records are added, changed and deleted.
  • Show which data is includedThe reporting period describes business dates. Show which changes saved in the source system have reached the result.
  • Keep related numbers togetherAlign inputs when they need to agree, accepting that newer changes may have to wait.

04 · Changing a model

See the effect before applying a change.

Preview a model before building it. For a replacement, review which rows change and what needs rebuilding. Apply it alongside the running system, then inspect the result.

models/account_health.sqlready · built while ticking
with revenue as (
  select account_id, sum(mrr) as mrr
  from subscriptions
  where status = 'active'
  group by account_id
), usage as (
  select account_id, count(*) as events
  from usage_events
  group by account_id
)
select a.id, a.name, r.mrr, u.events
from accounts a
join revenue r on r.account_id = a.id
left join usage u on u.account_id = a.id
  1. whereactive subscriptionssource
  2. group bysubscription accountper account
  3. group byusage accountper account
  4. joinaccounts and aggregatesper account
  5. resultone row per accountmaintained

05 · Using the results

Use the model throughout your product.

Query the results from your app, agents and MCP tools, or push them to other systems. Your app checks who can see each customer's data.

Which of my locations had the most refunds in March?
your productcustomer scope · acmeauthorized
eddyrefunds_by_location · March12 locations
Burnaby had the highest refund amount. These figures cover March, with source changes persisted through April 2, 10:00 UTC.
Compare that with March revenue.
eddyrevenue + refunds · alignedsame as-of time
The comparison uses the same customer scope and the same point in source persistence time.
Illustrative customer tools and reporting data. Your product defines access and the agent experience.

06 · Time and alignment

Choose when related data moves forward together.

A view or materialized view can wait for its inputs to reach the same point in time. Newer changes are held back until then. Where freshness matters more, let the inputs move forward independently.

Time travel and alignment use source persistence time by default: when a change was saved upstream. That timeline is configurable. We'll confirm available history and as-of behavior for your pilot.

Bring a reporting model you're working on.

Book a demo and show us the SQL, its source data and where customers use the results.