Home › Research › Hands-on test

Hands-on test · run on 2026-09-26

One booking app. Three AI builders. Here is what actually worked.

On the morning of 26 September 2026 we gave Lovable, Replit and Emergent the same prompt for a small class-booking web app, on each one's free plan, and then tested what they built against 18 checks we wrote down before the first build. Where a check failed, the builder got up to three repair prompts, always in the same words. This is one run per builder: a case study, not a ranking.

When ten people tried to book the last spots of an eight-person class at the same moment, only Lovable's first version stopped at eight. Replit's and Emergent's first versions accepted all ten, and Replit's public schedule then went blank. Both were fixed after we described the failure, Replit in one repair prompt and Emergent in two.AIBuilder Marketplace, hands-on test, 2026-09-26. Free to quote with attribution.
3AI app builders, free plans, same prompt, same morning
18checks, fixed before the first build
2 of 3first versions let 10 people book 8 spots
1 of 3could publish and stay online on the free plan
Who pays us. Replit and Emergent run affiliate programmes we are part of: if you sign up through a link in our reviews of them, we may be paid. Lovable does not pay us. There are no affiliate links on this page. Daan also uses Replit for a separate project of his own; this test used a new, empty free account so that his paid plan and history played no part.

The prompt

Sent as the first and only message to each builder, word for word:

Build a web app for a one-person yoga studio to take class bookings.

Requirements:
1. A public page shows the classes for the next 14 days: Monday to Friday at 07:00 and 18:30, Saturday at 09:00, no classes on Sunday. Each class has 8 spots and shows how many spots are left.
2. A visitor books a class by entering a name and an email address. The number of spots left goes down by one. A class with 0 spots left cannot be booked.
3. After booking, the visitor sees a confirmation with a unique link to manage the booking.
4. Through that link the visitor can move the booking to another class that still has spots, or cancel it. Cancelling frees the spot.
5. The same email address cannot book the same class twice.
6. An admin page protected by a password shows all bookings per class, lets the admin cancel any booking, and has a button that exports all bookings as a CSV file with the columns: class date, class time, name, email, status.
7. Bookings are stored in a database and are still there after a page reload and after the app is republished.
8. Publish the app at a public URL.

Do not add payments, email sending or user accounts.

Small enough for a free plan, but it contains the things that separate a demo from something a studio could use: a hard capacity limit, a private link, a protected admin page, an export, and data that has to survive a redeploy. Payments and email were left out on purpose, because they need accounts with third parties and would have made this a test of those services instead.

How we tested

Results, check by check

First version, and where it changed, the result after a repair prompt.

CheckLovableReplitEmergent
T01 Published at a public URLPassPartialmanual Publish click; free deployments expireFailDeploy needs a paid plan
T02 14-day schedule, 8 spotsPassPassPass
T03 Booking lowers the countPassPassPass
T04 Confirmation with private linkPassPassPass
T05 Full is full (10 at once)Pass8 accepted, 2 refusedFail10 of 10 accepted, schedule went blank → Pass after repair 1Fail10 of 10 accepted → still failed after repair 1 → Pass after repair 2
T06 No double bookingPassPassPass
T07 Move a bookingPassPassPass
T08 Cancel frees the spotPassPassPass
T09 Link cannot be guessedPassPassPass
T10 Admin needs the passwordPassPassPass
T11 Password not visible in the browserPassPassFailin the CSV export URL → Pass after repair 1
T12 Admin overview per classPassPassPass
T13 Admin can cancelPassPassPass
T14 CSV with the five columnsPassPassPass
T15 Rejects bad inputPassPartialname of only spaces saved → Pass after repair 1Partialname of only spaces saved → Pass after repair 1
T16 Data survives a republishPassPassNot testedcould not publish; see below on deleted data
T17 Usable at 390 pxPassPassPartialpage 494 px wide → Pass after repair 1
T18 Code and data exportNot testeddocs: GitHub sync on all plansNot testedaccount export available on freeNot testedGitHub integration from Standard

T18 was checked in each builder's settings and documentation only. Connecting GitHub needs an authorisation we did not give for a test account, so no code actually left any of the three.

What it took and what it cost

LovableReplitEmergent
Plan and modeFree, Build modeStarter (free), Free agent mode, Power and Max lockedFree, web app
First working versionabout 10 minutes8 minutes of agent work (Replit's own count)about 9 minutes to a preview
Repair prompts needed01 (2 minutes)2 (about 5 minutes each)
Credits4 of the 10 on a new accountnot shown on the free plan; daily allowance used up after repair 119.17 for the two repairs (34.66 to 15.49)
Publishing on the free planone click, stays online, “Edit with Lovable” badgemanual Publish click; “Free deployments are temporary and will expire”; “Made with Replit” badgenot possible: Deploy opens the plan chooser ($1 seven-day trial, then $20 a month)

Emergent's balance rose from 10.00 to 34.66 during the first build without any purchase, and the app does not show why, so the cost of its first build cannot be stated. Lovable's new account started with 10 credits (five daily plus five that expire on 26 September 2027), not the five a day its pricing page leads with.

What each builder did

Lovable

Asked two questions of its own: whether to create a project from the chat, and whether to publish. After that it built, published and tested its own flows (booking, double booking, moving, cancelling), deleted its test booking and told us what it had assumed: an invented studio name, a temporary admin password and Amsterdam time.

It was the only one whose first version held the capacity limit under simultaneous bookings. It also checked input on the server, not only in the form, and prefixed CSV values that start with = + - or @ so a spreadsheet does not run them as formulas. Nobody asked for that.

Replit

Built a separate API and web app on PostgreSQL, ran its own functional pass and reported everything green. It did not publish: “Replit requires the final Publish action”, so a person has to press the button.

Its self-test booked one at a time. Ten at once got all ten in, after which the class list endpoint returned an error and the public page said “No classes on the calendar yet” until two bookings were cancelled. Told exactly that, it added a database lock per class in two minutes and got it right. The free daily allowance was gone after that one repair.

Emergent

Asked five clarifying questions (we let it choose), used a separate design agent and a testing agent, and suggested extra features at the end. Its first version overbooked, put the admin password in the export URL, saved a blank name and did not fit a phone screen.

The first repair fixed three of the four, but while “clearing test data” it dropped the entire bookings collection, which deleted all our test bookings and also the index its capacity fix relied on. The second repair added a lock and passed. It deleted all bookings again while cleaning up. On the free plan the app could not be published at all.

Choose for your situation

One run per builder on one day does not support a winner, so this is what the run does support.

Check the evidence

Our full reviews: Lovable · Replit · Emergent. How we separate researched reviews from hands-on ones: how we review.

Citation

AIBuilder Marketplace, “One Booking App, Three AI Builders: What Actually Worked”, hands-on test run on 2026-09-26. Free to quote and reproduce with attribution (CC BY 4.0).