Build with AI

How to build a finance dashboard with Replit

Stop paying monthly software fees just to view your own business numbers. Download our ready-to-use finance dashboard, and let Replit 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 · 58 min read · Updated September 2026

Replit

$ Build a finance dashboard: import my accounting CSV with every row validated and the failures kept, compute daily revenue, expense, cash-flow and receivables figures on an accrual or cash basis, convert into one base currency and flag carried-forward rates, show KPI cards, charts and DSO, and give me an admin who imports and a viewer who only reads, with a Postgres database in this workspace.

  • Postgres provisioned in the workspace
  • Real export imported and checked
  • Ready for you to review
You describe it, Replit 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 Replit

A real app needs somewhere durable to keep what people enter, rules about who’s allowed to see it, and a place to actually run once it’s built. Those are three separate problems, and most solo builds solve them badly, or not at all.

Replit’s Agent handles all three from one chat, in the same workspace the app ends up living in:

The build loop
1

Describe

Tell the Agent what to build, in plain language.

2

Watch

It writes the code, sets up the database, and shows the app running live.

3

Try it

Use the real app in the preview rather than a mockup.

Publish

Take it live on Replit’s own hosting, or ask for the next change.

Loop back to Describe

The build and the place it ends up running are the same workspace throughout, so there’s no separate hosting account to set up later.

One workspacebuilds, runs, and hosts it

Replit is the one tool here that also deploys what it builds. Publishing takes the same project live on Replit’s own infrastructure, with a working domain, uptime monitoring, and security scanning included.

Managed Postgres with 20GB included free

Ask the Agent to add a database and it creates the schema and wires your app to it. What you get is a real, fully-managed SQL database rather than a mocked one.

Up to 10 Agent sessions in parallel (Pro)

Core allows up to 2 parallel Agent sessions and Pro allows up to 10, so more than one part of the app can be worked on at the same time.

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 Replit

From scratch, with Replit
Replit
Free (daily credits) to $25/month (Core) or $100/month (Pro)
Database (built-in Postgres)
Free to start · 20GB included
Hosting (Replit Deployments)
Billed separately, on top of the plan
Your time
~116 hrs

Free to try the idea, ~$25-$100/month on Core or Pro while you build a real one, then whichever plan (plus any deployment cost) you keep using

Replit’s plan price and its credit grant are the same number, not a subscription plus a separate credit purchase: Core is $25/month for $25 of monthly credits (or $20/month billed annually), Pro is $100/month for $100 of monthly credits (or $95/month annually). Once you publish, Replit bills hosting through its own Deployments separately, on top of whichever plan you’re on. Budget for it as a second line, not folded into the $25 or $100.

* 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 replit.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

The same product three ways below, and the difference is how much of your time the invisible middle takes: an import that survives your real export, figures somebody can reconcile, and rules about who may change one. By hand, on a UI kit with nothing behind the cards, or through the Agent in a workspace that also ends up hosting the result.

~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 Replit

One request at a time to the Agent, with the Postgres, the server and every page written inside the workspace that ends up hosting them. Two jobs land on your own server here that sit elsewhere on the other tools: telling the database who is asking, and running the rebuild of your figures on a timer once you would rather not press a button.

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

Replit runs entirely in the browser, and it’s the one tool here that also hosts what you build, so no GitHub account is required first. Before step 01: an account and a plan. A database comes later, the moment your app actually needs one, and GitHub whenever you want a copy of the code outside Replit.

1

Replit account

Cost: Free

Sign up and you land in a workspace with an Agent chat, the code, and a live preview side by side, with nothing to install.

Sign up for Replit
2

Replit subscription

Cost: Free (daily credits), then $25/month (Core) or $100/month (Pro)

Starter’s free daily credits are enough to try an idea, not to finish one. Core is $25/month billed monthly, or $20/month billed annually, for $25 of monthly credits and up to 2 parallel Agent sessions. Pro is $100/month monthly, or $95/month annually, for $100 of monthly credits, more collaborators, and access to the strongest available models. The price you pay and the credits you get are the same number on both plans, so you have no separate subscription-plus-credits split to work out.

Compare Replit plans
3

Replit database (Postgres)

Cost: Free to start · 20GB included

Every Replit app includes its own managed Postgres database with 20GB of free storage. Ask the Agent to add one and it creates the schema and connects your app to it, with no separate account to create anywhere else.

Replit’s built-in database, Replit docs
Optional
4

GitHub connection

Cost: Free

Not needed to start, and not needed as an undo either, because Replit checkpoints the whole workspace as the Agent works. Connect a repository from the Git pane, free on every plan, and a copy of the real code lives outside Replit under your own account. Worth doing once the project is one you would hate to lose.

Using the Git pane, Replit docs

The first two are all you need to start. Everything here stays inside the one browser tab, the app included once you publish it, and the GitHub copy is the one deliberate exception.

Step by step

Build your finance dashboard, one Agent message at a time

You describe a piece, the Agent writes it, and a checkpoint is taken so a bad change is a click back. Two things shape the order. Your real accounting export arrives at step 03, before a chart, because a dashboard over invented figures gets rebuilt the day real ones land. And the access rules need something extra on this tool: with no hosted identity service, your own server has to declare who is asking before any policy can act on it, which is why step 05 is longer here than it looks.

  1. 01

    App, Postgres and the ground rules, in one message

    The Agent can create the app and provision Postgres beside it in the same breath. Spend the rest of the message writing down the two rules the build leans on.

    PromptSet up the project
    Create a new React 18 + Vite + TypeScript app with Tailwind and its own server, and add a Postgres database to this workspace. Keep the database connection string in Secrets, never in anything the browser downloads. Then write a short PROJECT_NOTES.md fixing the vocabulary for a finance dashboard (company, invoice, payment, expense, bank line, daily figure, basis, base currency, rate, reject, role) and recording two standing rules for the rest of this build. First: every figure shown is derived from records, on a stated accounting basis and at a stated rate, with anything estimated or carried forward flagged all the way to the card, and never a hardcoded number. Second: every row belongs to a company, the company a person belongs to decides what they may see, and it is never a value that person can change, and because this workspace has no hosted identity service, my own server is what declares who is asking and which company they are in before any request touches a table, so every policy is written to read that declaration. Start the app so I can see it boot.

    That second rule carries more weight here than on the other tools. Nothing is going to hand the database a company on your behalf, and a policy that reads a declaration nobody made does not complain. It admits everybody, and what it admits everybody to is every company’s books in the workspace.

  2. 02

    The schema, with a company on every table, at a checkpoint

    Nothing is displayed yet, which makes this the cheap moment to discover your own records need a field nobody thought of. Take a checkpoint once you are happy.

    PromptModel the company and the records
    Write the data model in the workspace Postgres, with no sign-in yet and 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 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 a rate is real or carried forward. A per-company settings table holding the accounting basis, base currency, timezone and whether future dates are allowed. Empty daily-figure tables for revenue, expenses, cash flow, receivables and payables. Seed two companies with deliberately awkward data: one invoicing in three currencies, one with invoices paid sixty days late. Before you write any of it, tell me how a rate lookup will handle a date with no rate, and how a partial payment against an invoice will be represented.

    Answer those two, then take a checkpoint. A rollback here restores the files, the configuration and optionally the database together, which is broader than a code-only undo and exactly what you want at the one point where changing your mind means changing the shape of every figure downstream.

  3. 03

    Import your real export, into object storage and Postgres

    Export a real month out of your accounting system before this message. The file you have is the specification for the hardest part of this build.

    PromptImport a real file
    Build the import. Uploaded files go into object storage rather than a table, kept private and reachable only through my own server, restricted to CSV, and scoped so a person can only reach their own uploads. A server route 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), inserts what passes into the right table, and writes every failure into a rejects table with the line number and the reason. No row is dropped silently. Then a screen where I upload, watch it process, and see the accepted count beside the full reject list. A real CSV export from my accounting system is in the workspace: read it first and tell me what you found before writing the parser: column names, date format, how negatives and credit notes appear, and any total rows at the bottom. Then run it and give me the sum of accepted invoice amounts.

    Check that the upload route is the only way to reach a stored file. An accounting export is a list of your customers and what they pay you, and on a tool where your own server is the gatekeeper, "private" means "my server refuses" rather than a setting somewhere else.

  4. 04

    The figures in Postgres, and a job you can put on a timer

    The arithmetic this application is made of, and the first place on this tool where it is worth asking what should run without anybody pressing anything.

    PromptCompute the daily figures
    Build the figures as Postgres functions invoked by a server route, each rebuilding a period I name rather than appending. 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 every amount into my base currency at the rate for that record’s own date. Where no rate exists, carry the last real rate forward, mark the resulting figure as partly estimated, and never overwrite a real rate with a carried-forward one. Then print the working for one specific month: which records fed each figure, on which basis, how many conversions used a carried-forward rate, and both totals side by side. Finally, tell me which of these jobs I would want running on a schedule rather than on a button, and what that means for how I publish this app.

    Ask that last question now rather than at publish time. Rebuilding figures and filling rate gaps are the two things here that want to happen overnight instead of when somebody remembers, and on this tool that is a separate deployment type rather than a database feature, much easier to plan for than to retrofit.

  5. 05

    Sessions your server issues, and policies that read them

    Two halves that only work together on this tool: sessions your own server issues, and policies written to trust what that server declares about which company is asking.

    PromptAdd auth, roles, and the access rules
    Add email-and-password sign-up, login, logout, sessions my own server issues and verifies, and a profile row per account carrying its company. 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 row-level security on every table, and because nothing hosted is handing Postgres an account or a company here, have my server declare the requesting account, its company and its role before each request touches a table, and write every policy to read that declaration. Two things to do deliberately. One: every policy scopes rows to the declared company, and the rule allowing somebody to update their own profile 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 rule resolves to. Two: any rule meant to be admin-only checks the role 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 runs the jobs. A viewer reads everything and writes nothing. Then prove six things with a second 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, an account cannot move its own profile to another company, and a request arriving with no declaration at all is refused rather than treated as trusted.

    That sixth check is specific to this tool and it is the one to be stubborn about. A policy reading a declaration nobody made fails open rather than loudly. Ask the Agent to show you a request with the declaration deliberately missing, and watch it be refused before you put a single real figure in.

  6. 06
    Destination

    The pages, the forecast, reconciling, and publishing

    The seven pages, the exports, the audit trail, a month checked against your own books, and only then a release, of two things rather than one.

    PromptBuild the pages, the forecast, and reconcile
    Finish the app. The pages, all reading the computed figures rather than raw records: an overview of KPI cards. Revenue with filters that drill 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. Show the accounting basis and base currency on every page, and mark any total that used a carried-forward rate. Then the forecast: twelve months projected from my own figures with a trend and a month-of-year seasonal factor, the method and the months fitted named on the chart, and any model restricted to a sentence of commentary that cannot change a number, with its key in Secrets. Then audit triggers on invoices, payments and expenses recording old and new values. Then reconcile with me on one real month against my accounting system, accounting for every difference including the rejects table. Finally, tell me which deployment type the app needs, what the overnight rebuild of figures needs instead, and what Publishing is about to make visible and to whom.

    Ask that last question before you press publish rather than after. This build wants two releases (the app people read, and the overnight job that keeps the figures current) and reviewing who the app is visible to is a setting most people meet for the first time after the address is already in somebody else’s hands.

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. On this tool a third thing applies, because the only thing able to tell the database who is asking is your own server.

Logins your server owns

Sign-in is built into the app rather than delegated to a hosted identity service, so sessions live on your own server. On this application, add one thing to that: for any account that can import or correct figures, put a second factor in front of it. The account that can rewrite what last quarter earned deserves more than a password.

Where the checking actually happens

What Replit provisions is ordinary Postgres, so its policies behave the way Postgres policies always behave. What differs is the source of identity. Nothing hosted is handing the database an account id here, so the Agent has your own server announce who is asking (and, on this application, which company they belong to) before each request touches a table, then writes every policy to read that announcement. Miss it and the policies do not complain. They admit everybody, and what they admit everybody to is every company’s accounts in the workspace.

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

A company goes on every row, and almost every access rule reduces to "does this row belong to the company the person asking belongs to". That is the right shape, and it means one declaration and the column behind it are the most load-bearing lines in the project: right, and the 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 whatever record says which company a person belongs to, because that record 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 on the way 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 is supposed to prevent. On a finance dashboard the thing 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 policies are live, and almost none of the count is a history of revisions. The number is structural: every raw table, every computed figures table, the settings, the roles, the audit log and the reject list each need a separate 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 genuinely all a single business needs, and the interesting half is the viewer: reads every figure, exports a report, and cannot import, correct or change a setting. 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, try to change the base currency, try to edit the roles table. A viewer who can do any of the three is not a viewer.

Some work has to outrank the person who asked for it

Parsing an upload, rebuilding a month of figures and filling gaps in a rate table all touch far more rows than the person triggering them should be able to write directly. That is server-side work carrying the rule in its own code, above the access rules, and it has to check for itself that the caller is an admin before doing anything, because a job that skips that check is a public endpoint that can rewrite last quarter. The database connection it runs with belongs in Secrets, never in anything the browser downloads.

The import store, done the careful way

Uploaded files go into object storage, private, reachable only through your own server, restricted to spreadsheet types and scoped per person. That is what you want, because an accounting export is a list of your customers and what they pay you. If a link needs sharing, generate a short-lived one from the server rather than making anything public to "fix" it.

Keep the rows you rejected

When the import refuses a row, the refusal is data. Write those to their own table with the reason, because the alternative is silence, and a chart quietly missing forty invoices is a wrong number presented with total confidence. A visible reject list is how a dashboard earns the right to be trusted, and it is the first thing to check after any import.

Log who changed which figure, and to what

Triggers on the three tables that hold money (invoices, payments, expenses) write 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 may see

If your forecast calls a hosted model, the provider key goes in Secrets and nowhere else. Never in the app your colleagues download. Then the question people skip: decide what is allowed to leave. Monthly totals are one thing. A customer list with what each of them 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.

Backups, and how far back you can go

The Agent checkpoints as it works (files, configuration and optionally the database) so a bad change is a click back rather than an afternoon. Pro adds a 28-day database rollback on top. Worth having before the first month you reconcile, because the imported records can be rebuilt from your accounting system and the corrections you made by hand afterwards cannot.

One rule outranks the rest here: the database connection string and any model provider key live in Replit’s Secrets and nowhere else: not in anything the browser downloads, and not in a repository. Treat either one that escapes as burned, and replace it the same day.

Workflow rules

What speeds the build, and what slows it

Speeds the build

  • One small, specific request per message, checked in the live preview before the next one
  • Letting the Agent provision the database from the chat instead of wiring one up by hand
  • Running two Agent sessions in parallel on unrelated parts of the app, once your plan allows it
  • Rolling back to a checkpoint the moment a change goes wrong, instead of unpicking it by hand
  • Reviewing what Publishing changed, meaning the domain, who can reach the app, and the machine it runs on, before the first release

Slows the build

  • Asking for the whole app in one message instead of one piece at a time
  • Building screens for data that isn’t in the database yet
  • Running unrelated Agent sessions against the same files at the same time
  • Letting several risky changes stack up before checking whether any of them actually broke something
  • Publishing without checking who the app is visible to first
Keeping a safe copy

Connecting GitHub (Optional)

Every change in Replit is saved automatically without any technical setup. Checkpoints are the day-to-day undo. 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 milestone is already saved

Replit’s Agent creates a checkpoint automatically at key points as it works: a full snapshot of the files, the configuration, and even the AI conversation itself, not just the code.

Checkpoints and rollbacks, Replit docs

Rolling back restores the whole workspace

One click returns your project to an earlier checkpoint (files and configuration together, and optionally the database), which is broader than a typical code-only undo, so a rollback after real data has changed is worth a second look before you confirm it.

GitHub keeps a copy outside Replit

Connect a repository from the Git pane, free on every plan, and stage, commit, and push changes back to GitHub with a click, or pull in anything changed outside Replit.

Using the Git pane, Replit docs

It’s also how an existing project gets in

Point Replit at a public repository’s URL for a fast import, or use the guided import for a private one. Either way, Replit detects the stack and installs everything on its own.

Import from a provider, Replit docs

You rarely type git commands

The Git pane’s buttons cover staging, committing, and pushing. If you’d rather type them yourself, the workspace Shell stays in sync with whatever the pane just did.

Going live

Going live without external hosting

Skip third-party hosting and external database setup. Your database, backend, and domain live in the same Replit workspace. Just click Publish to go live.

HostBest forNotesFree tier
AutoscaleThe dashboard itselfGrows with traffic and shrinks back when nobody is looking, which suits a finance dashboard almost perfectly: it is read in bursts at month end and barely touched in between. It is the default choice for the pages and it is enough for everything a reader clicks.Metered - billed with your plan
ScheduledRebuilding figures overnightRuns on a timer rather than answering requests, which is exactly the shape of the two jobs you do not want to press a button for: rebuilding the daily figures for the current period, and filling yesterday’s gaps in the rate table. Publish it separately from the app, make it safe to run twice, and give it a secret from Secrets rather than a session. Without it, your dashboard is only as current as the last time somebody remembered.Metered - billed with your plan
Reserved VMA rebuild that takes real timeDedicated compute that never sleeps. Worth comparing against Autoscale once your imports get large enough that recomputing a period is minutes rather than seconds, since a long job is the one thing an autoscaling deployment handles least gracefully.By machine size - billed with your plan
StaticNot this appFiles only, with no server behind them. Listed to rule out: your own server declares who is asking before any policy can act, the import parses uploads server-side, and the figures are computed in Postgres, none of which exists here.Metered - billed with your plan

All of these are Replit rather than a third party, so the choice is shape rather than vendor, and this build wants two of them: one to serve the pages, and Scheduled for the overnight rebuild. Review who the app is visible to before the first release, since Publishing is what sets it, and on this application that setting decides who can read your accounts.

One thing to check on the day you publish, and it is not the hosting. 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 is usually spent establishing that the deploy was fine and the rebuild had not been published.

Database & backend

Your database is already part of the workspace

Nothing to connect. Financial records are small and will not trouble the included allowance for years. It is the files you import that accumulate, and they belong in object storage rather than in a table.

ServiceBest forNotesFree tier
Replit PostgresData, built inManaged Postgres with 20GB included free, provisioned from the same chat that builds the app, and since it is ordinary Postgres, the figure-computing functions from step 04 and the access policies from step 05 both work exactly as they would anywhere else. What it does not include is a hosted identity service, which is why your own server is what declares the account and the company before any policy can act on it.Free to start · 20GB included
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.

A cheap model is plenty for most of the prompts above. Save Pro’s stronger models for the one or two spots where the extra reasoning actually pays for itself. Add any provider key through Replit’s own Secrets tool rather than hard-coding it, and keep every AI feature behind one server-side function so a single key covers the whole app.

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 functions that turn records into daily figures, and the rules deciding who may see them. The Postgres they write into is created inside this workspace when you ask, so nothing needs opening anywhere else first, though sign-in is worth a specific question, since this workspace provides the database without a hosted identity service to go with it.

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.

Your Replit plan, plus what you publish, plus the model if your forecast calls one. Core starts at $25/month, or $20/month billed annually, and includes 20GB of Postgres. Financial records are small, so it is the files you import that accumulate. Publishing is billed separately on top, and this build wants two deployments: the pages, and the overnight rebuild of your figures as its own Scheduled release. Nothing scales with how many companies or readers you add.

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

Yes, and it is worth doing early. The replit.app subdomain the app starts on can be replaced with your own through Publishing, HTTPS included. On this application a second reason goes beyond tidiness: the link you send somebody is a link to your company’s finances, and a proper address on your own domain is part of how the people you send it to know it is really yours.

No. You describe what you want in the chat, and the Agent handles the rest: the code, the database, and a live version of the app right there in the workspace. The setup section above covers the account and plan you need first.

Replit hosts it. Publishing takes the same project live on a Replit domain, or your own if you connect one, with monitoring and access controls included, so you never open a separate hosting account.

Starter’s daily credits and a paid plan’s monthly grant both refill on their own schedule. Hitting either limit mid-build doesn’t touch what you’ve already made. Move up a plan for more headroom right away, or wait it out.

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. 09Pricing (Starter, Core, Pro), Replit. replit.com
  10. 10Built-in database, Replit docs. docs.replit.com
  11. 11Publishing overview, Replit docs. docs.replit.com
  12. 12Deployment types, Replit docs. docs.replit.com
  13. 13Checkpoints and rollbacks, Replit docs. docs.replit.com
  14. 14Using the Git pane, Replit docs. docs.replit.com
  15. 15Import from a provider, Replit docs. docs.replit.com
  16. 16Secrets, Replit docs. docs.replit.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. Replit is a product of Replit, Inc. Verify current capabilities and pricing before relying on them.