Build with AI

How to build a marketing analytics dashboard with Lovable

Describe the board you want in a chat and watch it appear, then keep going until the numbers behind it are real: an import that validates every row and keeps its refusals, six rates with a guard on each division, a widget library people compose from, and separate answers to who may build a dashboard and who may only read one.

August 2026 · 58 min read · Updated September 2026

Lovable

$ Build a marketing analytics dashboard: import campaign CSVs with every row validated and every refusal kept, compute click-through rate, cost per click, cost per thousand, cost per acquisition and both returns with guarded division, give me a library of charts, metric cards and tables to compose boards from, filter everything by date, channel, campaign and country, and keep an administrator, an editor and a viewer who only sees shared boards apart.

  • Board designed and connected to real data
  • Import, filters and permissions wired up
  • Ready for you to review
You describe it, Lovable builds it
Start here

What a marketing analytics dashboard actually is

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

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

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

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

Agree Your Definitions Before You Build

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

Reliable Imports From Messy CSV Exports

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

Flexible User Roles & Custom Permissions

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

The part companies rate themselves worst at

4.0 / 7

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

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

What a marketing dashboard needs

The parts every marketing dashboard is built from

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

01

CSV Import That Keeps Every Rejected Row

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

02

Six Marketing Metrics Calculated Automatically

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

03

Build Your Own Dashboards From a Widget Library

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

04

Every Chart Respects the Viewer’s Permissions

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

05

Dashboard-Wide Filters

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

06

Control Who Can Edit vs. Who Can Only View

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

Build vs buy

Own the dashboard or rent one per client

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

Build your own

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

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

Rent the reporting layer

AgencyAnalytics · DashThis · Supermetrics · Funnel · Data Studio

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

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

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

agencyanalytics.com · checked August 2026

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

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

dashthis.com · checked August 2026

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

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

supermetrics.com · checked August 2026

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

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

funnel.io · checked August 2026

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

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

docs.cloud.google.com · checked August 2026

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

No dev needed

Why build with 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:

The build loop
1

Prompt

Say what you want to add or change, in plain language.

2

Watch

The live preview rebuilds in the browser as Lovable writes the code.

3

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.

Loop back to Describe

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.

What it costs

Pay a developer, or do it with AI

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

Hire a developer

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

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

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

Build it with 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
~103 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.

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

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

Prices and rates from supabase.com, developex.com, developers.openai.com and docs.lovable.dev, checked August 2026.

Plan first

Decide before you build

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

01

What a conversion is, in one sentence

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

02

What your exports actually look like

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

03

Wide rows, or facts and dimensions

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

04

Who builds, who reads, and which numbers

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

05

What the written summary is allowed to say

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

06

Whether anybody outside your company will see it

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

Approaches

Comparing your build options

A marketing dashboard is the rare build where the screen genuinely matters (people decide whether to trust it partly on whether it looks considered) and where the screen is still the smaller half of the work. Three routes below: by hand, on a UI kit that gives you the look and nothing under it, or by describing the whole thing to Lovable in a chat.

~215 hrsBuilding by hand

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

~160 hrsGeneric UI starter kit

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

~103 hrsBuilt with Lovable

Describe the board and it designs the tables, writes the import behind them and wires the widgets to the data, with a preview updating as you talk. The same task list as the rows above. What it changes about this particular build is the loop on the parts you have to see to judge: which six widgets belong on the board somebody opens every morning is a question you answer faster by looking than by specifying.

Interactive calculator

Estimate your exact build timeframe

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

What your marketing dashboard needs

Your estimate

103 hrs

start to finish

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

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

Setting up your workspace

Let’s set up the tools you need

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.

1

Lovable account

Cost: Free

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 Lovable
2

Lovable subscription

Cost: $25/month (Pro) and up

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 plans
3

Supabase project

Cost: Free to start

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 Lovable
Optional
4

GitHub connection

Cost: Free

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 sync

Only 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.

Step by step

Build your marketing dashboard, prompt by prompt

Six messages in a chat, each building on the last, with a preview you can click after every one. The order matters more here than the wording: it is tempting to keep refining the board because the board is what you can see, and step 03 is where you make yourself stop and hand over a real export instead.

  1. 01

    Start the project and settle the vocabulary

    A running project connected to your own database, and one message that fixes the two definitions everything else depends on.

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

    Ask for the rules to be written into the project rather than just agreed to in the chat. A long conversation is a long conversation, and the rule you set in message one is the one most likely to be quietly dropped in message forty when a new widget needs a policy.

  2. 02

    Design the data before designing the board

    The temptation with a chat that draws is to draw first. Resist it for one message: an organisation on every table from the beginning is the one thing that is genuinely painful to add later.

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

    The seeded second organisation is what makes step 05 checkable rather than theoretical, and asking for it now costs nothing. It also gives the preview something to draw immediately, which is the thing that makes this way of building enjoyable.

  3. 03

    Stop designing and hand over a real export

    Download a real month from one ad platform and upload it into the chat. This is the message that decides whether you are building a dashboard or a demo, and it is the one easiest to keep postponing while the preview looks good.

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

    Ask for the reject list as a real screen while you are here, not just a table in the database. It is the fastest thing in this build to add and the thing that most changes how much people trust the dashboard, because the first question anybody asks a total is whether it includes everything.

  4. 04

    Now the board, and a library rather than one screen

    The step this way of working is best at, with one condition attached: the arithmetic gets built once in the database before a single chart is drawn over it.

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

    This is the message where you should be fussy about how it looks, because you can see it and because a board people trust is a board that looks deliberate. Just keep the fussing to the widgets: if you find yourself asking for a chart to work out its own percentage, that belongs back in the first half of this prompt.

  5. 05

    Three roles, and the question the preview cannot answer

    Everything so far you could judge by looking. This you cannot: a permission model looks identical whether it works or not, so the last part of this message is a list of things to try as somebody else.

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

    Do those six checks yourself in the preview with two accounts open, rather than accepting that they were done. A permission model is the one part of this build where the preview looking right and the system being right are unrelated, and where the difference eventually gets discovered by a client rather than by you.

  6. 06
    Destination

    The summary, a spending ceiling, and one channel checked

    The written paragraph at the top of the board, the limit on what it may spend, the exports, and the reconciliation that decides whether the whole thing is worth reading.

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

    The summary is the feature most likely to impress somebody in a demo and the one most likely to be quietly wrong, which is a bad combination. Insist on the printed figures underneath it: a paragraph with its own inputs shown below it is checkable by whoever reads it, and that is what stops it becoming a rumour with a chart attached.

Auth & access

Ironclad role security and dashboard access control

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

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

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

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

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

Then the second axis: a grant on one dashboard

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

The query behind a widget runs as the person looking

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

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

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

Where the keys live, and what leaves your database

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

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

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

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

Workflow rules

What speeds the build, and what slows it

Speeds the build

  • 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
Keeping a safe copy

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 docs

Reverting 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 docs

It’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 docs
Going live

Where to host your application

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

HostBest forNotesFree tier
LovableBuilt inPublishing from the chatThe 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.

Optional

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.

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

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

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

Database & backend

Keep your data in Supabase

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

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

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

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

Say only what it can actually know

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

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

Explain a movement after you have found its cause

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

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

Flag the rows that look wrong before they reach a chart

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

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

Ask your own numbers a question in words

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

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

Put a ceiling on what it can spend

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

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

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.

Ready-made option

Get a head start with our template

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

Marketing Analytics Dashboard

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

React 18ViteTypeScriptTailwind CSSSupabaseRecharts
Out of the box

The key benefits of starting with a template

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

Building the core from scratch

~103 hrs

Opening the template, already built

~1 hr

~102 hrs of building you skip

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

An import that already copes, and keeps its refusals

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

Two data shapes, both wired up

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

Six widgets, and the editor that composes them

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

83 live access policies, over two permission axes

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

The written summary, and the honest note about it

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

A codebase your AI tool can keep extending

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

Customer story

From founders who build on our templates

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

Common questions

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

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

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

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

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

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

No. 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
  1. 01Highlights and Insights Report, 35th edition (marketing technology performance, n=308). cmosurvey.org (fielded January 2026)
  2. 02Pricing (per-client plan, unlimited users, add-ons), AgencyAnalytics. agencyanalytics.com
  3. 03Pricing (dashboard tiers, unlimited users), DashThis. dashthis.com
  4. 04Pricing (data sources, destinations and users; both billing bases), Supermetrics. supermetrics.com
  5. 05Pricing (two “starts from” floors, connector counts), Funnel. funnel.io
  6. 06Pro subscription overview (per-user licences, one Cloud project), Data Studio - formerly Looker Studio. docs.cloud.google.com
  7. 07Pricing (Pro plan, free-tier limits, project pausing), Supabase. supabase.com
  8. 08API pricing (per-million-token rates for the small models). developers.openai.com
  9. 09Web developer hourly rates 2026 (freelance and agency benchmarks). developex.com
  10. 10Row Level Security, Supabase docs. supabase.com
  11. 11Storage access control, Supabase docs. supabase.com
  12. 12Edge Functions secrets and environment variables, Supabase docs. supabase.com
  13. 13Sign up, Lovable. lovable.dev
  14. 14Subscription plans (Free, Pro, Business), Lovable docs. docs.lovable.dev
  15. 15Connect Supabase, Lovable docs. docs.lovable.dev
  16. 16GitHub integration, Lovable docs. docs.lovable.dev
  17. 17Deployment, hosting, and ownership, Lovable docs. docs.lovable.dev
  18. 18Version history and reverting, Lovable docs. docs.lovable.dev
  19. 19Preview toolbar (Select elements), Lovable docs. docs.lovable.dev
  20. 20AI features and model selection, Lovable docs. docs.lovable.dev
  21. 21Custom domains, Lovable docs. docs.lovable.dev

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