← Back to portfolio Sanitized · safe to share Two parts Interface + architecture

Operating Analytics Blueprint

An internal bookings and forecast dashboard that runs entirely inside Snowflake. It is served from a container, gated by the platform's own sign-in, and reads views and an analytics agent that never leave the account. This sheet documents what it looks like and how it fits together.

Two things are drawn here. Part one is the interface: the shell that frames every screen, the five sections beneath it, and the assistant panel that slides over the right-hand side. Part two is the architecture: the path a request takes from a browser to a warehouse view, the client-side loading strategy that decides what gets fetched and when, and the pipeline that moves a commit to production.

Every figure is schematic. Hatched fills mark where real content sits: figures, account names, segment labels. None of it is reproduced. The redaction key at the foot of this page lists exactly what was substituted.

Part one

Interface

The shell is a fixed-height column, not a stack of sticky elements: the title row, tabs and filters hold their position while only the panel beneath them scrolls. That choice removes every calc(100vh − Npx) offset the sticky approach would need, and it is why the chrome below is drawn as four discrete bands rather than a single scrolling page.

WF-01 Application shell: anatomy annotations in the left margin
1
precisely
Operating Analytics
Bookings · Forecast · Attach Rate · Open Deals
2 ↻ Refresh Dashboard Last refreshed ██ ███ ██:██ ET 3 Refresh failed, showing last known data
4
Overview Bookings Trend Forecast Attach Rate Open Deals
5
Segments Service Line global state · shared by four of the five tabs
6
7
reachable from every tab
  1. Identity band. Wordmark, product title, and a one-line scope note. Fixed height, never scrolls.
  2. Refresh. Refetches all four data groups. Confirms first if the data is still fresh, since a refresh costs a full round of warehouse queries.
  3. Staleness badge. Appears only when a fetch failed and the screen fell back to cached figures. Announced to screen readers; the meaning is in the words, not the colour.
  4. Tabs. Five sections. On the four data tabs the active tab also decides which group loads first; Overview needs all four, so it takes them in the default order.
  5. Filter row. Segments and service line, held as global state so the shell can own them. Hidden on Open Deals, which filters from its own column headers instead.
  6. Panel. The only region that scrolls. Scroll position is anchored across a service-line change so the view does not jump.
  7. Assistant. A floating button that opens the panel in WF-07. Rendered only while that panel is closed, so no focusable control is ever trapped behind it.

The five sections below share that chrome exactly; only the scrolling panel changes. Each is drawn with its real block order and its real controls, and each notes which of the four data groups it consumes.

WF-02 Overview: the landing section reads all four groups
Overview Bookings Trend Forecast Attach Rate Open Deals
Segments Service Line
Executive summary
 Line ALine BLine CLine D
CQ Budget / Var / Attainment
FY Bookings / Var YoY / YoY %
CQ Forecast / CQ Pipeline
CQ Attach Rate / # Opps / # Attach
Bookings Trend
fiscal years, current FY highlighted
View Bookings Trend →
Budget & Attainment
one combined cell per period: budget, variance, attainment
View Bookings Trend →
Forecast Call
current quarter and the two after it
View Forecast →
Attach Rate Trend
by fiscal period
View Attach Rate →
CQ Attach of Software Opps
opportunities with vs. without a services line
View Attach Rate →
Top Open Deals
first ten rows; the full list lives on its own tab
View Open Deals →
sticky scrollbar: a page-pinned strip for a wide table that is not its own scrollport

Six sections, each a summary table with a jump button into the tab that owns it. The executive summary sits above all of them as a single table. There is one column per service-line view and one row per measure, so the whole quarter reads across in one pass rather than as a row of floating cards. Its four columns are fixed: they are the four canonical views, not whatever the filter row currently selects.

Five of the six section tables cap at eight rows and scroll within themselves past that; Top Open Deals is the exception, running its ten rows uncapped. The cap is content-sized rather than a fixed fraction of the viewport, because capping every table to a viewport fraction stacks competing scrollbars down a page this long.

WF-03 Bookings Trend trend group
Overview Bookings Trend Forecast Attach Rate Open Deals
Segments Service Line
Bookings Trend
bars by segment, stacked by quarter · won only
Bookings by fiscal year, stacked by quarter
FY ██ FY ██ FY ██ FY ██ FY ██ FY ██
past 20 bars this chart becomes a table instead
Year-over-year growth (%) Expand FY ██ + FY ██ − FY ██ + FY ██ +
Footnote block: basis of measure, which populations are counted, and the source view.
Current FY bookings vs. budget & attainment

Charts degrade to tables on their own: past a bar threshold the stacked chart is unreadable, so the same view model renders a table instead. The per-year expand toggles break a fiscal year into its quarters in place.

WF-04 Forecast forecast group · three quarter sections
Overview Bookings Trend Forecast Attach Rate Open Deals
Segments Service Line
Current quarter
Forecast value, best-case cap
Deal count by status
Current quarter + 1
Forecast value, best-case cap
Deal count by status
Current quarter + 2
Forecast value, best-case cap
Deal count by status
Footnote block: how value is stacked and grouped, which basis each service line uses, and when the value chart splits into two charts or collapses to a table.

Three identical sections, one per quarter in the rolling window. The window itself is derived at load time from the fiscal calendar, so a dashboard left open across a quarter boundary re-derives it on the next refresh rather than showing a stale window.

WF-05 Attach Rate attach group · three paired chart + table blocks
Overview Bookings Trend Forecast Attach Rate Open Deals
Segments Service Line
Attach Rate Trend (value)
services value ÷ total value by fiscal year; click a year to expand into quarters
Expand FY FY ██ + FY ██ − FY ██ + FY ██ +
Footnote: definition of the ratio and the source view.
Attach Rate Trend (count)
opportunities carrying a services line ÷ software opportunities; hover a point for X of Y
Footnote: cells show a percentage with the raw counts beneath.
Software opps without a services line
new-sales opportunities with vs. without

Each block pairs a chart with the table behind it, so a figure can be read off precisely rather than estimated from a plot. The last block collapses to a small card layout when a single segment is selected, since a one-row table is a worse way to show one number.

WF-06 Open Deals: the one full-height section deals group · no shared filter row
Overview Bookings Trend Forecast Attach Rate Open Deals
Open Deals
open opportunities, closed excluded
Showing top ██ of ███ matching deals by the active sort; narrow with the column filters
Opp ID Type ▾ Quarter Account ▾ Segment ▾ Status Value (A) Value (B) RAG Review Reps Comments
the pane's own scrollbars: this table is its own scrollport on both axes

The only section that claims the full viewport and scrolls inside its own pane, so a wide twelve-column table keeps both a reachable horizontal scrollbar and a header that stays put. Because it is already its own scrollport, it draws its native bars on both axes. The page-pinned strip in WF-02 exists for the opposite case, a wide table that grows to its content and would otherwise strand its scrollbar below the fold.

It is also the only section without the shared filter row: the marked columns carry their own filters instead, which is why the shell hides the row entirely here rather than showing two competing sets of controls. Every column sorts from its header, and a review comment opens in a dialog rather than being truncated in place.

WF-07 Assistant panel: open state the shell shifts, it does not overlay
precisely
Operating Analytics
↻ Refresh
Overview Bookings Trend Forecast
Segments Service Line
Ask Agent
Conversational analytics
New chat
Which segment has the best attach rate?
And the quarter after?
Ask about the data… Send

Opening the panel adds right-hand padding to the shell rather than covering it, so a figure being asked about stays visible next to the answer. Conversation context is kept until the reader starts a new chat. The panel is anchored to the viewport, which is why the shell around it must avoid any property that would make it a containing block.

Part two

Architecture

The defining constraint is that nothing leaves the data platform. Snowpark Container Services runs the container. A browser reaches it through Snowflake's own ingress, which authenticates and authorizes every request before the container sees it, and the container's calls back to the warehouse and to the analytics agent travel an internal host path rather than the public internet. No outbound network access is needed, and the application holds no authentication code of its own. That is deliberate: a second gate behind the platform's own would only drift out of step with it.

A-01 Runtime topology: the path of one request every hop stays inside the account
CLIENT SNOWFLAKE INGRESS: NO APPLICATION CODE SPCS SERVICE: ONE CONTAINER, ONE ORIGIN SNOWFLAKE ACCOUNT: INTERNAL HOST PATH Browser user holding the app's Snowflake role Ingress OAuth authorizes by the caller's roles Corporate IdP federated sign-in container image Static SPA bundle served at / API service /api/query · /api/agent · /health SQL Statements API allow-listed named queries Cortex Agent named agent object Forecast view + budget table 25 named queries · 1 Agent object schema owned by another team HTTPS request redirect authorized requests only named query → SELECT question reads runs no outbound network access; the container's credential is an ambient session token that rotates about every ten minutes
One container serves both halves. The static bundle and the API share an origin, so no cross-origin request is ever made in production and the CORS configuration is inert there. The static mount is registered last, after the API routes, so it can never shadow them. Below the container, the two calls diverge. Twenty-five of the twenty-six named queries read a single shared forecast view; the twenty-sixth reads a budget table this app owns outright, which replaced an earlier view whose downstream numbers were found to be wrong. The agent, by contrast, is an object another team owns and versions. This app consumes it rather than maintaining it. Everything here is read-only.

The client is not a thin renderer over that API. It decides what to fetch, in what order, and what to show when a fetch fails. That policy is the part most worth drawing, because it is where the dashboard's behaviour under a partial outage is decided.

Data is split into four groups, each backed by several named queries. Groups load one at a time, prioritised by whichever section the reader is looking at. Each is cached locally for thirty minutes under a key scoped to the fiscal quarter, so a new quarter always misses the cache rather than serving figures from the last one.

A-02 Group loading: cache, fetch, and the stale fallback one group per pass
Open, or refresh by hand, or every 30 min in business hours Pick the next group the active tab's group first, else in order Cache fresh? < 30 min, same quarter hit Render from cache no network call miss Fetch the group its queries in sequence, 250 ms apart All succeeded? yes Save cache, stamp the time header reports the data's age no Any cache at all? yes Show it, flag it stale badge appears in the header no → the group renders empty next group
A failed refresh never destroys good data. The fetch writes over a group's cache only once its replacement has arrived. A group whose fetch fails falls back to whatever it last held, reading past the freshness window on purpose: during an outage, showing older figures is the entire point. What makes that safe is the flag: the header says the screen is showing last-known data, because presenting stale figures silently is worse than showing none. A failure whose message matches a known permanent-failure pattern stops the loop instead of retrying forever. The scheduled refresh is driven by how old the data is rather than by a fixed timer, so a laptop that slept or a tab left in the background wakes up and refreshes once, instead of firing every missed interval at once.
One codebase builds two ways. A provider interface sits under the whole client, and the build target picks the implementation: an HTTP provider that talks to the API above, or a bridge provider that reaches the same warehouse and agent through a host application's connector. Every layer above that line (the loader, the caches, the view models, the charts) is shared, and neither target knows which one it is running as.

Deployment mirrors that discipline. Two long-lived branches map to two separate Snowflake accounts, and the branch a contributor reaches by default is the non-production one. The default branch is the one people land on by accident, and production should never be that branch.

A-03 Promotion path: two branches, two accounts one shared rollout mechanism
NON-PRODUCTION PRODUCTION Feature branch pull request CI lint · types · tests · build Default branch integration green only Reusable deploy build · push · roll · health Account A non-production fast-forwarded to the commit that just deployed green Release branch ships on advance Reusable deploy same workflow, same logic Account B production
Nothing reaches production that was not first observed in non-production. Both tracks call the same reusable workflow (identical rollout, health-check and diagnostic logic), and only the target account and its credentials differ. The rollout itself is an in-place upgrade of the running service to a new image, followed by a health poll; because old image tags are never pruned, rolling back is re-running the same workflow against an earlier tag rather than a separate mechanism to maintain.
Appendix

What was substituted

The platform and the shape of the system are drawn as they are. What is replaced below is anything that names an environment, locates an object, or reproduces a figure.

ActualShown as
Snowflake account identifiers and endpoint URLsAccount A / Account B
Database, schema, view, table and warehouse namesForecast view · budget table
Service user, role, and service-role namesthe app's Snowflake role
Agent object name and versionAgent object
Datasource identifiers carried on each queryomitted
Service-line codes used across the filtersLine A – Line D
Segment taxonomyhatched fill
Every bookings, forecast, budget and attach figurehatched fill
Account names, opportunity IDs and review commentshatched fill
Product title and division namingOperating Analytics