Build with AI

How to build a finance dashboard with v0

Stop paying monthly software fees just to view your own business numbers. Download our ready-to-use finance dashboard, and let v0 customize it for you. Simply talk to the AI in plain English to connect your spreadsheet export, choose your currency, and get clear financial charts in minutes, no coding required.

August 2026 · 57 min read · Updated September 2026

v0

$ Build the screens for a finance dashboard: an overview of KPI cards, revenue, expenses, profitability, cash flow, receivables with ageing, and a reports page, then connect a database, import a real CSV, and compute the figures that make the cards true.

  • Cards and charts sketched
  • Real import replaces the placeholders
  • Ready to merge
You describe it, v0 builds it
Start here

What a finance dashboard actually is

A very short list of numbers somebody is going to act on. Everything difficult about building one sits between the export you start with and the figure on the card, and none of it is the chart.

The screen is deceptively simple: revenue, expenses, profit, cash, what you are owed: five numbers an owner reads in four seconds. A whole software category exists to produce them because each is a conclusion, and the path from raw records to conclusion has half a dozen places to go quietly wrong.

Start with where the numbers live. They are in an accounting system, and what you can get out is an export: invoices, payments, expenses and bank lines, in whatever shape that system felt like. Between that file and the dashboard, something has to decide what counts as revenue, on which date, in which currency, and what to do with the rows that will not parse. Those decisions are the product. The chart is the last five per cent.

What makes it different from most small applications is that being approximately right is not a rounding error, it is a wrong decision. Nobody re-plans hiring because a task board is stale. People do because a cash-flow chart said the quarter was fine. Hence the time this build spends on provenance: which rows produced this figure, on what basis, at which rate, and how you would check.

The import is the application

Exporting data from your accounting software is usually frustrating: column names change, dates look messy, and numbers get mixed up. We built the complex data-cleaning rules into this template for you. When you upload your export, the system automatically organizes the numbers, flags any missing data, and keeps your charts accurate.

Two bases, and they are not the same business

Accrual counts an invoice the day you send it. Cash counts it the day the money lands. For any business with payment terms those are two genuinely different pictures of the same month, and the gap between them is the thing receivables exist to measure. Decide which one your dashboard means, put it in a setting, and compute both if anybody will ever ask.

A forecast is a claim, and it needs a label

Every dashboard in this category eventually draws a line to the right of today. That line is not data, and whether it came from arithmetic on your history or a model asked to be plausible changes what somebody may do with it. The screen should say which, because the person reading it is deciding whether to hire.

How much the numbers are trusted today

~40%

of CFOs "do not completely trust the accuracy of their organization’s financial data", in a survey of over 1,300 senior finance people across seven countries published in January 2024 by BlackLine, a company that sells software for closing the books, so read it as interested research rather than neutral. Two things make it worth quoting anyway: the sample is large and named, and the number is about trust rather than tooling. A dashboard nobody believes is a slower spreadsheet.

BlackLine survey (Censuswide, 1,300+ respondents), published January 2024 · checked survey published January 2024

What a finance dashboard needs

The parts every finance dashboard is built from

Five of these six are invisible on screen, and they are where the build time and the credibility both live. The first is where most projects fail.

01

An import that survives a real export

Your accounting system will hand you a file, and that file will disappoint you: a column renamed since last quarter, dates in two formats, a currency symbol glued to an amount, a negative in brackets, blank rows where somebody added a total. A parser that copes is half of it. The half that decides whether anybody trusts the result is what happens to the rows that fail: kept in a table you can look at, with the reason and the line number, rather than silently missing from a chart. Every finance person’s first question about a dashboard is "does this include everything", and a reject list is the only honest answer.

02

Instant analytics with no waiting time

If a website has to recalculate thousands of sales lines every time you click a page, it will freeze and load slowly. Our template automatically summarizes your daily totals in the background. That means your charts load instantly, even if you have years of sales data.

03

Accrual or cash, decided in a setting

The same month is two different businesses depending on whether you count an invoice when it was sent or when it was paid. Neither is more correct. They answer different questions. Put the choice in a settings row rather than the code, compute both if anybody will ask, and label the screen. A profit figure with no basis beside it is a number in search of an argument.

04

One currency to read, several to record

The moment you invoice abroad you have two problems and only one is obvious. The obvious one is converting into a base currency you can add up. The subtle one is that markets close, so for weekends, holidays and the day you happened to bill there may be no rate. Carrying the last known rate forward is the standard answer. The part worth building properly is marking the rows where you did it, so a converted total can say which part of itself was estimated. That flag costs an afternoon and settles every awkward conversation about a number being slightly off.

05

Receivables, because that is where trouble shows first

Profit is an opinion about a period. Being owed money is a fact about today. Ageing buckets and days-sales-outstanding are the two figures here that predict rather than report. A business whose average wait moves from thirty-four days to fifty-one has a problem two months before the cash-flow chart shows it. Build the ageing from invoice dates and payments rather than a status field somebody has to remember to update.

06

Control Who Can Edit vs. Who Can Only View

You don’t want team members or investors accidentally editing your financial records. This template comes with pre-set user roles: Admins can upload spreadsheets and change settings, while Viewers look at charts and download reports. The import, the figures jobs and the settings refuse anyone who is not an admin. If you run multiple businesses, each business’s data is kept completely separate and private.

Build vs buy

Own the dashboard or rent a view of your own numbers

The five products below barely charge per person. Four advertise unlimited users. What they meter is the shape of your business: a second company, a fourth dashboard, a fifth data feed, one business open at a time. Work out which you outgrow first, because that is what you are buying.

Build your own

An app you own has no meter on any of that. Your second company is a row, your ninth dashboard is a route, and the figures behind them are already in your database, and with an AI coding tool writing the import, the daily jobs and the permission rules, that build is weeks rather than quarters.

  • A second or fifth company is a row in a table rather than a plan tier
  • A ninth dashboard costs a route and an afternoon, not an upgrade
  • Every invoice, payment and expense is in your own database, queryable without an export request
  • What counts as revenue, and on which basis, is your definition to write down
  • Two businesses open at once, because nothing is stopping you
  • No tier gets restructured under you, and no feature moves behind an upgrade you have not agreed to

Rent the reporting layer

Fathom · Klipfolio · Databox · LivePlan · Jirav

What renting buys is the part this template deliberately does not attempt. Live connections into the systems your numbers already live in, rather than a file you export. Consolidation across entities. Benchmarking against other companies. Client-ready branded report packs. On the accountant-facing products, a review workflow built for signing things off.

  • Live connectors into your accounting system, so nobody exports anything. This template reads a CSV you give it
  • Consolidation across several entities, with the eliminations that makes necessary
  • Benchmarking your figures against other companies, which needs data you do not have
  • Branded, client-ready report packs, and on two of these a workflow for reviewing and signing them off
  • Somebody else’s problem when your accounting system changes a field name
  • Four of the five advertise unlimited users, so what you are billed for is companies, dashboards or data feeds
FathomFrom $59/month for one company, then $315 (10 companies), $450 (25) and $805 (50) - all in AUD, excluding GST, with extra companies from $13 to $59 each

First because it states the meter more plainly than anybody: you buy companies, and "Unlimited users" is listed as an included feature beside the price. That combination is the whole argument of this table: what is rationed is the entity, not the seat. The included list is also a fair summary of what this template does not do: "Group benchmarking", "Multi-currency consolidations", "Unlimited brandable reports". Prices are quoted in Australian dollars because that is the currency its page served us. Converting them ourselves would be inventing a figure.

fathomhq.com · checked August 2026

Klipfolio$120 (Base), $190 (Grow), $310 (Team) and $600 (Team+) per month - for 3, 10, 20 and 40 dashboards, with unlimited users on every tier

The strangest meter in the set to explain to somebody about to build their own, which is why it is here: the ladder is how many dashboards you may keep. Users are unlimited on all four tiers, and what else moves up is how often the data refreshes: four hours, one hour, fifteen minutes, then up-to-the-minute. Hold that beside a build you own, where a fourth dashboard is a new route and the refresh rate is however often you run the job. Its trial is 14 days with no card, described as "almost unlimited access to Klips".

klipfolio.com · checked August 2026

DataboxFree (1 dashboard, 3 data sources, 1 user), then $64 (Analyst), $159 (Pro) and $399 (Growth) per month - with extra data sources at $5.60/month each

The generous-looking free tier that a finance dashboard outgrows immediately, and a third kind of meter. Free gives you "3 data sources included", "1 user" and "1 Dashboards & reports". The paid tiers hand back unlimited users and dashboards and then charge per feed. Do the count first: revenue, expenses, invoices, payments and exchange rates is five feeds before you reach a bank. The annual figures on the page are $768, $1,908 and $4,788.

databox.com · checked August 2026

LivePlan$20/month (Standard) and $40/month (Premium), both with a 25% saving billed annually, plus an optional expert add-on at $30/month

The cheapest row by a wide margin, and included for a limit that is not a price. Its page says you can "Create as many companies as you like in LivePlan. However, only one company can be active at a time." For a founder with one business that is a non-issue. For anybody with a group, a side venture or clients it is the whole decision. Both tiers include five contributors and unlimited guests, another reminder that seats are not what this market charges for.

liveplan.com · checked August 2026

Jirav“Starting at $50/mo” (Controller Essentials) and “Starting at $150/mo” (CFO Enterprise) - the page does not say per what

Here for what it does not tell you. Both figures are floors rather than prices, neither is stated as per user, per entity or per anything, and both route to a demo request rather than a checkout. That is normal in this part of the market and worth naming, because it is the practical difference between this table’s two columns: one you can budget from a web page, the other starts with a call. No per-seat or per-company reading is invented here, because the page does not support one.

jirav.com · checked August 2026

Rule of thumb: if the numbers must arrive automatically rather than through a file, if several entities need consolidating, if a client expects a branded pack with a review trail, or if somebody would rather ring a supplier than read a query, rent. If what you want is your own five numbers, defined the way your business defines them, in a currency you chose, with a bill that does not move when you open a second company, that is the half worth owning. One honest note either way, from the same survey as the figure above: 68% of those senior finance people said manual work leaves their organisation vulnerable to decision-making errors. Building the dashboard does not fix that by itself. It fixes it on the day you stop maintaining the spreadsheet beside it.

No dev needed

Why build with v0

v0 starts with the screens: forms, tables, dashboards, whatever the interface needs, generated in React and Next.js from a plain description. That’s the part most people notice first, because it’s fast and it looks finished immediately.

The backend isn’t automatic in the same way. v0 can write it too, meaning Next.js routes and server logic that read and write real data, but you ask for it, usually once the UI already exists and there’s something real to connect it to:

The build loop
1

Sketch

Describe the screen or component you want.

2

Preview

See it rendered live, and select any part of it to adjust directly.

3

Connect

Add a database and the routes that read and write to it, once the UI needs somewhere real to save.

Iterate

Prompt again for the next screen or the next piece of logic.

Loop back to Describe

The order matters here more than with a full-app builder: v0 gets you a finished-looking interface fast, and the data underneath doesn’t show up until you ask for it and give it somewhere to live.

One clickconnects a database

Supabase, Neon, and Upstash are integrations you add from the project menu once a screen needs to hold onto something real, and v0 provisions the credentials and writes the routes that use them.

Live preview is the feedback loop

Every prompt updates the working interface right there in the chat, so you see the actual screen changing instead of imagining it from a description.

Design mode edits without a prompt

Select an element in the live preview, adjust its style directly or type a plain-language instruction, and v0 applies the change back to the real source code as a new version.

What it costs

Pay a developer, or do it with AI

The only line in either column that is not optional is the model behind the forecast. The rest is a database plan and hosting, and both start free.

Hire a developer

Custom build, from scratch
Developer
~$12k-$49k
Supabase (backend)
Free tier · $25/mo (Pro plan)*
Hosting
$0 free tier
AI model (the forecast)
Usage-based - the one line here that is not optional
Build time
~245 hrs of their work

~$12k-$49k to build, then from $25/mo plus model usage

Our ~245-hour estimate, priced at the rates in the survey linked below: senior US developers at $100-$150+ an hour, and agencies charging 20-40% above the freelancers they bid against, which is what makes $50/hr and $200/hr the honest ends. The distribution matters more than the total: roughly a third of those hours are the import and the jobs turning records into daily figures, and another slice is the permission model. Where somebody has quoted for "a dashboard", check what they assumed about the file your accounting system actually produces.

Build it with v0

From scratch, with v0
v0
$0 ($5/mo of credits) to $30+/month (Plus)
Backend (Supabase)
Free tier · $25/month (Pro plan)*
Hosting (Vercel)
Free on Vercel’s Hobby plan
Your time
~116 hrs

Free to try the idea, ~$30+/month on Plus while you build a real one, then whichever plan you keep using

v0 bills in dollars of credit rather than a flat fee, so cost tracks usage: importing the pre-built template can fit inside Free’s $5 a month, while a from-scratch build runs into Free’s 7-messages-a-day cap quickly and usually needs Plus, at $30 per user per month with no annual discount shown. Because v0 generates the interface and the backend as separate steps rather than one pass, expect more prompts to reach the same result than a tool that writes both together.

* Two free-tier lines matter here, and neither is the one people check. The 500 MB database is enough for years of records, because financial data is small. What bites is the pause: a free project stops after a week of inactivity, and a dashboard read monthly is exactly the sort that goes quiet for a week. Pro, from $25/mo, ends the pause, keeps a daily backup for 7 days, and lifts egress to 250 GB (then $0.09 per GB) and file storage to 100 GB (then $0.0213 per GB), the second being where imported files accumulate.

Either way the dashboard is yours, and the only running costs are the database tier and whatever the forecast spends on a model. The difference between the columns is who does the work: pay someone up front, or describe what you want and build it yourself.

Prices and rates from supabase.com, developex.com, v0.app, v0.app and vercel.com, checked August 2026.

Plan first

Decide before you build

Six things to settle in writing first. Each is a definition somebody will later argue with, and far cheaper to write down now than to change once a figure has been in a board pack.

01

Where the numbers come from, and in what shape

Export a real month out of your accounting system before you plan anything else, and open the file. Its column names, its date format, how it writes a credit note. That is the specification for the hardest part of this build. If the answer is several systems, decide whether they arrive as separate imports or get merged first: different schemas.

02

Accrual, cash, or both

Write down which question your dashboard answers: what we earned, or what we banked. Most businesses with payment terms want both eventually, and the honest version of both is a setting plus two computed sets of figures. It changes which date every aggregation groups by, so decide before the jobs are written.

03

Your base currency, and what a missing rate means

Pick the currency you think in, then handle the awkward half: markets close, so some transaction dates have no rate. Carrying the last known rate forward is a good answer. Decide whether a total built on a carried-forward rate may look identical to one that was not. When somebody queries a figure, that is a two-minute answer or an afternoon.

04

Who may read, who may write, and how many businesses

A finance dashboard has readers who must not be able to change anything, which makes two roles the minimum. Then the bigger question: one company, or several? If several, keeping one set of books entirely invisible to another is the project’s most important rule, and it belongs in the database rather than a screen.

05

What each of your five numbers actually means

Revenue net or gross of refunds. Whether an intercompany invoice counts. Whether a deposit is revenue when taken. What sits above the line in your margin. Your AI tool cannot answer those, but written down they become a specification it can build exactly, and a note for whoever disputes a figure later.

06

Whether a forecast may be a guess

Something here will eventually draw a line past today, so decide in advance what that line may be. A projection from your own history (a trend, a seasonal average, a run rate) can be explained and checked. One a language model produced because it looked plausible cannot, and looks exactly as confident. The fix is a label on the chart.

Approaches

Comparing your build options

A finance dashboard is a very small amount of interface over a large amount of arithmetic, and where you start decides which of the two you underestimate. Three routes to the same product: written out by hand, assembled on a UI kit with nothing underneath, or generated in v0, where the cards arrive first and the arithmetic follows when you ask for it.

~245 hrsBuilding by hand

The charts are a fortnight. What takes the quarter is everything behind them: getting an export out of your accounting system to parse cleanly, deciding what to do with the forty rows that do not, turning invoices and payments into daily totals on two different accounting bases, converting six currencies on days the rate is missing, and making sure the person who should only be reading cannot write. None of that appears on screen, and all of it decides whether the screen is true.

~180 hrsGeneric UI starter kit

A kit hands you a dashboard shell, KPI cards and a chart library, which is genuinely most of the pixels and almost none of the work. Nothing in it knows what an invoice is, that revenue means two different numbers depending on a setting, that a rate was carried forward from Friday, or which company the person signing in belongs to. Every figure the cards display is still yours to derive.

~116 hrsBuilt with v0

The cards and charts appear the moment you describe them. The import, the jobs and the rules that make the numbers on them real arrive once you ask. The same work as the rows above, done in two passes rather than one, each chat landing on a branch of its own.

Interactive calculator

Estimate your exact build timeframe

Plenty of businesses need less than this. If you invoice in one currency, or nobody but you will ever sign in, untick those rows and watch the estimate fall.

What your finance dashboard needs

Your estimate

116 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

v0 runs entirely in the browser too, so there’s no download and no terminal. Before step 01: sign up, pick a plan, and know that a database is one click away once a screen actually needs to save something. GitHub is the last piece, and it’s what turns the chat into a project you can hand to someone else.

1

v0 account

Cost: Free

Sign in with a GitHub, Google, or email account and you land in a chat where you describe the interface you want. There’s nothing to install.

Sign up for v0
2

v0 subscription

Cost: Free ($5/month of credits), then $30/month (Plus)

Free includes $5 of credits a month, capped at 7 messages a day, which is fine for trying a few screens and thin for a real build. Plus is $30 per user per month, billed monthly only (v0’s pricing page shows no annual option), and it’s the realistic floor once you’re iterating past a handful of screens.

Compare v0 plans
3

Database (Supabase, Neon or Upstash)

Cost: Free to start

Where your project keeps its data, added when a screen needs one. v0 generates the interface first. A database is a one-click integration you add from the project menu once a screen needs somewhere real to save to, with Supabase, Neon and Upstash as the options, and connecting one lets v0 write the routes that use it.

Connect a database in v0
Optional
4

GitHub connection

Cost: Free

Not needed to build anything, since v0 keeps its own history of every change. Connect a repository from the chat’s Git panel and v0 also commits every code-changing message to its own branch, ready to merge as a pull request. That is the step that turns the chat into a project other tools, and other people, can use.

Connect v0 to GitHub

The database step is the one worth not skipping once your screens need real data. Everything else here takes a couple of minutes, and after that you’re just describing what you want.

Step by step

Build your finance dashboard, one chat at a time

The interface comes first with v0 and the backend arrives when asked for, and on this particular app that is both the most helpful and the most dangerous thing about it. Helpful, because seven pages of cards and charts is exactly what v0 is for. Dangerous, because a dashboard full of invented figures is indistinguishable from a working one, so step 02 is a hard stop where a real export retires every placeholder before another page is built.

  1. 01

    Sketch the overview and one detail page, and stop there

    The shape of the thing, with placeholder figures, in one chat. The point is to settle which five numbers belong on the overview before anything is stored anywhere.

    PromptSketch the dashboard screens
    Build the shell of a finance dashboard in Next.js with placeholder content for now: an overview page with KPI cards for revenue, expenses, profit, cash and receivables, each with a period-on-period change, plus a revenue chart and an expense breakdown. One detail page, receivables, with ageing buckets and a days-sales-outstanding figure. Include a filter bar for period, currency and segment, and put a visible slot on every page for the accounting basis and base currency the figures are on. Show me the empty state for a company that has imported nothing yet, because that is what this app looks like on its first day. Keep it readable on a phone. Somebody will check cash on a phone.

    Use Design mode for the visual corrections rather than describing them. On a dashboard, the density of a KPI card and whether a change indicator reads clearly at a glance are most of the product, and those are exactly what Design mode is for.

  2. 02

    The hard stop: a real export, and every placeholder retired

    Add the database integration, then hand over an actual month from your accounting system. Nothing else gets built until the cards are reading imported rows.

    PromptModel the company and import a real file
    A Supabase integration is now connected. Two things in this chat, and no new screens. First, the schema, with a company reference on every table from the start: companies. Profiles linking an account to a company. Customers and vendors. Invoices with an issue date, a due date, an amount, a currency and a customer. Payments against invoices with their own date. Expenses with a date, an amount, a currency, a vendor and a category, plus my own category table. Vendor bills. Bank lines with a date, an amount and a direction. A rate table keyed by currency and date with a flag for real or carried-forward. A per-company settings table with the accounting basis, base currency, timezone and whether future dates are allowed. Empty daily-figure tables for revenue, expenses, cash flow, receivables and payables. Second, the import: a private bucket restricted to CSV and scoped per user folder, and a server-side route that parses an upload, validates every row (required fields, parseable dates inside a stated period, numeric amounts, known currency, no duplicate of an existing record), inserts what passes and writes every failure to a rejects table with the line and the reason. A real export from my accounting system is in the project: read it first and tell me what you found before writing the parser. Then import it and take the placeholder figures out of the two pages I already have.

    Do not let this chat end with a placeholder still on screen. Everything after it reads real rows, and a card designed against an invented figure has to be rebuilt the moment the real one turns out to be negative, or in another currency, or missing for the first three weeks of the period.

  3. 03

    The figures, in the database, in their own chat

    The step that decides whether the cards mean anything, and the one where a tool that leads with interfaces will cheerfully hand you a total computed in a component.

    PromptCompute the daily figures
    New chat, for the figures. Build them as database jobs invoked by a server-side route, each rebuilding a period I name, not as arithmetic in a route handler and definitely not in a component. Revenue from invoices by issue date for accrual and from payments by their own date for cash, computed both ways. Expenses by date and category. Cash flow as inflows and outflows from payments and bank lines with a running balance. Receivables and payables outstanding, bucketed by how overdue, plus days-sales-outstanding. Convert into my base currency at the rate for each record’s own date, carrying the last real rate forward where none exists, marking the resulting figure as partly estimated, and never overwriting a real rate. What I am asking you not to do is fetch rows and sum them in JavaScript. The arithmetic belongs next to the data, and the reason is not speed, it is that two pages summing the same rows in two places will eventually disagree. Then print the working for one month, with both bases side by side.

    Say "not in JavaScript" and then check the diff for it. Fetching and reducing is the natural thing to write when the interface came first, and here it produces the specific failure that destroys trust in a dashboard: two screens showing different totals for the same month, both of them defensible.

  4. 04

    The remaining pages, now that a figure means something

    Revenue, expenses, profitability and cash flow over real computed figures. Fast, because the hard part is behind you and these are the screens v0 is best at.

    PromptBuild the remaining pages
    Add the rest of the pages, all reading the computed daily figures rather than the raw records: revenue with filters that drill down to the invoices behind a total. Expenses by category with the same drill-down. Profitability with the margin definition printed beside the number. Cash flow with a running balance. A reports page offering downloadable profit-and-loss, cash-flow and expense packs as PDF and CSV. Every page shows the accounting basis and the base currency it is on, and marks any total that used a carried-forward rate. Keep the filter bar from step 01 working across all of them and let a filter set be saved and reused. Nothing here computes a figure of its own. If a number you need does not exist in the figures tables, tell me and I will add it there rather than in a page.

    That last sentence is worth keeping in the prompt. The moment one page computes something the figures tables do not have, you have two sources of truth and no way to tell which one a reader was looking at, and it always starts with a single innocuous percentage.

  5. 05

    One company’s books: auth and access rules, in their own chat

    One company’s books, and everybody who should not see them. Its own chat again, and its own reviewable diff.

    PromptAdd auth, roles, and the access rules
    New chat, for authentication and access rules. Add email-and-password sign-up, login, logout, a persisted session, and a profile row per account carrying its company. Add two roles (admin and viewer) in a separate table rather than on the account record, with a security definer function to check a role. Then row-level security on every table, with two things done deliberately. One: every policy scopes rows to the person’s company, and the profile update policy carries an explicit with-check forbidding a change to which company it points at, because which row you may edit and what that row may become are different questions and this column is what every other policy resolves to. Two: any policy meant to be admin-only calls the role check in its condition rather than only in its name, most importantly on the roles table itself, since a viewer who can write it is an admin. Beyond that: only an admin writes records, changes settings or triggers the jobs. A viewer reads everything and writes nothing. Every server-side route re-checks the role itself. Then prove five things as a second signed-in account: the other company’s invoices are unreachable, its figures are unreachable, a viewer cannot insert an expense, a viewer cannot change the base currency, and an account cannot move its own profile to another company.

    Give this its own pull request rather than stacking it on the pages. Of every change in this build, the access rules are the one you will most want to read back as a single self-contained diff in six months, when somebody asks what stops one client’s accounts appearing in another client’s dashboard.

  6. 06
    Destination

    The forecast, the audit trail, then merge and reconcile

    The line to the right of today, the record of who changed what, and a month checked against your own books before anything is merged.

    PromptBuild the forecast, the audit trail, and reconcile
    Last chat. First the forecast: project the next twelve months from my own computed figures using a trend and a month-of-year seasonal factor, and name the method and the number of months it was fitted from on the chart itself. If a model is involved at all, restrict it to one sentence of commentary that cannot change a number, and label that sentence as commentary in the interface and not only while it is loading. Then audit triggers on invoices, payments and expenses recording the old and new values of every change, with a screen to read them. Then, before I merge: reconcile with me. Take one real month, put your revenue, expense and cash figures beside the same three from my accounting system, and account for every difference, including whatever is in the rejects table. Tell me plainly if any of them do not match.

    Reconcile before the merge, not after. A merge into the branch your Vercel project deploys from is the moment this stops being your dashboard and starts being the one somebody else quotes in a meeting, and the figures should have been checked against a source you trust before that happens.

Authentication & security

Role-Based Access Control (Admin vs. Viewer)

A dashboard is useless if anyone can overwrite the data. Our codebase includes a pre-configured role-based permission system out of the box. Admins can upload CSVs, reconcile data, and adjust settings. Viewers read the charts and export reports, and the import, the figures jobs and the settings refuse them. Furthermore, if you manage multiple entities or clients, the database architecture ensures data is strictly siloed: one client can never see another’s books.

Let the auth service do the passwords

Sign-up, sign-in, sessions and password resets belong to whatever auth service ships with your database. A hand-rolled one that is wrong is wrong silently. Add one thing here: a second factor for anybody who can import or correct figures. The account that can rewrite what last quarter earned deserves more than a password.

Everything hangs off a company, and that is the whole model

The template puts a company on every row and writes almost every access rule as "does this row belong to the company the person asking belongs to". One function answers "which company is this", and every policy leans on it, which makes that function and the column it reads the most load-bearing lines in the project. Right, and the whole dashboard is correctly partitioned. Wrong once, and it is not partitioned at all.

Constrain what a row may become, not only which row you may edit

The rule to take away from this section. An update rule normally answers "may I edit this row?". It also has to answer "what may this row become?", and leaving the second half out lets somebody edit a row they legitimately own into something they should not reach. That matters most on the record saying which company a person belongs to, because it is the answer every other rule depends on. Say explicitly that the company on it may not change, and check it on the way in as well as out.

A rule named after a role has to actually check the role

The other rule worth carrying away. It is easy to write a permission whose name says "admins only" and whose condition only says "same company": the name reads correctly, the tests pass, and the restriction does not exist. Read your own rules with the names covered up and check each condition against what it should prevent. On a finance dashboard what this protects is the table of who is an admin, and a viewer who can edit that table is an admin.

92 live policies, because forty tables each need their own answer

The migrations carry 95 row-level security statements, three of which replace an earlier rule rather than adding one, so 92 are live, and almost none of the count is a history of revisions. The number is structural, not anxious: every raw table, every figures table, the settings, the roles, the audit log and the reject list each need their own answer for reading and for writing. It is also the honest measure of why this part of the build takes a fifth of the estimate.

Two roles, and the reason the boring one matters

Admin and viewer is all a single business needs, and the interesting half is the viewer: reads every figure, exports a report, changes nothing. The value of the role is entirely in what it cannot do, so test it that way: sign in as a viewer and try to import, to change the base currency, to edit the roles table. A viewer who manages any of the three is not a viewer.

Some work has to outrank the person who asked for it

Importing a file, rebuilding a month of figures and filling gaps in a rate table each touch far more rows than the person triggering them should be able to write directly. The template gives that work eight server-side functions running with a key that bypasses the ordinary rules, correct, and exactly why each has to check for itself that the caller is an admin first. A function that skips that check is a public endpoint that can rewrite last quarter.

The import bucket, done the careful way

A pattern to copy rather than a caveat: uploaded files go into a private bucket, capped in size, restricted to spreadsheet types, and scoped so each person reaches only their own folder. That is what you want, because an accounting export is a list of your customers and what they pay you. If you change one thing, do not make it public to "fix" a link. Generate a short-lived signed URL instead.

Keep the rows you rejected

When the import refuses a row, the refusal is data. The template writes those to their own table with the reason, and it belongs in this section rather than a usability one because of what silence would mean: a chart quietly missing forty invoices is a wrong number presented with total confidence. A visible reject list is the first thing to check after any import.

Log who changed which figure, and to what

The three tables that hold money (invoices, payments, expenses) carry triggers writing every insert, update and delete into an audit log with the old and new values. That is not paperwork, it is the answer to the only question that matters after a discrepancy: what did this number used to be, and who changed it. Keep the log readable to the business and writable by nothing.

Where the model key lives, and what the forecast is allowed to see

The forecast calls a hosted model, so a provider key exists, and it belongs on the server and nowhere else. Never in the app your team downloads. Then the question people skip: decide what is allowed to leave. Monthly totals are one thing. A customer list with what each owes is another. Send the smallest summary that can answer the question and write down what it contains, because "we send our finances to a third party" is a sentence somebody will eventually ask you to explain.

On the free tier, one copy is all there is

No backup is taken of your imported records, your settings or a single computed figure. Daily backups, kept for a week, start on Supabase Pro at $25/mo. Worth doing before the first month you reconcile: the imported records can be rebuilt from your accounting system, which is a comfort right up until you remember the corrections you made by hand afterwards cannot.

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 v0 checks nobody can see data they shouldn’t.

One rule outranks the rest here: the database service key and the model provider key belong on the server only: never in the app your colleagues download, and never in a repository. Either one that gets out is burned: replace it the same day, and check the audit log for what was done with it in the meantime.

Workflow rules

What speeds the build, and what slows it

Speeds the build

  • One screen per message, checked in the live preview before you ask for the next one
  • Adding a database as soon as a screen needs to remember something, so v0 wires it up as it builds
  • Clicking the thing you want changed in Design mode, rather than describing where it sits
  • One feature per chat, so its history reads as a straight line you can walk back
  • Sending a finished chat over to GitHub before starting the next feature, rather than stacking several together

Slows the build

  • Asking for the whole app in one message instead of one screen at a time
  • Building screens for data the database does not hold yet
  • Describing which button to change when you could just click it
  • Letting one chat run for weeks, so going back to an older version undoes everything built after it
  • Approving several messages in a row without looking at the preview after each one
Getting code out of the chat

Connecting GitHub (Optional)

Every change in v0 is saved automatically without any technical setup. You only need to link GitHub if you want a private copy under your own control or plan to hand the codebase over to external developers.

Every message is a version

Each time a message changes your code, v0 saves it as a new version. Restoring an older one adds it back as the newest version instead of branching, so the history stays one straight line.

Versions, v0 docs

Undo from the chat itself

Scroll back through the conversation and click the revert arrow on any earlier reply, or open the version number in the top right to jump straight to a specific one.

Connecting GitHub creates a real repository

From the chat’s Git panel, connect an existing repository or create one. v0 never writes straight to your main branch: every code-changing message is committed to its own working branch first.

GitHub integration, v0 docs

A pull request is how it gets merged

When you’re ready, publish and open a pull request from that working branch into your base branch, review it like any other, and merge it. Starting a new chat picks up a fresh branch for the next round of changes.

This can also be v0’s deploy path

If the branch your pull requests merge into is also the linked Vercel project’s production branch, merging one triggers a production deployment. If it isn’t, the merge just follows whatever branch behavior that Vercel project is already configured with.

GitHub integration, v0 docs
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 each push publishes itself, with nothing for a Vite project to configure. Settle which plan you belong on first: Hobby is licensed for personal, non-commercial use, and a dashboard your company makes decisions from is commercial however small it is, 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 onto the page and be live in a minute. Add the redirect rule it asks for: without it a link straight to the cash-flow page returns a not-found error, and a link to one page is how a dashboard gets read.Free tier
Cloudflare PagesReaders in several countriesThe app is served from wherever the person opening it is. The case for it is a board spread across countries, which is also where you should be most careful everyone is reading the same base currency.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 one sits beside a database holding what your company earns and who owes it money.Free from a public repo only
Firebase HostingTeams already on GoogleOne round of setup, then a single command per release. No argument for it comes from the dashboard itself. The argument is that your logins and documents are Google already.Free Spark tier
AWS Amplify HostingTeams already on AWSPublishes out of the AWS console, and needs the same rewrite rule for a deep link to resolve. Chosen when AWS is on the invoice already and nobody wants another supplier.Free tier (build + hosting)
SurgePublish from the terminalA single command sends the built folder online with no repository anywhere in it. Fine for walking a co-founder through the overview. Wrong for anything holding real figures.Free - unlimited publishing
DigitalOcean App PlatformDigitalOcean usersBuilds and serves inside the account you already have. One fewer supplier and invoice, which in a small company is a real argument.Free - 3 static sites, 1 GB/mo transfer

All eight serve the app well enough that speed is not the deciding question. Three others are: does the plan permit commercial use, since Vercel’s Hobby tier does not. Does it publish from a private repository, given what this code sits beside. And does a deep link resolve for a browser that has never seen your site, because the URL people share points at the page that worried them.

One thing will catch you on launch day, and it is not the host. Nothing computes a figure until a job has run over imported data, so a fresh deploy correctly shows zeros, and the first hour of production usually goes on establishing that the deploy was fine and the import had not been run.

Database & backend

Keep your data in Supabase

Your invoices, payments, expenses and bank lines, the daily figures computed from them, your rates, your settings and your uploaded files. This is also where every job that turns records into figures belongs, because each one has to outrank the person who asked for it.

ServiceBest forNotesFree tier
SupabaseData, auth, files, server jobsRecords and computed figures both live in Postgres, accounts come from its auth service, imported files go into a private bucket, and its edge functions carry the work that has to be permitted more than the person triggering it: parsing an upload, rebuilding a month of figures, filling gaps in a rate table, calling the model behind the forecast. Setting it up is 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 workflows

Where AI genuinely helps a finance dashboard

This template already calls a model in one place (the twelve-month cash-flow forecast) and that is the right place to start, because it is also the one worth being careful about. The four prompts after it add features whose numbers come from queries and whose model only does the writing.

Make the forecast explainable, or make it honest about not being

The forecast that ships is a model asked for realistic monthly figures from the history it is given: a reasonable demo, a poor basis for a hiring decision. The fix is a fork you should take deliberately.

PromptMake the forecast explainable, or make it honest about not being
The twelve-month forecast currently sends my history to a model and asks for realistic projections. Change it in two steps. First, compute a baseline in the database from my own figures (a trend over the last twelve months plus a month-of-year seasonal factor) and draw that as the forecast line, naming the method and the months it was fitted from on the chart. Second, keep the model but give it a different job: send it the computed projection and have it return a short commentary on what the shape suggests and which assumptions would break it, with no power to change a number. Label the chart so a reader can tell arithmetic on my data from a model’s opinion, in the chart, not only while it loads.

Categorise the expenses nobody wants to categorise

Every import lands with rows whose category is blank or wrong, and sorting them is the dullest recurring hour of the month. A good fit: contained, useful, and always reviewed before it writes.

PromptCategorise the expenses nobody wants to categorise
Add a screen listing imported expense rows with no category or one I have flagged as doubtful. Send the description, the vendor and the amount to my server-side ai function and get back a suggested category from my own list, plus a confidence and a one-line reason. Show them as a reviewable list I accept, change or reject in bulk, writing nothing until I do. Anything below a confidence I set stays uncategorised rather than guessing. Include recent accepted examples for that vendor so it learns from my corrections, and never invent a category that is not already in my list.

Explain the variance before somebody asks you to

The question after every number that moved is "why". The arithmetic of which lines drove a change is a query. Turning it into two sentences a non-finance colleague can read is the part worth handing over.

PromptExplain the variance before somebody asks you to
Add a "why did this move" action on any figure. Compute the answer with queries first: the top contributing categories, customers or regions behind the change between two periods, with their amounts and their share of the movement. Then send only those computed contributions (no customer names unless I turn that on) to my ai function for two or three sentences explaining the movement in plain language. Print the figures it was given underneath, state the two periods, and where the movement is mostly one row, say so rather than listing three.

Flag what looks wrong in an import before it reaches a chart

The dangerous import is not the one that fails, it is the one that succeeds with a duplicated invoice or a misplaced decimal. Statistics find the outliers. A model is useful for saying which look like mistakes rather than a good month.

PromptFlag what looks wrong in an import before it reaches a chart
After every import, run a check for rows worth a second look: amounts far outside the usual range for that vendor or customer, near-duplicate invoices, dates outside the period I said I was importing, and totals differing from last month by more than a threshold I set. Compute all of it with queries. Then send the flagged rows, without customer names, to my ai function for a one-line reason each on why it might be a mistake, and show the list with an accept or investigate action per row. Nothing is deleted or edited automatically, and the flagged count sits beside the import summary.

Ask your own books a question in plain words

Your dashboard answers the questions you had when you built it. What turns up later is "which customers got slower to pay this year", "what did we spend on contractors by quarter", "was last month bad or just short", and those should not each need a screen.

PromptAsk your own books a question in plain words
Add a panel where I ask about my own figures in ordinary words. Have my ai function turn the question into a read-only query against my computed figures tables, run it under my own access rules so it can never reach another company’s data, and use the model only to phrase the answer. Show the query it ran and the rows it used under every answer, state the period and the accounting basis, and refuse rather than guess when the question needs data I do not import. It never writes, and never answers from memory instead of from a query.

v0 doesn’t ship its own model for these prompts, so you bring an API key for whichever provider you want, and v0 writes the route that calls it. Start with a cheap model while you’re still iterating on the prompt itself, then swap in a stronger one for the version that ships, and keep every AI feature behind that one route so there’s only one key to rotate.

Ready-made option

Get a head start with our template

All three routes above start at an empty folder, which is not the only available starting line. This dashboard already exists and runs, so the months an import, the daily figures, the currency layer and a multi-company permission model would have taken become an afternoon of importing your own numbers.

Finance Dashboard

The exact finance dashboard this guide builds, packaged so you can open it, point it at your own backend, and make it yours from there. A real-time finance dashboard that puts revenue, expenses, profitability, cash flow, and receivables on one screen. You import your numbers from a CSV, work in any currency, forecast where cash is heading, and schedule the reports you need.

React 18ViteTypeScriptTailwind CSSSupabaseRecharts
Out of the box

The key benefits of starting with a template

The import validates and keeps what it rejects, the figures are computed on both accounting bases, and the currency layer admits when a rate was carried forward. That is most of the saving. Behind it the seven pages, the exports, the audit trail and two roles are done too.

Building the core from scratch

~116 hrs

Opening the template, already built

~1 hr

~115 hrs of building you skip

The two figures measure different work. Building the application yourself is the ~116 hrs. The ~1 hr covers adopting the finished one (a database of your own, a first real export imported, your base currency and accounting basis set) and it is the busiest hour of any template here, because this one shows you nothing until real data has been through it. Agreeing what your own figures mean costs the same on either path, so neither number includes it.

An import pipeline that already copes

Upload a CSV into a private bucket and a server-side function parses it, validates every row against the shape it expects, writes what it accepts into the right table and what it refuses into a reject table with the reason, so a total is never quietly short. Sample files for invoices, expenses, accounts, bank lines and rates ship with the project, which is the fastest way to see the shape yours needs.

Figures computed rather than queried per page

Five server-side jobs turn raw invoices, payments, expenses, bills and bank lines into daily revenue, expense, cash-flow, receivable and payable figures, rebuilt for whatever period you name. Revenue is computed on both bases (invoices by issue date for accrual, payments by their date for cash) and your settings carry which one the dashboard means, plus the base currency, the timezone and whether future dates are allowed.

A currency layer that admits what it guessed

A rate table with a calendar over it, and a job that fills the days a market was closed by carrying the last real rate forward, marking those rows as imputed and never overwriting a real rate with a guessed one. That flag is the part most builds skip and the part that answers every awkward question about a converted total being a few units out.

92 live access policies over a multi-company model

Everything hangs off a company, and 92 live row-level security policies decide who reads and writes each of the forty-odd tables. Two roles kept in their own table behind a security-definer check, eight server-side functions doing the work that has to outrank whoever triggered it, and the first account in a company recorded as its admin so the import works on day one. How far the roles reach is worth knowing exactly: the database enforces admin on the roles table and the accounting settings, and every other write is still company-wide, so narrowing those is a described addition. Read the security section above before you go live.

The seven pages, and the paperwork behind them

An overview of KPI cards, then revenue, expenses, profitability, cash flow, and receivables and payables with ageing and days-sales-outstanding, plus reports: downloadable profit-and-loss, balance-sheet, cash-flow and tax-summary packs as PDF or CSV. Saved filter segments, global search, and audit triggers on invoices, payments and expenses recording the old and new value of every change.

A codebase your AI tool can keep extending

Types on everything, hooks grouped by what they query, folders named after features rather than file extensions, and comments wherever the reasoning would not survive a cold read, including on the parts that need them most, the parser and the jobs. The figures layer is where that pays off: a new definition of margin is the change you are most likely to want, and the existing ones show where a definition belongs.

Customer story

From founders who build on our templates

As an agency we live or die by clean handoffs. The code is structured well enough that we restyle, wire in the client’s data, and ship - no untangling someone else’s mess.
Matt GrahamMatt GrahamFounder & CEO, RapidDev
Got questions?

Common questions

It reads a CSV you export, and that is the first thing to know before comparing it with anything. There is no live connector to an accounting system: you export invoices, payments, expenses, bank lines and rates, upload them, and a server-side function validates and loads them. Sample files ship with the project so you can see the shape expected. A live connection to a specific system is a well-defined addition, and the one most people want second, after a month of their own numbers has actually landed.

They go into a reject table with the reason, and you can look at them, which is more important than it sounds. A dashboard quietly missing forty invoices is not a partly-working dashboard, it is a wrong number presented confidently. Check the reject list after every import as a matter of habit. Most entries are a date format or a column that got renamed in your accounting system, and both are five-minute fixes once you can see them.

As it ships, a language model produces it: the history goes to a hosted model asked for realistic monthly figures, and what comes back is twelve months of plausible numbers rather than arithmetic on your data. It is labelled while loading and not on the finished chart. Treat it as a demo rather than a planning tool, and if you will make decisions from a forecast, the first AI prompt above replaces it with a projection computed from your own figures, keeping the model for the commentary where being fluent is the actual job.

Yes, properly, which is rarer than it sounds. You set a base currency, records keep the currency they were written in, and a rate table with a calendar over it does the conversion. The part worth knowing is what happens on days with no rate. Weekends, holidays, the day you happened to invoice: a job carries the last real rate forward and marks those rows as imputed, so a converted total can say which part of itself was estimated. A real rate is never overwritten by a guessed one.

Whichever you set, and it computes both. Your settings carry a basis, and revenue is worked out from invoices by issue date for accrual and from payments by their date for cash. That matters most if you invoice on terms, because the same month can look strong on one basis and thin on the other, and the gap is what the receivables page exists to measure.

No, and this is the second thing to know before you compare it. You can configure a schedule (a report, a frequency, a next run date, recipients, a format) and nothing delivers it, because no mail provider and no timer exist anywhere in the template. Downloading on demand does work: profit and loss, balance sheet, cash flow and a tax summary as PDF or CSV, plus a bulk export. Connecting an email service and something to run the schedule is a small addition, and the first one most businesses want.

No, and the import is the half an AI coding tool helps with most, because it is tedious rather than clever. Describe your export (its columns, its date format, how it writes a credit note) and back come the tables, the parser, the validation, the reject table, the jobs turning records into daily figures, and the rules deciding who may see them. Your share is opening a free Supabase project and getting one real export to point it at.

Yes, and the second half deserves a precise answer rather than a reassuring one. Sign-in comes with two roles, and the first account in a company is its admin. What the database enforces is that only an admin may import, rebuild the figures, change the accounting settings, or decide who else is an admin. What it does not yet enforce is the rest: a viewer can still write a financial record directly, because the interface has no notion of a role, so tightening those rules without a matching pass over the screens would turn ordinary actions into silent failures. Closing it is a described addition. Either way, test a viewer by trying things with it rather than reading the code.

Yes. Every record hangs off a company and the access rules are written around that, which is what makes it suit a group or a practice with clients. Two things before you load anything real. Read the security section above, because the rules deciding what one company can see are the most load-bearing lines here. And test the separation bluntly: two companies, two accounts, and a deliberate attempt to reach the wrong one.

Three lines rather than the usual two: somewhere to hold the data and somewhere to serve the app, both with free tiers, plus the model the forecast calls, usage-based, and the only line here that is not optional out of the box. Once you are reading real figures, the upgrade worth making is Supabase Pro from $25/mo, mostly to stop the pause, since a free project sleeps after a quiet week and a dashboard read monthly is exactly the sort that goes quiet. Nothing on that bill moves when you add a company, a page or a reader.

Nothing here is proprietary, and this template is unusual in having two ways out: your records and computed figures sit in plain PostgreSQL tables any Postgres host accepts from a standard dump, and the reports download as PDF or CSV. Worth remembering where the real lock-in in this category lives, though. Not the data, the definitions. What your business counts as revenue, on which basis, at which rate. Those are in your own code here, in writing.

Yes, and worth doing early. Every host above attaches a domain in a few clicks with HTTPS included. There is a second reason beyond tidiness here: the link you send somebody is a link to your company’s finances, and an address on your own domain is part of how they know it is really yours.

No. You describe the screen you want in the chat and v0 generates the React and Next.js code behind it. Sign up, pick a plan, and connect a database once your screens need real data. The setup section above walks through each one.

Both, but not automatically at the same time. v0 generates the interface first. The backend (a database and the API routes that use it) is something you ask for once a screen actually needs to save or load real data.

Free plan credits reset monthly, and the 7-messages-a-day cap resets every day. If you hit either limit mid-build, what you’ve already built stays put. You wait for the reset or move up to Plus to keep going right away.

References

Sources checked August 2026
  1. 01CFO trust in financial data (BlackLine survey, Censuswide, 1,300+ respondents, January 2024). prnewswire.com (survey published January 2024)
  2. 02Pricing (per-company tiers, unlimited users, AUD), Fathom. fathomhq.com
  3. 03Pricing (per-dashboard tiers, refresh rates, unlimited users), Klipfolio. klipfolio.com
  4. 04Pricing (per-data-source model, free-tier limits), Databox. databox.com
  5. 05Pricing (flat monthly tiers, one company active at a time), LivePlan. liveplan.com
  6. 06Pricing (two “starting at” figures, no stated unit), Jirav. jirav.com
  7. 07Pricing (Pro plan, free-tier limits, project pausing), Supabase. supabase.com
  8. 08Web developer hourly rates 2026 (freelance and agency benchmarks). developex.com
  9. 09Row Level Security, Supabase docs. supabase.com
  10. 10Storage access control, Supabase docs. supabase.com
  11. 11Edge Functions secrets and environment variables, Supabase docs. supabase.com
  12. 12v0 homepage. v0.app
  13. 13Pricing (Plus, Business), v0. v0.app
  14. 14Pricing details (Free tier, credit rollover), v0 docs. v0.app
  15. 15Databases (connecting Supabase and others), v0 docs. v0.app
  16. 16Full-stack apps, v0 docs. v0.app
  17. 17GitHub integration, v0 docs. v0.app
  18. 18Deployments, v0 docs. v0.app
  19. 19Design mode, v0 docs. v0.app
  20. 20Versions, v0 docs. v0.app
  21. 21Pricing (Hobby plan), Vercel. vercel.com

This guide is general information, not accounting, tax or financial advice. What you may report, on which basis, and how long you must keep a record of it vary by country, and a figure on a dashboard is not a filed return, so check with somebody qualified before you rely on one. 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. v0 is a product of Vercel. Verify current capabilities and pricing before relying on them.