Build with AI

How to build a marketing analytics dashboard with Bolt

The whole thing in a browser tab: describe the dashboard, watch it run, and keep going until the numbers are real. An import that validates every row and keeps its refusals, six rates with a guard on each division, a widget library people compose boards from, and three roles with sharing on single dashboards.

August 2026 · 57 min read · Updated September 2026

Bolt

$ Build a marketing analytics dashboard: import campaign CSVs with every row validated and every refusal kept, compute click-through rate, cost per click, cost per thousand, cost per acquisition and both returns with guarded division, give me a library of charts, metric cards and tables to compose boards from, four filters across the board, and three roles with per-dashboard sharing.

  • Running in the browser on real rows
  • Import, filters and permissions wired up
  • Ready for you to review
You describe it, Bolt builds it
Start here

What a marketing analytics dashboard actually is

One screen that answers "is this working". The difficulty is never the chart, but that the answer has to be assembled from six platforms that each define the question differently, and then defended to somebody about to move a budget.

Every platform you advertise on already has a dashboard, and each one is confident. The trouble is that they disagree: the ad network counts a conversion when somebody clicked within thirty days, your analytics counts it when they landed and did something, your shop counts it when the payment cleared, and none of the three is lying. A marketing analytics dashboard is where you decide which of those you mean and then apply that decision to everything, so a number on one card can be compared with a number on another.

Next comes the plumbing, which is where the project lives or dies. Numbers arrive as exports: a CSV per platform, per account, per month, with column names that move and campaign names that contain commas. Something has to read those files, check every row against the shape you expect, load what passes, and keep what fails somewhere you can look at it. That last part is the difference between a dashboard people act on and one they quietly check against a spreadsheet.

Only then do you get to the rates, and they are simple arithmetic with one trap in each: cost per acquisition when there were no acquisitions, click-through rate when there were no impressions, return on ad spend on a day nobody spent. Guard every division and the six rates fall out in an afternoon. Skip that and your dashboard shows infinity to the person deciding next quarter’s budget.

Agree Your Definitions Before You Build

Two people looking at the same campaign will disagree about how it did, and almost always because they are counting different things rather than counting wrongly. What counts as a conversion, whether revenue is gross or net of refunds, whether a view-through counts at all, which currency, which time zone a day ends in: write those down before anything is built. They are the specification, and a dashboard that has not settled them is a machine for producing arguments faster.

Reliable Imports From Messy CSV Exports

A dashboard reading a clean table is a weekend. A dashboard reading whatever six ad platforms exported is real software: headers that change without notice, a campaign named "Spring Sale, EU" that shifts every column after it, blank rows where somebody left a total, the same day uploaded twice. Deciding what happens to those rows (kept with a reason and a line number, rather than absent from a chart) is what a marketer checks first, because the first question about any total is always whether it includes everything.

Flexible User Roles & Custom Permissions

This is the part most reporting builds discover late. A marketing dashboard is read by people who must not be able to change it, built by people who should not necessarily see every client, and administered by somebody who needs both. That is two separate questions (what may this person do, and which numbers may they do it to) and answering only the first is the most common way a reporting tool ends up showing one client another client’s spend.

The part companies rate themselves worst at

4.0 / 7

is how 308 senior marketers scored their own company at "integrating marketing technologies across other data systems in our company", the lowest integration score on the list, and identical to the 4.0 they gave it two years earlier. The same people scored themselves 4.9 at choosing which vendor to buy from. That gap is this whole project: acquiring the tool is the part this profession has got good at, and joining the numbers up is the part that has not moved in two years. Published April 2026 by The CMO Survey, in the field that January, and sponsored by Duke University’s Fuqua School of Business, Deloitte and the American Marketing Association. Deloitte sells services next door to this finding, though the report says sponsors get neither the data nor the participant list.

The CMO Survey, 35th edition (n=308, 97% VP-level or above), fielded January 2026 · checked fielded January 2026

What a marketing dashboard needs

The parts every marketing dashboard is built from

One of these six is the charts. The other five are where the build time goes, and where the credibility comes from.

01

CSV Import That Keeps Every Rejected Row

Every platform hands you a CSV and every CSV will disappoint you: a header renamed since last quarter, a campaign called "Spring Sale, EU" that pushes every later column one place along, the same fortnight uploaded twice by two people. Coping with that is half the job. The half that decides whether anybody trusts the dashboard is what happens to the rows that fail: written to a rejects table with the line number and the reason, so a total is never quietly short. Then a re-upload has to be a decision rather than an accident: keyed on the day, the channel and the campaign, and either skipped or allowed to overwrite, because somebody will upload March twice.

02

Six Marketing Metrics Calculated Automatically

Click-through rate, cost per click, cost per thousand impressions, cost per acquisition, return on ad spend, return on investment. All six are one line of arithmetic and all six divide by something that is sometimes zero: a day with no impressions, a campaign with no conversions, a channel nobody spent on. Compute them in one place with a guard rather than in each widget and you get two things: no infinity on a card in front of a client, and one definition to change when your team decides revenue means net of refunds after all.

03

Build Your Own Dashboards From a Widget Library

The dashboard you design in week one is not the one anybody wants in month three. Ship a small library instead (a line and an area chart for trends, a bar chart for comparing channels, a pie for a split, a metric card for a single number, a table for the detail underneath) and let people compose their own board out of it. Two consequences to design for: each widget carries its own configuration, and the layout is saved as data rather than code, because whoever arranges it will not be whoever built the app.

04

Every Chart Respects the Viewer’s Permissions

Once a board is composed rather than designed, the widget has to be able to answer its own question, and that answer must depend on who is asking. The instinct is to run those queries with an all-powerful server key and filter afterwards. Resist it: the function that answers a widget’s question should carry the viewer’s own credentials, so the database applies their permissions rather than the code remembering to. It is no more work up front, and it is what stops one client’s spend surfacing on another’s board the day somebody duplicates a dashboard.

05

Dashboard-Wide Filters

A date range, a channel, a campaign and a country, and every widget on the board has to respect all four, including the ones added after the filters were written. Set your date and campaign filters once at the top of the page, and every chart on your dashboard automatically updates in perfect sync, no complex setup required. Remember the selection between visits too: whoever opens this at nine on Monday had those same four filters set on Friday.

06

Control Who Can Edit vs. Who Can Only View

A viewer reads. An editor builds dashboards. An administrator manages people. That is the first question. The second, and the one that gets forgotten, is which numbers they may do it to: a freelancer building boards for four clients should see four, not nine. Answer both separately (a role, and a grant on one dashboard) and the awkward cases stop needing new code. Answer only the first, and every awkward case becomes a special rule in a screen.

Build vs buy

Own the dashboard or rent one per client

Every product below is a monthly subscription, and the bill grows with the business it reports on. Owning the dashboard is a single purchase: the code is yours, and nothing about it is metered.

Build your own

Monthly SaaS tools trap you with recurring fees, per-seat licenses, and paywalled features. With Remixable, you pay once and own the complete, production-ready codebase forever. Launch instantly on day one, not weeks later, and add unlimited dashboards and clients without ever being forced to upgrade.

  • A fifth or fiftieth client is a row in a table rather than a line on an invoice
  • An eleventh dashboard is an afternoon for whoever wanted it, not an upgrade
  • Every imported row is in your own database, queryable without asking anybody for an export
  • What counts as a conversion is your definition to write down and change
  • No tier gets restructured under you, and nothing moves behind an upgrade you did not agree to

Rent the reporting layer

AgencyAnalytics · DashThis · Supermetrics · Funnel · Data Studio

What renting buys is the part this template deliberately does not attempt. Live authenticated connections into the ad platforms, so nobody exports a file. Somebody else’s problem when a platform changes its API. Hundreds of pre-built connectors. White-label client portals. At the top end, a data warehouse with your marketing history modelled in it.

  • Authenticated connectors into the ad platforms, refreshed on a schedule. This template reads a CSV you give it
  • Between 85 and 600-plus integrations already written, tested and maintained
  • White-label client portals and branded reporting, which agencies are genuinely bought for
  • Warehouse destinations and modelled marketing data at the enterprise end
  • Four of the five advertise unlimited users, so what you are billed for is clients, dashboards, data feeds or licences
AgencyAnalytics$20 per client/month billed annually, about $25 monthly - one plan, with 25-plus clients moving to a quote. Add-ons are separate: AI credits at $20.83/month per 250, rank tracking at $41.67/month per 500 keywords

First because it states the meter more plainly than anybody else here: you buy clients. Its own feature list reads "Unlimited data sources", "Unlimited reports & dashboards" and "Unlimited staff & client users", which is the argument of this whole table in three lines, since the thing being rationed is the client, not the person. 14-day trial, no card.

agencyanalytics.com · checked August 2026

DashThis$44/mo for 3 dashboards and 15 data sources, then $139 (10 and 40), $279 (25 and 100) and $429 (50-plus and 200-plus) - with annual billing advertised as saving $120 to $840 a year

Here because the ladder is how many dashboards you may keep, which is the strangest meter to explain to somebody about to build their own. Users are unlimited on all four tiers. What you climb the ladder for is permission to have more boards. Hold that beside a build you own, where an eleventh dashboard is a row in a table. One honesty note: the page’s monthly and annual figures came back identical to our reader, so the figures above are the ones it lists plus the annual saving it advertises. We have not invented an annual per-month price.

dashthis.com · checked August 2026

Supermetrics€39/mo annual or €49 monthly (Starter: 3 data sources, 1 user), €159 or €199 (Growth: 7 sources, 2 users), €399 or €499 (Pro: 10 sources, 3 users), then quote-only

The most transparent row in the set, and the one that meters most things at once: data sources, destinations and users all move together, with both billing bases published. Its page says pricing is based on "the number of data sources and destinations you connect" and that it does "not charge usage fees beyond your agreed-upon license subscription fee". Do the count before comparing: search, social, email, your shop and your analytics is five sources before anybody mentions a second ad account, and Starter allows three. Quoted in euros because that is the currency its page served us.

supermetrics.com · checked August 2026

Funnel“Starts from $300/ month, billed annually” (Starter) and “Starts from $600/ month, billed annually” (Business) - the page does not say what moves you above the floor

The enterprise end of the same job, included for what it does not tell you. Both figures are floors rather than prices, nothing on the page says per what, and Business lists "Unlimited users and workspaces", so once again the seat is not the product. What you get for it is scale: 113 connectors and 13 destinations at Starter, 579 and 46 at Business, which is both the honest case for renting and the reason the floor is $300.

funnel.io · checked August 2026

Data Studio ProThe standard product - the one most marketing dashboards actually run on - is free. Pro is sold as per-user licences, and Google’s own documentation publishes no figure for them, pointing to a marketing page instead

Last because it is the real default: most marketing dashboards that exist are free reports in Google’s own tool, and an honest comparison starts by admitting that. The paid tier is worth knowing for its shape, quoted from Google’s own docs: "A self-service Data Studio Pro subscription is based on individual user licenses", you are "billed monthly for the number of Pro licenses in the subscription, regardless of whether or not those licenses are used", and "Every Data Studio Pro subscription is associated with one (and only one) Google Cloud project". Note the name, too. Almost everybody still says Looker Studio, and the documentation now reads "Looker Studio is now called Data Studio." The licensing shape is the part worth remembering.

docs.cloud.google.com · checked August 2026

Rule of thumb: if the numbers must arrive without anybody exporting a file, if you need forty connectors maintained by somebody else, if clients expect a branded portal, or if a platform’s API changing is a problem you want to buy your way out of, rent, and if one free report in Google’s own tool already answers your question, use it and spend the fortnight on something else. Build when the meter is the problem: when the fifth client, the eleventh dashboard or the fourth data feed is the thing standing between you and looking at your own numbers, and when what a conversion means in your business is a definition you would rather own than accept. The survey figure above is the honest reason this is worth the effort: buying another tool is the thing this profession is already good at, and it has not moved the integration score in two years.

No dev needed

Why build with Bolt

Screens are the easy part. What actually stalls a solo build is everything underneath them: somewhere real to hold the data people type in, permission checks on who can see it, and a UI that keeps working once more than one person is using it.

Bolt runs the whole thing in one browser tab, right down to the preview:

The build loop
1

Prompt

Describe the screen or rule you want, in plain language.

2

Preview

Watch the running app rebuild itself in the same tab.

3

Try it

Click through the real app, because the preview is the actual build rather than a mockup.

Refine

Ask for the next change, or fix what’s off.

Loop back to Describe

None of that needs an install or a terminal window, and the whole build happens in the tab GitHub just opened, one request at a time.

One tabruns the whole build

Bolt runs your project inside the browser itself, via StackBlitz’s WebContainers, so the preview you’re looking at is the app actually running, rather than a screenshot or a separate deploy you have to wait on.

Auto-committed to GitHub as you go

Once GitHub is connected, Bolt commits each working change on its own and pulls in anything you changed elsewhere, so the two stay in sync without you typing a git command.

Built-in database or your own Supabase

Ask for a database and Bolt wires up its own managed one with no extra account, or connects a Supabase project you already run yourself.

What it costs

Pay a developer, or do it with AI

The one running cost worth noticing is the model behind the written summary, and it is smaller than people expect. The rest is a database plan and hosting, and both start free.

Hire a developer

Custom build, from scratch
Developer
~$11k-$43k
Supabase (backend)
Free tier · $25/mo (Pro plan)*
Hosting
$0 free tier
AI model (the written summary)
Usage-based - cents, not dollars
Build time
~215 hrs of their work

~$11k-$43k to build, then from $25/mo plus a few cents of model usage

That range is our own ~215-hour estimate priced against the rate survey linked below, which puts senior US developers at $100-$150+ an hour, specialists higher, and agencies 20-40% above the freelancers they bid against. Hence $50/hr and $200/hr as the two honest ends. Where somebody has quoted you for "a marketing dashboard", interrogate the assumption rather than the total: what do they expect to receive from each ad platform, and what will they do with the rows that fail to load? Those two answers are usually the difference between the quote and the invoice.

Build it with Bolt

From scratch, with Bolt
Bolt
Free (1M tokens/mo) to $25+/month (Pro, from 10M tokens)
Backend (Supabase)
Free tier · $25/month (Pro plan)*
Hosting
Free on Bolt’s own hosting, or Netlify
Your time
~103 hrs

Free for a first look. A real build costs from ~$25/month on Pro once it outgrows the entry token rung, and climbs from there with usage

Bolt bills by tokens, and the sticker price understates what a real build costs: it reloads your whole project as context on every message, so the entry Pro rung (10 million tokens for $25/month) burns down faster than the number implies. Budget for a top-up or a higher rung on a multi-session build, not the $25 floor. Lean on Bolt’s own token-saving tools (clearing context between features, pointing a prompt at specific files) to slow that burn.

* The free-tier line that matters here is not the 500 MB of database, which holds years of campaign rows because this data is small and narrow. It is the pause: a free project stops after a week of inactivity, and a dashboard that gets read at the end of each month is exactly the project that goes quiet for a week and greets somebody with an error. Pro, from $25/mo, ends the pause, keeps 7 days of backups, and raises the allowances that matter once people are downloading board exports: 250 GB of egress (then $0.09 per GB) and 100 GB of file storage (then $0.0213 per GB), the latter being where your uploaded CSVs pile up.

Either way the dashboard is yours, and the only running costs are a database plan and a few cents of model usage a month. What differs is who builds it: a developer you pay up front, or you, describing each piece to an AI tool.

Prices and rates from supabase.com, developex.com, developers.openai.com and bolt.new, checked August 2026.

Plan first

Decide before you build

Six things to write down before anything is built. Every one of them is a definition somebody will argue with later, and every one is cheaper to settle now than after a number has gone out in a client report.

01

What a conversion is, in one sentence

Write it down and make everyone who will read the dashboard agree to it. Does a view-through count. Does a repeat purchase in a week count once or twice. Is revenue gross or net of refunds. Which platform wins when two disagree, because they will. It decides what your import stores and whether two cards on one board can honestly be compared.

02

What your exports actually look like

Download a real month from each platform you advertise on and open the files. Their headers, their date formats, whether they quote fields containing commas, whether they append a totals row. That is the actual specification for the import. If the answer is five platforms, decide whether each gets its own shape or they normalise into one.

03

Wide rows, or facts and dimensions

Both shapes work. One wide table per day, channel and campaign is simple, fast to query, and awkward to extend. Separate fact tables around a campaign dimension take longer to build and absorb a new metric without migrating every screen. Pick deliberately. Wanting both means keeping two things in step.

04

Who builds, who reads, and which numbers

Three roles is the useful minimum: somebody who administers people, somebody who builds dashboards, and somebody who may only read what was shared with them. Then answer which dashboards each person may reach, the question that decides whether this is safe to hand to clients. With several clients, the rule that one never sees another belongs in the first migration.

05

What the written summary is allowed to say

A paragraph of plain English over a board is genuinely useful and the fastest thing here to get wrong. Decide that the model may describe only numbers it was given, and that any trend is computed by a query first. Handed this month’s figures alone, it will cheerfully say they are up on last month, and sound certain.

06

Whether anybody outside your company will see it

A board for your own team and a board for a client are the same code and different products. If clients will see it, two things move from later to now: their branding on it, and a share that grants one dashboard rather than an account. Retrofitting that is the most common rebuild in this category.

Approaches

Comparing your build options

Where you start decides how much of your time goes on the parts nobody sees: a parser that survives a real export, six divisions that each need a guard, and a permission rule with two halves. Three routes to the same product below: by hand, on a UI kit that stops at a styled card, or by describing it to Bolt in a browser tab that also runs it.

~215 hrsBuilding by hand

The charts are a fortnight, and they are the part you can picture. The quarter goes on everything you cannot: getting six platforms’ exports to agree on what a conversion is, a parser that survives a campaign name with a comma in it, deciding what happens to the two hundred rows that will not load, a query engine behind widgets somebody else assembled in an order you never anticipated, and a permission model where the person who may build a dashboard is not the person who may see the numbers on it. None of that is visible on screen, and all of it decides whether the screen is worth reading.

~160 hrsGeneric UI starter kit

A kit is unusually good value on this particular product: dashboard shells, KPI cards, a chart library and a drag-to-arrange grid are exactly what kits are made of, so more of the surface arrives free here than on almost anything else you could build. What arrives with it is nothing. No kit knows what a channel is, that cost-per-acquisition needs a guard against dividing by zero, which of your uploaded rows were rejected and why, or that this viewer may read one dashboard out of nine. Every number the cards display is still yours to define, compute and defend.

~103 hrsBuilt with Bolt

Describe what you want and it writes the project, installs what it needs and runs it, all in the tab you are reading this in, then connects a database when you ask for one. The same task list as the rows above it. The loop suits a build whose whole point is composing something visual over data you keep re-importing, since nothing has to be installed between a change and seeing it.

Interactive calculator

Estimate your exact build timeframe

Plenty of marketing teams need less than this. If nobody but you will ever sign in, or one fixed board beats a library, untick those rows and watch the estimate fall.

What your marketing dashboard needs

Your estimate

103 hrs

start to finish

Based on the 6 of 6 features you’ve selected, plus ~26h of groundwork. Toggle any on the left to watch the number move, and open the groundwork row to untick what you have already, such as a database that is already running or going live if you are only building a mock-up for now.

A rough estimate, not a quote. Real time depends on how much you customize and how clean your data is.

Setting up your workspace

Let’s set up the tools you need

Bolt runs in the browser, but it can’t open a .zip file, so the only way in is a GitHub repository. Do that first, then create a Bolt account and a plan. Everything after that is a plain description of what you want.

1

GitHub account

Cost: Free

Bolt has no upload button for a folder or a .zip, and the only way to open a project is to import a repository, so a home for the code has to exist before Bolt does. Sign up and create a private repository, then push your project’s files to it.

Create a free GitHub account
2

Bolt account

Cost: Free

Sign up at bolt.new and connect the GitHub account from the step above. Once it’s linked, you pick a repository to import and land straight in a live preview, with nothing to install.

Sign up for Bolt
3

Bolt subscription

Cost: Free (1M tokens/mo), then from $25/month (Pro)

Free gives you 300,000 tokens a day, capped at 1 million a month, which is enough to try Bolt rather than to finish a real app. Pro starts at $25/month for 10 million tokens (unused ones roll over one extra month), but Bolt reloads your whole project as context on every message, so a multi-session build tends to burn past that entry rung faster than the sticker number implies.

Compare Bolt plans
4

Supabase (database)

Cost: Free to start

Where your project keeps its data. Bolt can wire up its own managed database with no extra account, or connect a Supabase project you already run yourself, and both are Supabase underneath. Ask for one the first time a screen needs to save something real, so you have nothing to set up before you get there.

Connect Supabase to Bolt

The GitHub step comes before Bolt exists for you at all. Everything after it happens inside the browser tab Bolt opens, with no install.

Step by step

Build your marketing dashboard, prompt by prompt

Six prompts in a browser tab, each one running by the time you finish reading it. One thing to plan for that the tab does not remind you about: step 03 needs a real CSV export from your ad platform, so download one before you start rather than losing momentum in the middle.

  1. 01

    Running in a tab, with two rules on the record

    A project that boots in the browser, and one prompt fixing the definitions everything after it resolves to.

    PromptSet up the project
    Create a React 18 + Vite + TypeScript project with Tailwind for a marketing analytics dashboard, and get it running. Then fix the vocabulary before we build anything: organisation, data source, channel, campaign, impression, click, conversion, cost, revenue, dashboard, widget, reject. Two rules to hold throughout, written into the project’s notes rather than only agreed here. First: a conversion means exactly one thing across this whole project, written out in a sentence I will give you, and no screen ever computes a rate for itself. Every rate comes from one place that guards its division, so a card can never show infinity. Second: every row belongs to an organisation, every access rule has to test both what the person may do and which organisation the row belongs to, and neither half is ever left out because the other one looks sufficient.

    Getting the rules into a file in the project matters more here than the wording of them. A browser tab is an easy place to build quickly and an easy place to lose the reasoning from twenty prompts ago, and these two rules are the ones that are expensive to reinstate.

  2. 02

    The schema, with an organisation on every row

    Connect a database and describe the tables. No sign-in and no screens yet, which makes this the cheap moment to find out your own exports need a column nobody thought of.

    PromptModel the organisation and the campaign data
    Connect a Supabase project and write the data model, with no authentication yet and an organisation reference on every table from the start. Organisations. Members linking an account to an organisation. Data sources, one row per file or platform somebody imports from, carrying the import’s status and counts. Then the campaign data in two shapes so I can choose later: a wide table of one row per date, channel and campaign with impressions, clicks, conversions, cost and revenue on it, and alongside it a campaign dimension with separate fact tables for sessions, cost and conversions. Then a rejects table holding every row an import refused, with the line number, the raw row and the reason. Then dashboards, and widgets belonging to a dashboard carrying their own type, title, configuration and position. Seed two organisations with deliberately awkward data: one with a campaign whose name contains a comma, one with the same fortnight imported twice.

    Ask for the seed data in the same prompt as the tables. It is what makes the next four steps something you can look at rather than imagine, and on a tool where the reward is watching things work immediately, an empty database is a slow start you do not need.

  3. 03

    Upload a real export into the tab

    The step that separates a dashboard from a demo. Get a real month out of one ad platform and give it to the project. What you actually have is the specification for the hardest thing in this build.

    PromptImport a real export
    Here is a real CSV export from my ad platform. Read it before you write anything and tell me what you found: the exact column names, the date format, whether fields containing commas are quoted, how it writes a zero or a missing value, any totals row at the bottom, and anything you cannot map onto my schema. Then build the import: a private storage bucket restricted to CSV and scoped so a person reaches only their own folder, and a server-side function that parses an upload with a parser that handles quoted fields properly rather than splitting on commas, checks the required columns are present, validates every row (dates parseable and inside a period I state, numbers numeric, nothing negative that cannot be, channel recognised), inserts what passes and writes every failure into the rejects table with its line number and reason. Never drop a row silently. Handle a re-upload as a decision: key each row on date, channel and campaign, and let me choose per import whether an existing row is skipped or overwritten. Then import my real file and show me three things: the accepted count, the full reject list with reasons, and the total spend of the accepted rows so I can compare it with the same figure in the ad platform.

    Compare that total with the ad platform before going any further. Ten seconds of arithmetic here is what makes the rest of the build worth doing, and once two more layers of aggregation sit on top of these rows, the same check turns into an afternoon of working out which layer moved the number.

  4. 04

    Six rates once, then a library to compose from

    The arithmetic in one place first, then the widgets over it, and a single query behind them that runs as whoever is looking.

    PromptBuild the rates, the widgets and the filters
    First the six rates, computed in one place and never in a component: click-through rate, cost per click, cost per thousand impressions, cost per acquisition, return on ad spend, and return on investment. Every one of them guards its division so a day with no impressions or a campaign with no conversions returns nothing rather than infinity, and I want to see what each returns for a zero case before we go on. Then the widget library: a line chart, an area chart, a bar chart, a pie chart, a metric card showing one number, and a data table. Each widget stores its own metric, grouping and title, and a dashboard stores the widgets on it and their positions as data so somebody can rearrange a board without a developer. Then one server-side function that answers a widget’s query, and build its database client from the caller’s own credentials rather than a service key, so the database applies that person’s permissions to every widget including ones added next year. Then four filters that apply to the whole board at once (date range, channel, campaign and country) passed into every widget’s query rather than filtering in the chart, and remembered between visits.

    Watch what happens the first time you drag a widget and reload the tab. If the layout comes back, positions are being stored as data the way this prompt asks. If it snaps back to how it was written, they are in code, and that is worth fixing now rather than the day somebody else wants to arrange their own board.

  5. 05

    Three roles, and a rule with both halves in it

    A database holding what you spend and what it earned, and three kinds of person who should not have the same power over it. The slowest prompt to read and the one worth reading.

    PromptAdd auth, roles, and the access rules
    Add Supabase Auth with email and password: sign-up, login, logout, a persisted session, and a profile row per account. Joining an organisation happens on the way in, and a person cannot choose or change which organisation they are in afterwards. Add a role enum of 'viewer', 'editor' and 'admin' in a roles table kept out of the account’s own record, plus a SECURITY DEFINER function that reads it, and give roles an organisation, so somebody is an editor of one organisation rather than an editor everywhere. Then row-level security on every table, and write every policy as two clauses joined: what this role is permitted to do, AND that the row belongs to the organisation this person belongs to. Never let a role check stand alone as if it were a boundary. On top of that, a per-dashboard grant table so a viewer can be given one specific dashboard, checked alongside the role rather than instead of it, and reachable from an invitation so the grant can exist before the account does and transfer when it is accepted. Then prove six things by querying as a signed-in account: the second organisation’s campaign rows are unreachable, its dashboards are unreachable, an editor of one organisation cannot update a dashboard belonging to the other, an admin of one cannot grant themselves access to the other’s dashboard, a viewer cannot create a widget, and a viewer cannot open a dashboard nobody shared with them.

    Run the six checks in the tab with two accounts rather than trusting that they passed. Four of them will fail loudly if something is wrong. The two about an editor and an admin reaching across organisations fail silently, by working, which is exactly why they are on the list.

  6. 06
    Destination

    The summary, its ceiling, and one channel checked

    The written paragraph, the cap on what it may spend, the exports, and the reconciliation that decides whether anybody should act on this.

    PromptAdd the summary, the cap, and reconcile
    Add the written summary at the top of a board, built so it cannot invent anything. Compute first, with queries: this period’s totals for each metric, the same totals for the previous period of equal length, the change in each, and the same per channel and per campaign. Send only those computed figures to one server-side function that calls the model, and instruct it to describe what it was given without inventing a comparison, trend, projection or cause that is not in the numbers, and to say when a change is too small to matter. Print the figures it was given underneath and name the two periods. Then cap it before I ship: record every call with the account, the feature and the tokens used, and enforce a per-account hourly limit and a project-wide monthly limit I can change without redeploying, refusing politely when either is reached. Then exports: the board as a PDF, and the rows behind any single widget as CSV. Finally, reconcile with me: take one channel for one month, put your figures beside the same figures in the ad platform they came from, and account for every difference, including the rows sitting in the rejects table.

    Put the model key in the project’s environment settings rather than anywhere the browser downloads, and check that before you publish rather than after. It is the one secret in this build that somebody else can spend, and a tab that has been working perfectly for an hour tells you nothing about where the key ended up.

Auth & access

Ironclad role security and dashboard access control

Marketing dashboards hold sensitive financial and performance data. Here is how your system manages user permissions, isolates company data, and securely shares individual reports.

Roles live in their own table, checked by something that outranks the caller

The tempting shortcut is a `role` column on the account’s own profile row, which hands every user the power to promote themselves in one edit. Keep roles in a separate table instead, and have your access rules call a small function that reads it, one that runs with the database’s own authority rather than the caller’s, so the rule can check a role the caller is not allowed to change. Three roles is the shape this product wants: an administrator managing people, an editor building dashboards, and a viewer who reads.

A role is not a boundary: every rule needs both halves

Worth a paragraph, because it survives code review and it is the standard way reporting tools leak. A rule saying "an editor may update a dashboard" answers what this person may do and nothing at all about whose dashboard it is. Both halves belong in the same rule: this person’s role permits the action, AND this row belongs to their organisation. Read each policy back asking which organisation it tests. If the answer is none, you have written a permission rather than a boundary.

Then the second axis: a grant on one dashboard

Roles alone cannot express the case this product runs into immediately: a person who should see exactly one board out of nine. That wants its own table: a row saying this account may read that dashboard, checked alongside the role rather than instead of it, so somebody’s access is the union of what their role allows and what they have been given. It also has to work before the account exists, since people are invited by email and accept later, so the grant hangs off the invitation and transfers when accepted.

The query behind a widget runs as the person looking

Widgets somebody else assembled ask their own questions, and the safe way to answer them is to build the server function’s database client from the viewer’s own credentials rather than an all-powerful key. Then the database enforces every rule above on every widget automatically, including the widget added next month by someone who never read this page. Server-side keys that bypass those rules belong only in jobs that genuinely outrank the caller (parsing an upload, sending an invitation) and each of those has to check the caller’s role itself, because nothing else will.

What a row may become, not just which rows you may touch

A rule that lets somebody edit their own record still has to say what that record is allowed to turn into. If the column deciding which organisation somebody belongs to is editable by them, every rule that resolves through it is decoration. The same applies to joining: a rule permitting somebody to add themselves to a team has to constrain which team, or it is not a rule. Constrain the destination as explicitly as you constrain the actor.

Where the keys live, and what leaves your database

Two secrets matter. The database’s service key belongs only in server-side function secrets and never in the browser, since it ignores every policy above. The model provider’s key belongs in the same place, for a plainer reason: whoever holds it can spend your money. Requiring a signed-in user before a model call is a floor, not a ceiling. A per-account cap on how often anybody may regenerate a summary is what turns it into a limit, and it belongs on day one rather than after a month of unexplained usage.

PromptCheck who can see what
Review the access rules (row-level security policies) on every table. For each one, tell me in simple terms who can view, add, edit, and delete records, confirm that people can only reach their own data while the right roles can reach more, and flag anything left open that shouldn’t be.

Paste this into the chat before launch so Bolt checks nobody can see data they shouldn’t.

Prove all of it by querying as a signed-in account rather than reading the code back. Make a second organisation with its own numbers and check, one query at a time, that it cannot be reached, including the two that look legitimate right up to the last clause: a viewer opening a dashboard nobody shared, and an editor updating a board belonging to somebody else entirely.

Workflow rules

What speeds the build, and what slows it

Speeds the build

  • Using Plan Mode to talk a change through before Bolt writes any code
  • Pointing a prompt at specific files or functions instead of the whole project
  • Clearing Bolt’s context between unrelated features, so each prompt has less to process
  • Checking the live preview after each change, since it’s the running app itself
  • Reading the automatic GitHub commits later as a real history, not just a backup

Slows the build

  • Asking for a whole app in one prompt instead of one screen or rule at a time
  • Leaving context loaded from a finished feature while starting an unrelated one
  • Editing the repository directly on GitHub and expecting Bolt to pick it up before its next 30-second check
  • Approving several prompts in a row without checking the live preview after each one
Before you open Bolt

GitHub: the way in, not just a backup

Bolt can’t open a .zip file, so the only way to start a project is to import a GitHub repository. Every other tool in this set treats GitHub as optional, but Bolt treats it as step one.

Why this comes before Bolt

There’s no upload button for a folder or a .zip. Opening a project in Bolt means pointing it at a repository that already exists on GitHub, so a home for the code has to exist first.

Create a free account, then a repository

Sign up, then create a new, private repository for your project and push your files to it. Keep it private, and never commit secret keys or passwords.

Create a free GitHub account

Import it into Bolt

On bolt.new, connect your GitHub account, choose the repository from the list, and click “Import repository”. The project opens straight into a live preview.

After that, it stays in sync on its own

Bolt commits each working change back to that repository automatically, and checks GitHub every 30 seconds for anything pushed from outside it. A commit is a snapshot with a short note, like “added the home page,” and Bolt writes those notes for you.

Version control and GitHub, Bolt docs

It’s also how you leave, if you ever want to

The repository Bolt is syncing is a real, ordinary codebase: clone it, hand it to someone else, or keep working on it directly on GitHub whenever you’re away from the browser tab.

Going live

Where to host your application

Hosting gives your app a home on the internet so anyone can open it via a web link. Choose a service below to make your site live. (Your database, logins, and business records are stored separately in Supabase, covered below).

HostBest forNotesFree tier
VercelOne-click deploysConnect the repository and every push publishes itself, with nothing for a Vite project to configure. Settle which plan you belong on before a client sees it: Hobby is licensed for personal, non-commercial use, and a dashboard you report to a client from is commercial no matter how small, so Pro, at $20/user/mo.Pro from $20/user/mo (Hobby is non-commercial)
NetlifyDrag-and-drop or GitConnect the repository, or drop the built folder on the page and be live in a minute. Add the redirect rule it asks for. On this app that rule is not a nicety: the whole point of sharing a dashboard is sending somebody a link straight to it, and without the rule that link returns a not-found page.Free tier
Cloudflare PagesClients in several countriesThe board is served from close to whoever opened it, which is the right call when the people reading it are spread across time zones. Worth pairing with a decision about which time zone a "day" ends in, since that is what they will disagree about.Generous free tier
GitHub PagesNot really this appFree publishing from a GitHub project after one routing setting. Listed to be ruled out: free means a public repository, and this code sits beside what you spend and what your clients earn.Free from a public repo only
Firebase HostingTeams already on GoogleOne round of setup, then one command per release. Nothing about the dashboard argues for it. The argument is that your logins are already Google’s.Free Spark tier
AWS Amplify HostingTeams already on AWSPublishes from the AWS console and wants the same rewrite rule for a shared link to resolve. Picked when AWS is on the invoice already.Free tier (build + hosting)
SurgePublish from the terminalOne command sends the built folder online, with no repository involved. Fine for showing a colleague a draft board. Wrong for anything a client has the link to.Free - unlimited publishing
DigitalOcean App PlatformDigitalOcean usersBuilds and serves inside the account you already have, one fewer supplier to explain.Free - 3 static sites, 1 GB/mo transfer

All eight serve a dashboard well enough that speed is not the deciding question. Three others are: whether the plan permits commercial use, since Vercel’s Hobby tier does not and client reporting is commercial. Whether it publishes from a private repository, given what this code sits beside. And whether a deep link resolves for a browser that has never seen your site, because a shared dashboard is a link somebody sends.

One thing will catch you on launch day, and it is not the host. A fresh deploy correctly shows zeros until a file has been imported, so the first hour of production usually goes on establishing that the deploy is fine and nobody has uploaded anything yet.

Database & backend

Keep your data in Supabase

Your campaign rows, the dashboards and widgets somebody composed, the rejects from every import, your uploaded files, and the server-side jobs that read them. This is also where the work that has to outrank the person who triggered it belongs.

ServiceBest forNotesFree tier
SupabaseData, auth, files, server jobsCampaign rows and dashboard layouts both live in Postgres, accounts come from its auth service, uploaded CSVs go into a private bucket, and its edge functions carry the jobs that need more authority than the person who asked: parsing an upload, sending an invitation, calling the model behind the written summary. Setting it up means opening a free project and handing the app the project URL and the publishable key. The one to add afterwards is the model provider key, which goes in the function’s secrets and nowhere near the browser.Free tier, then usage-based
AI features

What to let a model do here, and what to compute first

A marketing dashboard is where the temptation to let a model narrate is strongest, because plain-English summaries of numbers are genuinely valuable and completely trivial to fake. One rule keeps all five of these honest: compute the figure with a query, then let the model choose the words.

Say only what it can actually know

Start here, before adding anything. A summary panel handed this period’s totals and nothing else cannot tell you they rose, and cannot project next week, but asked for insight it will do both, fluently and with a number attached. Better instructions will not help here. Compute last period with a query, pass those figures in, and the model finally has something real to describe. Anything it was not given, it may not mention.

PromptSay only what it can actually know
Rewrite the written summary so it can only describe numbers it was given. First compute, with queries: this period’s totals for each metric, the same totals for the previous period of equal length, the change in each as an absolute and a percentage, and the same per channel and per campaign. Send only those computed figures to my ai function, and instruct it to describe what it is looking at without inventing any comparison, trend, projection or cause that is not in the numbers I sent, and to say when a change is too small to be worth a sentence. Print the figures it was given underneath the summary, name the two periods being compared, and if a metric has no previous period to compare against, have it say so rather than skip it.

Explain a movement after you have found its cause

The question a marketer actually asks is not what changed but why. That is a query (which campaigns and channels account for the difference between two periods, in order of contribution) and once you have the answer, a sentence explaining it is exactly the right job for a model.

PromptExplain a movement after you have found its cause
Add a "why did this move" action on any metric card. Compute the answer first with queries: the campaigns and channels contributing most to the change between the two periods, with each one’s absolute contribution and its share of the total movement, and whether the movement came mostly from cost, from volume or from conversion rate. Then send only those computed contributions to my ai function for two or three sentences in plain language. Show the contributing rows underneath, and where a single campaign accounts for most of the movement, have it say that plainly rather than listing three things as if they were comparable.

Flag the rows that look wrong before they reach a chart

The dangerous import is the one that succeeds. A fortnight uploaded twice, a cost column in the wrong currency, a conversion count with an extra digit: all load cleanly and all move a card. Statistics can find the outliers. A model is useful for saying which of them look like mistakes rather than a good week.

PromptFlag the rows that look wrong before they reach a chart
After every import, run a check for rows worth a second look, computed with queries: amounts far outside the usual range for that campaign, cost-per-acquisition or return-on-spend figures orders of magnitude away from that channel’s norm, dates outside the period I said I was importing, days that already had data before this upload, and any metric that moved more than a threshold I set. Then send the flagged rows to my ai function for one line each on why it might be a mistake, and show me the list with an accept or investigate action per row. Nothing is edited or deleted automatically, and the flagged count sits beside the import summary where the reject count already is.

Ask your own numbers a question in words

A board can only answer the questions it was built to answer. The ones that turn up later (did the sale week pay for itself, which channel quietly got more expensive since spring) each arrive once and do not deserve a widget of their own.

PromptAsk your own numbers a question in words
Add a panel where I type a question about my own campaign data in ordinary words. My ai function turns it into a read-only query, runs that query under my own access rules so it can never reach another organisation’s rows, and uses the model only to word the answer. Under every answer, show me the query that ran, the rows it returned, and the period and filters that were in effect. Two hard rules: when a question needs data I do not import, it says so rather than estimating, and it never answers from what it already knows instead of from a query. It writes nothing, ever.

Put a ceiling on what it can spend

Requiring somebody to be signed in stops strangers spending your model budget and does nothing about the person who discovers the regenerate button. Every feature above is a request somebody can repeat, so the cap belongs in the same place as the key.

PromptPut a ceiling on what it can spend
Add a spending ceiling to my ai function before I ship any of the features above. Record every call with the account that made it, the feature it came from, and the tokens it used. Then enforce two limits I can set without redeploying: how many calls one account may make in an hour, and a total for the whole project per month, refusing politely and telling the person when either is reached, rather than failing silently or charging on. Show me current usage against both limits on an admin screen, and log a refusal the same way as a call so I can see when a limit is doing something.

Pick a lighter model for the high-volume prompts above and save a stronger one for wherever the reasoning actually matters. That is the same token-budget logic as the rest of this page, applied to the app’s own AI calls instead of the build itself. When Bolt flags a missing secret, add the key through its secrets settings instead of pasting it into the chat, and keep every AI feature behind one server-side function so there’s only one key to manage.

Ready-made option

Get a head start with our template

Every route above begins with an empty folder. There is one that does not. This dashboard is built, runs, and already knows what to do with a messy export, so the weeks that a parser, a widget library, a query layer and two kinds of permission would have cost you turn into one upload and a look at the reject list.

Marketing Analytics Dashboard

The exact marketing dashboard this guide builds, packaged so you can open it, point it at your own backend, and make it yours from there. A marketing analytics tool where you bring in your data, assemble dashboards from a library of widgets and charts, and let AI point out what stands out. It turns scattered campaign numbers into a clear picture your whole team can read.

React 18ViteTypeScriptTailwind CSSSupabaseRecharts
Out of the box

The key benefits of starting with a template

The import validates every row and keeps what it refuses, the six rates are computed with guards, dashboards are composed from a widget library, and each widget’s query runs under the permissions of whoever is looking. That is most of the saving. The sharing, the invitations and the notifications are done too.

Building the core from scratch

~103 hrs

Opening the template, already built

~1 hr

~102 hrs of building you skip

Two different measurements on purpose. The larger figure is what it costs to build this application. The ~1 hr is what it costs to adopt the finished one: connect your own database, put one real export through it, and settle who may build a board against who may only open one. Longer than most templates in this catalogue take, because this is one of the few that shows you nothing until real data has been through it. What neither figure includes is the argument about what a conversion means in your business, since that costs the same whichever route you take.

An import that already copes, and keeps its refusals

Upload a CSV and a server-side function parses it, checks that the required columns are present, validates every row (dates parseable, numbers numeric and not negative where that makes no sense), writes what passes into the campaign tables and every failure into a rejects table with its line number, its raw data and the reason. Re-uploading the same fortnight is a decision rather than an accident: rows are keyed on date, channel and campaign, and you choose per import whether a repeat is skipped or overwritten.

Two data shapes, both wired up

A wide table of one row per day, channel and campaign carrying impressions, clicks, conversions, cost and revenue, and a canonical star schema alongside it: a campaign dimension with separate fact tables for sessions, cost and conversions. Two import functions, one per shape. The wide table is the quick path. The star schema absorbs a new metric without touching every screen. Having both makes the choice in decision 03 above a preference rather than a rebuild.

Six widgets, and the editor that composes them

A library of line, area, bar and pie charts, a metric card and a data table, each one configurable, arranged into saved layouts by anybody with the editor role. Behind them a function answers each widget’s own query, building its database client from the viewer’s own credentials rather than a service key, so every access rule below applies to every widget automatically, including one added months later. Four filters cross the whole board at once, remembered between visits: date range, channel, campaign and geography.

83 live access policies, over two permission axes

Three roles from a real database enum (viewer, editor and administrator) kept in their own table behind checks running with the database’s authority rather than the caller’s, and 83 live row-level security policies over 24 tables. Then the second axis, which is what makes this usable with clients: a grant on a single dashboard, attachable to an invitation so it transfers when the account is created. Somebody can be given one board without the run of the place. How far the roles reach is worth knowing before you go live: read the access section above, because on a deployment holding more than one client’s numbers there are policies you will want to narrow.

The written summary, and the honest note about it

A server-side function sends the current metrics to OpenAI and returns a short plain-English summary for the top of the board. It requires a signed-in user before it spends anything, tells a rate limit apart from an out-of-credit error, retries a provider outage three times with a growing pause, and takes its model from an environment variable so swapping it is configuration rather than a code change. What it is given is the current totals and the filters in effect (no history) so treat any comparison or projection in its text as a turn of phrase rather than a finding. The first AI prompt above is the version that computes the comparison before mentioning it.

A codebase your AI tool can keep extending

Types on everything, one hook per thing that gets queried, folders named after features rather than file extensions, and comments where the reasoning would not survive a cold read. The widget layer is where that pays off: a seventh kind of widget is the change you are most likely to want, and the six that exist show where a new one plugs in.

Customer story

From founders who build on our templates

As an agency, clean handoffs are everything. This template is so well-architected that we can restyle the interface, connect the client’s data, and hand over a finished product, without wasting billable hours untangling someone else’s mess.
Matt GrahamMatt GrahamFounder & CEO, RapidDev
Got questions?

Common questions

You upload files, and that is the first thing to know before comparing it with anything on the market. There is no authenticated connector to an ad platform: you export a CSV from each one, upload it, and a server-side function validates and loads every row. That is the honest trade. The products that do connect are the ones metered per client or per data feed, and maintaining connectors against platforms that rename fields is most of what that fee pays for. A connector to one specific platform is a well-defined addition, and it is the thing most people want second, after a month of their own numbers has actually landed.

Every row that fails is written to a rejects table with its line number, the original row and what was wrong with it, and you are told how many failed as soon as the import finishes. Why that matters: a board silently short of two hundred rows still draws a confident chart, and nothing about it looks wrong. So read the reject list after every upload as a habit. In practice most entries turn out to be one date format or one renamed column, which is a five-minute fix the moment you can see it. One thing to know as it ships: the rejected rows are kept and counted, but the download link offered for them does not work, because the file is written to a private bucket and linked as though it were public. The rows are in the database. Fixing the link is a signed URL.

Trust the numbers it quotes and not the story it tells about them. As it ships, the summary is sent the current totals and the filters in effect, and nothing else, no previous period and no history. The metrics it repeats are therefore real. Any comparison, trend or projection in the same sentence is the model being fluent, because it has no data to derive one from and the example in its instructions encourages it to try. That is a genuine limitation, stated here rather than buried: treat the paragraph as a readable caption, and use the first AI prompt on this page to replace it with a version that computes the comparison first and may only describe what it was given.

No, and a table in the schema makes it look as though it might. The exchange-rate table has access rules on it and nothing in the application reads it, so every figure you see is in whatever currency your imported rows were in. For most teams advertising in one currency that is a non-issue. If you spend in three, the honest description is that this is an addition rather than a setting: convert on import or at query time, store which rate you used, and mark any total that mixes them. That last part is what stops an awkward conversation about a number being slightly off.

Yes, and it is one of the two things this template was shaped around. Access is the union of a role and a set of grants: a viewer can be given one specific dashboard, by email, before they have an account at all. The grant rides on the invitation and transfers when they accept. Before you point a client at it, read the access section above and narrow what you find there: some rules as shipped grant an editor or an administrator reach across dashboards without checking which organisation the dashboard belongs to, which is harmless on a single-company deployment and not what you want when two clients share one database.

Very little, and it is the one running cost that is genuinely usage-based. The summary sends a few hundred tokens and gets a short paragraph back. At the published price of the small model it ships with, that is a fraction of a cent per refresh, so a thousand refreshes in a month costs cents rather than dollars. Two caveats worth more than the arithmetic: nothing in the template caps that spend, so a per-account and per-month ceiling is the sixth AI prompt above and worth adding before you ship, and the model is chosen by an environment variable, so pointing it at something larger changes the sum entirely.

No. You describe what you want in the chat and Bolt writes the code and shows it running in the same tab. The one extra step Bolt asks for that other browser tools don’t is a GitHub account, since that’s how a project gets in. The setup section above covers it.

Bolt only opens projects from a GitHub repository, and it offers no upload button for a folder. Once it’s imported, Bolt keeps the two in sync automatically, so the extra step up front replaces a manual export later.

Free resets daily, and a paid plan’s monthly allotment resets on your billing cycle (unused Pro tokens also roll over one extra month). If you hit the cap mid-session, what you’ve built stays exactly as it is. You wait for the reset or buy more tokens to keep going right away.

References

Sources checked August 2026
  1. 01Highlights and Insights Report, 35th edition (marketing technology performance, n=308). cmosurvey.org (fielded January 2026)
  2. 02Pricing (per-client plan, unlimited users, add-ons), AgencyAnalytics. agencyanalytics.com
  3. 03Pricing (dashboard tiers, unlimited users), DashThis. dashthis.com
  4. 04Pricing (data sources, destinations and users; both billing bases), Supermetrics. supermetrics.com
  5. 05Pricing (two “starts from” floors, connector counts), Funnel. funnel.io
  6. 06Pro subscription overview (per-user licences, one Cloud project), Data Studio - formerly Looker Studio. docs.cloud.google.com
  7. 07Pricing (Pro plan, free-tier limits, project pausing), Supabase. supabase.com
  8. 08API pricing (per-million-token rates for the small models). developers.openai.com
  9. 09Web developer hourly rates 2026 (freelance and agency benchmarks). developex.com
  10. 10Row Level Security, Supabase docs. supabase.com
  11. 11Storage access control, Supabase docs. supabase.com
  12. 12Edge Functions secrets and environment variables, Supabase docs. supabase.com
  13. 13Pricing (Free, Pro, Teams), Bolt. bolt.new
  14. 14Version control and GitHub, Bolt docs. support.bolt.new
  15. 15Connect Supabase, Bolt docs. support.bolt.new
  16. 16What is Bolt Cloud?, Bolt docs. support.bolt.new
  17. 17Netlify deployment (and Bolt hosting by default), Bolt docs. support.bolt.new
  18. 18Maximizing token efficiency, Bolt docs. support.bolt.new

This guide is general information, not advice about how to measure your marketing. What counts as a conversion, and which platform’s figure is authoritative when two disagree, are decisions for your own business, and a number on a dashboard is only as good as the definition underneath it. Third-party prices, plan terms, and market rates are quoted from the sources above and were last checked on the date shown. Vendors change them without notice, so confirm before you budget. Build hours and the cost estimates derived from them are our own estimates, not quotes. Bolt is a product of StackBlitz. Verify current capabilities and pricing before relying on them.