{"id":16,"date":"2026-07-08T12:36:02","date_gmt":"2026-07-08T12:36:02","guid":{"rendered":"https:\/\/visoflow.net\/insights\/?p=16"},"modified":"2026-07-08T12:36:02","modified_gmt":"2026-07-08T12:36:02","slug":"what-is-declarative-analytics","status":"publish","type":"post","link":"https:\/\/visoflow.net\/insights\/what-is-declarative-analytics\/","title":{"rendered":"What Is Declarative Analytics?"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Declarative analytics is an approach where you describe what your analytics system should be, not how it should run. You declare your data models, tables, transformations, dependencies, and schedules. The system derives the execution from those declarations. Nothing about how the work runs is coded by hand.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That is the whole idea. The rest of this post explains what it looks like in practice and why it changes the economics of running analytics.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The shift infrastructure teams already made<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A decade ago, infrastructure teams stopped writing scripts that provisioned servers step by step. They started describing the desired state of their environment in configuration, and tooling converged the environment to match. Nobody who made that shift went back.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Analytics is making the same shift now. Most analytics systems today are still imperative. Someone writes code that says extract this, transform that, load it here, in this order, at this time. Every pipeline is a small program. Every change is a code change. Every new customer, source, or schedule means more of it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Declarative analytics removes that layer. You state the outcome. The runtime works out the steps.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What do you actually declare?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Five things, in practice.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Data models.<\/strong>\u00a0The structure your data should arrive in.<\/li>\n\n\n\n<li><strong>Gold tables.<\/strong>\u00a0The final, business-ready tables your reports and tools consume.<\/li>\n\n\n\n<li><strong>Transformations.<\/strong>\u00a0The logic that turns raw data into those tables, written in standard SQL.<\/li>\n\n\n\n<li><strong>Dependencies.<\/strong>\u00a0What must be ready before what.<\/li>\n\n\n\n<li><strong>Schedules.<\/strong>\u00a0When things should be current.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Everything else is the runtime&#8217;s job. Orchestration, retries, scaling, logging, and tenant isolation are derived, not configured piece by piece.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How is this different from a pipeline?<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Imperative pipelines<\/th><th class=\"has-text-align-left\" data-align=\"left\">Declarative analytics<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">You write execution code<\/td><td class=\"has-text-align-left\" data-align=\"left\">You write declarations<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Order of operations is coded by hand<\/td><td class=\"has-text-align-left\" data-align=\"left\">Order is derived from declared dependencies<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">A change means editing and redeploying code<\/td><td class=\"has-text-align-left\" data-align=\"left\">A change means updating a declaration<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Failures surface wherever the code allows<\/td><td class=\"has-text-align-left\" data-align=\"left\">Failures are visible because the runtime knows every step<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Each new source or customer adds code<\/td><td class=\"has-text-align-left\" data-align=\"left\">Each new source or customer adds metadata<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The practical consequence sits in the last row. In an imperative system, growth means more code to maintain. In a declarative system, growth means more declarations for the same runtime to execute. The maintenance load stays flat.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Where does the execution come from?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">From metadata. The declarations you write are stored as metadata, and the runtime reads that metadata to decide what runs, in what order, and for which tenant. Metadata is the control plane.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is not a theoretical design. The execution model behind this approach has run in production since 2018, serving every customer of a multi-tenant system through a single engine, maintained by one person.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">VisoFlow is a managed data product. You define the system. VisoFlow runs it. Your declarations stay in&nbsp;<a href=\"https:\/\/visoflow.net\/product\">standard SQL<\/a>, which means the logic is portable and the people who already know your data can work with it directly. No new language to learn. No proprietary format that locks your logic in.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Frequently asked questions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Is declarative analytics the same as declarative ETL?<\/strong><br>Declarative ETL usually means configuring individual transformations declaratively. Declarative analytics goes further. Models, tables, transformations, dependencies, and schedules are all declared, and the entire execution is derived from them.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Do I need to learn a new language?<\/strong><br>No. In a well-designed declarative analytics system, standard SQL is the interface. If your team can query the data, they can define the system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Does declarative mean giving up control?<\/strong><br>The opposite. Declarations are explicit, versioned, and auditable. In imperative systems, intent is buried inside execution code. In declarative systems, intent is the artifact itself.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What happens when something fails?<\/strong><br>Because the runtime derives the execution, it knows every step, every dependency, and every run. Failures are visible by default instead of being discovered downstream in a broken report.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The closing thought<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If your team spends more time keeping pipelines running than improving what they produce, the problem is not the logic. It is that the execution is coded by hand.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">See how a declarative runtime handles it:&nbsp;<a href=\"https:\/\/visoflow.net\/how-it-works\">visoflow.net\/how-it-works<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Declarative analytics is an approach where you describe what your analytics system should be, not how it should run. You declare your data models, tables, transformations, dependencies, and schedules. The system derives the execution from those declarations. Nothing about how the work runs is coded by hand. That is the whole idea. The rest of [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-16","post","type-post","status-publish","format-standard","hentry","category-strategy"],"_links":{"self":[{"href":"https:\/\/visoflow.net\/insights\/wp-json\/wp\/v2\/posts\/16","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/visoflow.net\/insights\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/visoflow.net\/insights\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/visoflow.net\/insights\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/visoflow.net\/insights\/wp-json\/wp\/v2\/comments?post=16"}],"version-history":[{"count":1,"href":"https:\/\/visoflow.net\/insights\/wp-json\/wp\/v2\/posts\/16\/revisions"}],"predecessor-version":[{"id":17,"href":"https:\/\/visoflow.net\/insights\/wp-json\/wp\/v2\/posts\/16\/revisions\/17"}],"wp:attachment":[{"href":"https:\/\/visoflow.net\/insights\/wp-json\/wp\/v2\/media?parent=16"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/visoflow.net\/insights\/wp-json\/wp\/v2\/categories?post=16"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/visoflow.net\/insights\/wp-json\/wp\/v2\/tags?post=16"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}