
Agentic Salesforce to Snowflake ELT: From One Prompt to a Governed Pipeline
How Bruin CLI, Bruin MCP, Bruin Cloud, and agent skills can build and maintain a Salesforce to Snowflake ELT pipeline across bronze, silver, and gold layers.
An AI data analyst that hands you a number and no way to check it is asking for faith, not giving you an answer. Here's what verifiable AI answers actually require: the SQL it ran, the lineage back to raw rows, and definitions that don't drift between questions.

Kateryna Kozachenko
Marketing & Growth
TL;DR: the hard part of an AI data analyst isn't producing an answer, it's producing an answer you can check. A chatbot that returns "$1.24M" with no visible query is asking you to take it on faith, and confident-but-wrong is the most dangerous failure mode in analytics. A verifiable answer shows three things: the exact SQL it ran, the lineage from that query back to the raw rows, and a metric definition that is the same today as it was yesterday. Text-to-SQL alone doesn't get you there, because a syntactically perfect query against the wrong table or a guessed definition is still wrong. You earn trust by making every answer auditable in one click. That is why it matters that ingestion, transformation, and the analyst live on one platform: the trace from the number to the raw row is never broken.
Ask any data team what worries them about pointing an AI at their warehouse, and you rarely hear "it won't be able to write SQL". The models are good at SQL now. What you hear instead is quieter and more serious:
"It gave me a number. It sounded right. How do I know it's actually correct?"
This is the whole ballgame. An AI that produces answers is easy. An AI that produces answers you can defend in front of your CFO is the actual product. And the difference between the two is entirely about whether the tool shows its work.
When a human analyst is unsure, you can usually tell. They hedge, they caveat, they say "let me double-check the join". An LLM does none of that. It returns the wrong number with exactly the same fluent confidence as the right one. There is no tremor in its voice.
This is the failure mode that should keep you up at night. It is not that the AI refuses to answer. It is that it answers beautifully, and the answer is built on the wrong table, a silently-broken feed, or a definition of "active user" that it invented on the spot. You paste it into a board deck. Nobody catches it, because it looked like every other correct number you've ever seen.
In software engineering, a wrong answer usually announces itself: the code throws, the test goes red, the page breaks. In data, a wrong answer just sits there looking reasonable. Validating it by hand takes longer than the question did, so people do one of two things. They blindly trust the tool, or they get so skeptical they stop using it. Both waste the tool.
The way out is not "trust the model more". It is to make the answer checkable in seconds, so trust is something you verify rather than something you extend.
A number you can trust has three properties. You can hold any AI data analyst, any dashboard, or any human up against them.
The single most important artifact an AI data analyst can hand you is the SQL. Not a paraphrase of the SQL. The actual query, the one that hit the warehouse and produced the figure on screen.
Once you can see the query, verification stops being an act of faith and becomes a code review. You can read the WHERE clause and check the date range. You can see whether refunds were subtracted. You can spot that it filtered to one region when you asked about all of them. You can copy the query, run it yourself, and get the same number. A tool that shows its SQL is inviting you to catch its mistakes, which is exactly the posture you want from something you're going to quote.
A tool that hides the SQL, or worse, doesn't run SQL at all and just "reasons" over data it slurped into a context window, gives you nothing to check. That is a chatbot with opinions about your business, not an analyst.
Seeing the query is necessary but not sufficient. The query might read from a table called daily_revenue, and now the question just moves up a level: how was daily_revenue built, and from what?
A verifiable answer lets you trace the figure all the way down. This metric came from this model, which was built from these transformations, which read from these ingested tables, which came from these source systems. Column-level lineage means you can follow a single number, "net revenue", from the answer card back to the exact raw Shopify and Stripe rows it aggregates. When someone asks "are you sure?", you can walk the path with them instead of shrugging.
This is also where "which tables did it touch?" becomes a governance question, not just a debugging one. If an answer about headcount quietly pulled from a stale HR export, lineage is how you find out before the number leaves the building.
Here is the subtle one. Ask an AI "what was revenue last month?" three times, phrased three slightly different ways, and a naive text-to-SQL tool can give you three different numbers. Each time it re-derives "revenue" from scratch, and each time it makes marginally different choices about refunds, currency, and timezone.
A trustworthy analyst answers from governed definitions, not from vibes. "Revenue" means one specific thing, written down once, computed the same way every time, no matter who asks or how they phrase it. This is what a semantic layer is for. Without it, consistency is luck. With it, two people asking the same question a week apart get the same answer, which is the bare minimum for a number you can build decisions on.
The test is simple: ask the same question twice, worded differently. If the answer changes, the tool is guessing, not looking things up.
There's a tempting shortcut in this category: "we do text-to-SQL, so we're covered". Generating SQL from a question is genuinely useful, and it is also the easy 80% that hides the hard 20%.
A query can be flawless SQL and still be the wrong answer:
orders to users when your finance team reconciles off settled_orders. Valid SQL, wrong source.orders as revenue, including test orders, cancellations, and unshipped pre-orders, because nobody told it what "revenue" excludes.Text-to-SQL gets you a query. Trust requires the query plus governed definitions, plus fresh and traceable data, plus the transparency to inspect all of it. The generation is the part the model does well. The context and the audit trail are the part the platform has to provide.
Whether the number came from an AI, a dashboard, or a person, you can pressure-test it with five questions. A good AI analyst should be able to answer the first four for you, on demand, without a support ticket.
A number that clears all five is one you can stand behind. A number that can't clear the first one is a rumor with a chart attached.
We built Bruin as one platform that ingests your data, transforms it, and answers questions on top of it. That structure is not an accident, it's the answer to this exact trust problem.
When ingestion, transformation, and the analyst are three separate vendors, the trace breaks at every seam. The analyst tool shows you a query against a table it didn't build, feeding from data it didn't ingest, and when the number looks off, each vendor points at the next one. You're left holding a figure nobody owns.
When it's one platform, the path is unbroken. You can ask Bruin in plain English, "what was net revenue in May, and how did you get it?", and it answers with the number, the SQL it ran, the metric definition it used, the source tables it touched, and how fresh the data is. Because Bruin also ingested and transformed that data, the lineage goes all the way back to the raw rows. Verification is a click, not an investigation.
And because it uses governed definitions from a shared semantic layer, the answer doesn't drift. The same question gets the same number in the browser, in Slack, or anywhere else your team asks. Bruin lives where people already work: Slack, Microsoft Teams, Google Chat, WhatsApp, Discord, Telegram, email, and the browser. Same governance, same auditability, wherever the question comes from.
That is the design goal, and it's a narrow one. Not "an AI that produces numbers". An AI that produces numbers you can trace, check, and defend.
The AI arms race is mostly about making models sound more confident. That is the opposite of what a data team needs. What earns trust is not more confidence, it's less faith required: a shorter, faster path from "here's your number" to "here's the query, here's the lineage, here's the definition, go ahead and check me".
The best AI data analyst isn't the one that sounds the most sure. It's the one that makes it trivial to prove it's right, and just as trivial to catch it when it's wrong. If you're evaluating tools this year, don't ask "how good is the model?". Ask "when it gives me a number, what can I see?". The answer to that question is the whole thing.
A calculator's inputs and operation are fully visible; you gave it the numbers and the operator. An AI analyst chooses its own inputs (which table, which filter, which definition) and those choices are where errors hide. That's why visibility into the query and lineage matters. You're not checking the arithmetic, you're checking the assumptions.
It helps to read SQL, but the transparency matters even if you can't. It means a technical teammate can audit any answer in seconds, it means the tool can't quietly do something it wouldn't want reviewed, and it means the definition and source tables are inspectable. Trust in a team is partly knowing that the work can be checked, even when you personally aren't the one checking.
A semantic layer is where metric definitions live, written down once: what "revenue", "active user", or "churn" precisely means. When the AI answers from that layer instead of re-deriving definitions per question, everyone gets the same number for the same metric. Without it, two people asking the same thing can get two different answers, which quietly destroys trust in the tool.
A general chatbot reasons over whatever you pasted, which is a stale snapshot and usually a fraction of the picture, and it has no governed definitions or lineage. An AI data analyst connects to your live warehouse, runs real SQL against current data, uses shared definitions, and can show you the query and the path back to source. One is a conversation about a file. The other is an auditable answer about your business.
For exploration and operating decisions, yes, provided it shows its query, uses consistent definitions, and reports freshness. For statutory financial statements, your accounting system and audited process stay the source of truth. The useful pattern is to explore and reconcile with the AI analyst, and to reconcile against accounting, not to replace it.
Four things, in order: does it show the exact SQL it ran; can you trace a number back to raw source rows; does it answer from governed definitions so results don't drift; and does it tell you how fresh the underlying data is. A tool that does all four lets you verify instead of believe. A tool that does none of them is asking for faith.

How Bruin CLI, Bruin MCP, Bruin Cloud, and agent skills can build and maintain a Salesforce to Snowflake ELT pipeline across bronze, silver, and gold layers.

Most AI data analysts live in Slack or a browser. Bruin runs in WhatsApp too. Here is why field, sales, and ops teams prefer asking their data questions there, what it takes to make it actually work, and how to roll it out safely.
Can you just use ChatGPT, Claude, or a coding agent like Codex to analyze your company data? Here is the honest difference between a general AI model and a purpose-built AI data analyst, why a model alone is not enough, and what it takes to get trustworthy answers from live company data.
Practical updates on open-source data pipelines, AI analysts, governance, and what we are shipping at Bruin.