How to build a finance dashboard with Lovable
Stop paying monthly software fees just to view your own business numbers. Download our ready-to-use finance dashboard, and let Lovable 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.
Lovable
$ I want my own finance dashboard: import my accounting export by CSV and tell me which rows failed, work out revenue, expenses, profit, cash flow and what I am owed, convert everything into one currency, show me how long people take to pay, and let some people read it without being able to change anything.
- Tables designed in chat
- Real export imported and checked
- Ready to preview
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
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.
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.
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.
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.
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.
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.
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.
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 · JiravWhat 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
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
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
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
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
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.
Why build with Lovable
A working app needs more than screens: something has to store what people enter, decide who may see it, and reject what does not make sense. That part is where a solo build stalls, not the parts a user sees.
Lovable turns that work into a conversation: describe a screen or a rule in plain language and watch it appear in the live preview, in the same tab:
Prompt
Say what you want to add or change, in plain language.
Watch
The live preview rebuilds in the browser as Lovable writes the code.
Try it
Click through the real app, with real buttons, forms and data rather than a mockup.
Refine
Select what’s off and describe the fix, or ask for what’s next.
None of that requires a computer science background or writing code, and the whole build happens in one browser tab, one request at a time.
Data & backendhandled automatically
Connect your database in a single step, right from the chat. Lovable builds the tables, sets up the logins, writes the server-side functions, and turns on live updates, each one an ordinary request in plain language, not a separate tool to learn.
Click to point instead of describing where
Select any element in the live preview with Lovable’s Select elements tool, and your next message applies to exactly that piece.
Full ownership and complete privacy
The app and the records in it are yours. Every change is saved automatically, and the repository Lovable syncs to GitHub is private on every plan, with no technical setup and not one Git command.
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 Lovable
From scratch, with Lovable- Lovable
- Free (30 credits/mo) to $25+/month (Pro, from 100 credits)
- Backend (Supabase)
- Free tier · $25/month (Pro plan)*
- Hosting
- $0 on a Lovable subdomain
- Your time
- ~116 hrs
Free to try the idea, ~$25-$50+/month on Pro while you build a real one, then whichever credit tier you keep using
Lovable bills by credits, so what you pay tracks what you build: importing the pre-built template can fit inside the Free plan’s 30 credits a month, while a full from-scratch build burns through Free fast and usually needs Pro. Pro’s entry rung is $25/month (or $250/year, roughly $21/month effective) for 100 credits, the bottom of a ladder where 200 credits runs $50/month (or $500/year, about $42/month), and a multi-session build often lands on that rung or higher rather than the entry price.
* 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 and docs.lovable.dev, checked August 2026.
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.
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.
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.
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.
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.
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.
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.
Comparing your build options
A dashboard is easy to make look right and hard to make true, and where you start decides which one you get first. Three routes to the same place: entirely by hand, on a UI kit that hands you KPI cards and stops, or in one Lovable chat where the tables and the screens are designed together. A fourth beats all three. The ~116 hours below are already behind the template.
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.
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.
A browser tab and one message at a time. The tables, the import behind them, the jobs that compute each figure and every chart above them all get designed in a single conversation, with a live preview you can import a real file into before asking for the next thing.
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.
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.
Let’s set up the tools you need
Nothing gets installed, because the whole workspace is a browser tab. Three things to sort out before step 01, and a fourth worth adding once the project matters to you. After that, you build by describing what you want.
Lovable account
Nothing to download. Sign up with an email, Google, or GitHub account and you land straight in the chat where you describe what to build.
Sign up for LovableLovable subscription
Lovable bills by build credits, so the plan you need follows what you build. Free gives you 5 credits a day, capped at 30 a month, which is enough to try it rather than to finish an app. Pro is $25/month for 100 credits ($250/year, about $21/month), and that is the bottom rung: a build spread over several sessions usually lands on 200 credits at $50/month, or higher.
Compare Lovable plansSupabase project
Where your app keeps its data. Connect your own Supabase project from the chat, or let Lovable create one for you. Either way it designs the tables, adds the logins, and wires the screens to them from there.
Connect Supabase to LovableGitHub connection
Not needed to build anything, since Lovable keeps its own history of every change. Link a GitHub account and it also keeps a private repository in sync, so a copy of the real code exists outside the browser tab. Worth doing before the project is one you would hate to lose.
Set up GitHub syncOnly the first three are needed to start, and none of it touches your computer. From here, you describe what you want and Lovable builds it in the browser.
Build your finance dashboard, prompt by prompt
Nothing installs. You describe a piece, Lovable builds it, you click through the preview, and you ask for the next one. The order below is shaped by one awkward fact: a live preview is a flattering judge of this particular app, because a chart drawn from sample data looks exactly like a chart drawn from your data. So your own export goes in early, and the figures get checked against your own books rather than against how they look.
- 01
Attach the database before you ask for a single chart
Any dashboard designed over data that does not exist yet gets rebuilt the day it does. Connect the database first, and put the two rules this build rests on into the conversation while it is still short enough for them to hold.
PromptSet up the projectConnect my Supabase project before building any screens at all. Then set up a finance dashboard, and hold two rules for the rest of this project. First: every figure on screen is worked out from records, on a stated accounting basis and at a stated exchange rate, and anything estimated or carried forward stays marked as such right through to the card. Never a hardcoded number, and never a figure the screen cannot explain. Second: every row belongs to a company, the company a person belongs to decides what they can see, and so it is never a value that person is allowed to change. Use these words consistently: company, invoice, payment, expense, bank line, daily figure, basis, base currency, rate, reject, role. Confirm the connection is live, then tell me which of those two rules changes how you will design the settings and the rate tables, before you design them.
That closing question earns its extra exchange. It is the cheapest way to find out now whether the model Lovable has in mind keeps a rate per currency per day with a flag on it, or plans to convert on the fly with whatever rate is handy, and only one of those two can answer a question about a total six months from now.
- 02
Design the tables, with a company on every one of them
The one step where getting it right is worth more than getting it visible. Everything you build afterwards reads what you settle here.
PromptModel the company and the recordsDesign the tables, with no sign-in yet, and put a company on every single one 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 for payables. Bank lines with a date, an amount and a direction. A rate table keyed by currency and date with a flag for whether the rate is real or carried forward. A settings table per company holding the accounting basis (accrual or cash), the base currency, the timezone, and whether future dates are allowed. Add empty tables for the daily figures we will compute later: revenue, expenses, cash flow, receivables and payables, by company and date. Then add sample data for two companies, deliberately awkward: one invoicing in three currencies, one with invoices paid sixty days late.
Bookmark the version once these tables exist, before anything reads them. Changing the shape of the rate table or the settings row later is the change in this build that touches every figure at once, and remember that restoring code in Lovable does not roll back your database, so a bookmark and a clear decision are worth more here than anywhere else.
- 03
Import your own file, and look at what it refused
Export a real month out of your accounting system before this message. The interesting part of this step is not the upload, it is the list of rows that would not go in.
PromptImport a real fileBuild the import. A private storage bucket restricted to CSV, scoped so a person can only reach their own folder. A server-side function that parses an uploaded file, validates every row (required fields present, dates parseable and inside a period I state, amounts numeric, currency known, no exact duplicate of an existing record), writes the rows that pass into the right table, and writes every row that fails into a rejects table with the line number and the reason. Nothing is dropped silently. Then a screen where I upload a file, watch it process, and see the accepted count beside the full reject list. I am going to upload a real export from my accounting system, so before we start, tell me what column names and date format you are expecting and what you will do with a row you only half understand, and after the import, show me the sum of accepted invoice amounts so I can check it against my own books.
Ask what it will do with a half-understood row before you upload anything. The tempting behaviour (fill in a sensible default and carry on) is the one thing that makes a finance dashboard confidently wrong, and it is much easier to rule out in advance than to detect afterwards.
- 04
Ask for the figures as jobs, not as chart queries
A preview cannot show you that a total is wrong, because a wrong total looks like a number. Ask for the arithmetic explicitly and check one month against something you already trust.
PromptCompute the daily figuresBuild the figures as server-side jobs that rebuild a period I name, rather than as logic inside a screen, and treat this as the most important message in the project. Revenue from invoices by issue date for the accrual basis and from payments by their own date for the cash basis, 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 everything into my base currency at the rate for that record’s own date. Where no rate exists for that date, carry the last real rate forward and mark the resulting figure as partly estimated, and never overwrite a real rate with a carried-forward one. Then show me two things by running them: the working for one specific month: which records fed each figure, on which basis, and how many conversions used a carried-forward rate, and both the accrual and cash totals for that month side by side.
Bookmark before you send this one too. The figures are the message most likely to take two or three goes, and coming back to a version you know produced a correct month beats untangling a half-changed set of jobs when you no longer remember which total was the right one.
- 05
Two roles, and the rule about what a row may become
Your figures are now in a database, and the two things that matter are that another company cannot see them and that a reader cannot change them. This is the step where a preview is least able to reassure you.
PromptAdd auth, roles, and the access rulesAdd email-and-password sign-up, login, logout, a persisted session, and a profile row per account carrying the company it belongs to. Add two roles (admin and viewer) in their own table rather than on the account record, with a security definer function to check a role. Then turn on row-level security across every table, and do two things deliberately rather than quickly. One: every rule scopes rows to the person’s company, and the rule that lets somebody update their own profile must carry an explicit with-check forbidding a change to which company it points at. Which row you may edit and what that row may become are different questions, and this column is what every other rule depends on. Two: any rule meant to be admin-only has to check the role in its condition and not merely in its name, and that matters most on the roles table itself, because a viewer who can write it is an admin. Beyond that: only an admin may write records, change settings or run the import and figure jobs. A viewer reads everything and writes nothing. Each server-side job checks the role itself, since those run with a key that bypasses these rules. Then, in the preview with a second account, show me five things: the other company’s invoices are unreachable, its figures are unreachable, a viewer cannot add an expense, a viewer cannot change the base currency, and an account cannot move its own profile to another company.
Ask for those five as things you click rather than a summary of the rules. The last one especially: it is a perfectly ordinary profile edit right up to the final clause, which is exactly why it survives every test somebody thinks to write and why it is the one to watch fail with your own eyes.
- 06Destination
The pages, an honest forecast, and a month reconciled
The seven pages, the exports, the audit trail, and then the part that decides whether any of it gets used: checking a month against your accounting system.
PromptBuild the pages, the forecast, and reconcileFinish the app. The pages, all reading the computed figures rather than the raw records: an overview of KPI cards. Revenue with filters that drill down to the rows behind a total. Expenses by category. Profitability with the margin definition printed beside it. Cash flow with a running balance. Receivables and payables with ageing buckets and days-sales-outstanding. A reports page with downloadable profit-and-loss, cash-flow and expense packs as PDF and CSV. Put the accounting basis and the base currency on every page, and mark any total that used a carried-forward rate. Then the forecast: project the next twelve months from my own 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 you want a model involved, it may write one sentence of commentary and may not change a number. Then audit triggers on invoices, payments and expenses recording old and new values. Finally, reconcile with me in the preview: 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 anything in the rejects table.
The version that reconciles is the one to bookmark, before a domain or anything else touches it. It is your last recorded point where a real month came out right, and on this application that is a much more meaningful checkpoint than a version where everything merely renders.
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.
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 Lovable 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.
What speeds the build, and what slows it
Speeds the build
- One small request per message, such as a field, a screen or a rule, rather than the whole app at once
- Connecting your database before building screens that need real data, not after
- Using Select elements to point at the exact thing that should change, instead of describing its location in words
- Bookmarking a known-good version before a redesign or a change to the data model
- Reading each response before sending the next request, so small mistakes don’t stack up
Slows the build
- Asking for an entire app in one message instead of one screen at a time
- Building screens for data your database does not hold yet
- Describing which button or section to change instead of selecting it
- Skipping bookmarks, then scrolling far back through history to undo a bad change
- Approving several messages in a row without previewing what actually changed
Connecting GitHub (Optional)
Every change in Lovable 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.
What Git actually is
A recorder for a project: every change becomes a version you can go back to, and nothing is ever overwritten. GitHub is the service that keeps those versions online.
Lovable already saves every change
A new version is created each time Lovable changes your project. No save button, no Git command, and the full history is there to scroll back through.
Version history, Lovable docsReverting undoes the code, not your data
One click restores an earlier version of your code and redeploys it, but nothing already written to your database rolls back with it. A UI or logic change is safe to undo. A change that touched real records is not.
Bookmark before a big change
Before a redesign or a change to your data model, bookmark the version you are on: one click back instead of a long scroll through history.
Connecting it, if you want to
Open your project settings, pick GitHub, and authorise the account. Lovable creates a private repository and keeps it in sync both ways: changes in Lovable reach GitHub, and anything pushed to that branch comes back in. Free on every plan.
GitHub integration, Lovable docsIt’s also how you leave, if you ever want to
The synced repository is a standard Vite and React project: clone it, hand it to a developer, or deploy it yourself.
Deployment, hosting, and ownership, Lovable docsWhere 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).
| Host | Best for | Notes | Free tier |
|---|---|---|---|
| LovableBuilt in | Publishing from the chat | The project you have been previewing publishes itself, with nothing to configure and no account to open anywhere else. Free on any plan at a lovable.app address. Paid plans put it on your own domain: buy one through Lovable and the DNS is done for you, or point one you already own at it using the two records the setup screen shows. Certificate issued automatically either way. | Free on a lovable.app subdomain · own domain on paid plans |
One button, and the app you have been previewing is live.
Hosting it somewhere else
Only for a setup Lovable does not offer: a host you already pay for, or the exported code on your own account. None of it is needed to go live.
| Host | Best for | Notes | Free tier |
|---|---|---|---|
| Vercel | One-click deploys | Connect 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) |
| Netlify | Drag-and-drop or Git | Connect 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 Pages | Readers in several countries | The 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 Pages | Not really this app | Free 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 Hosting | Teams already on Google | One 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 Hosting | Teams already on AWS | Publishes 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) |
| Surge | Publish from the terminal | A 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 Platform | DigitalOcean users | Builds 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.
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.
| Service | Best for | Notes | Free tier |
|---|---|---|---|
| Supabase | Data, auth, files, server jobs | Records 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 |
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.
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.
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.
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.
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.
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.
You bring no key and pick no provider: Lovable manages an API key per project, and if you do not name a model it chooses one from what you describe. Match the model to the job: fast and cheap for anything that runs on every record, stronger only where the reasoning matters. Send every feature above through that one integration.
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.
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.
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 GrahamFounder & CEO, RapidDevCommon 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. Everything happens in a browser tab: you describe what you want in the chat, and Lovable writes and previews the code. The setup section above covers the handful of things you connect first: an account, a plan, and your own Supabase project.
A sketch on the Free plan is fine for testing an idea, with no real backend behind it. A project connected to your own Supabase account is the one you can actually launch, with real logins, real data, and your own domain.
Build credits reset every day (Free) or on your billing cycle (paid plans). If you run out mid-session, the app you’ve built stays exactly as it is. You either wait for the reset or move up a credit tier to keep going right away.
References
Sources checked August 2026- 01CFO trust in financial data (BlackLine survey, Censuswide, 1,300+ respondents, January 2024). prnewswire.com (survey published January 2024)
- 02Pricing (per-company tiers, unlimited users, AUD), Fathom. fathomhq.com
- 03Pricing (per-dashboard tiers, refresh rates, unlimited users), Klipfolio. klipfolio.com
- 04Pricing (per-data-source model, free-tier limits), Databox. databox.com
- 05Pricing (flat monthly tiers, one company active at a time), LivePlan. liveplan.com
- 06Pricing (two “starting at” figures, no stated unit), Jirav. jirav.com
- 07Pricing (Pro plan, free-tier limits, project pausing), Supabase. supabase.com
- 08Web developer hourly rates 2026 (freelance and agency benchmarks). developex.com
- 09Row Level Security, Supabase docs. supabase.com
- 10Storage access control, Supabase docs. supabase.com
- 11Edge Functions secrets and environment variables, Supabase docs. supabase.com
- 12Sign up, Lovable. lovable.dev
- 13Subscription plans (Free, Pro, Business), Lovable docs. docs.lovable.dev
- 14Connect Supabase, Lovable docs. docs.lovable.dev
- 15GitHub integration, Lovable docs. docs.lovable.dev
- 16Deployment, hosting, and ownership, Lovable docs. docs.lovable.dev
- 17Version history and reverting, Lovable docs. docs.lovable.dev
- 18Preview toolbar (Select elements), Lovable docs. docs.lovable.dev
- 19AI features and model selection, Lovable docs. docs.lovable.dev
- 20Custom domains, Lovable docs. docs.lovable.dev
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. Lovable is a product of Lovable Labs. Verify current capabilities and pricing before relying on them.