James Pelton builds websites and apps for clients and runs several side businesses, and the slowest part of that work is now the proposal. He built an app that takes an enquiry like "how much for a website", prices it with an AI agent, and sends the client a link to pay a deposit. Momen handles the backend and Claude Code built the React frontend.
He didn't set up the backend by hand. The Momen plugin connects Claude Code to a Momen project, so James described the tables, permissions, and logic in plain language, partly by voice, and Claude Code built them in an empty project. The finished build is public: you can see it in the Momen editor / Clone project.
Public request form: a prospective client describes the job in their own words and leaves a name and email
AI-drafted proposal: an agent turns the enquiry into a job type, line items with quantity and unit price, and a total
A confidence score that decides what happens next: the agent rates its own draft from 0 to 1. At 0.7 or above, the proposal goes to the owner for review. Below that, it is held back and the agent lists the questions it needs answered
Rounds of questions until the agent can price the job: the owner answers the open questions and redrafts, and the agent raises its score as the gaps close
Owner dashboard: every request with its proposal, status, and confidence score, plus approve and copy-link buttons
Public proposal page with a deposit button: the client opens the shared link, sees the line items, and pays 25% of the total through Stripe
James tested it with "build me an app for a local gym." The agent came back with eight questions before it would quote. After two more rounds it produced a full proposal for 8,000 with a 2,000 deposit link.
The app runs on Momen's built-in account table and four tables Claude Code added:
request: the inbound enquiry, with enquiry_text, contact_name, and contact_email
proposal: one per draft, linked to its request through request_id. It holds total, job_type, agent_confidence, a status enum (DRAFT, READY_FOR_REVIEW, NEEDS_INFO, SENT, ACCEPTED, DECLINED), a public_token for the shareable link, and three deposit fields: deposit_amount, deposit_paid, and deposit_paid_at
line_item: description, quantity, and price, linked to a proposal through proposal_id
proposal_question: each question the agent couldn't answer from the enquiry, with question, answer, an answered boolean, and a proposal_id
James first asked for only three tables. proposal_question and the deposit fields came later, when he described the confidence branch and the payment step, and Claude Code added whatever those steps needed. If you're planning your own, Momen's guide to data modeling for a no-code web app covers how linked tables like these fit together.
Before building any logic, James reviewed the table permissions in the editor and decided what a visitor without an account should be able to do. He gave Claude Code one spoken instruction: anonymous users get exactly two things, submitting a request and reading a proposal by its public token, and everything else is revoked on every table for anonymous and logged-in users.
Here is how the project is configured now:
Anonymous User can insert into request, limited to enquiry_text, contact_name, and contact_email. It can read proposal rows only when public_token is set, and only the columns the public page needs: total, status, job_type, deposit_amount, deposit_paid. It can read line_item rows only when the parent proposal has a public token. It can run only one Actionflow, Prepare deposit
Logged-in User has no table access at all
Owner, a custom role described as "Full read of the pipeline plus proposal approval", can read every request, proposal, line item, and question. It can update a proposal's status, public_token, total, and job_type, and record answers on proposal_question. It is also the one role allowed to call Draft proposal from request directly, so a redraft can go back through the agent
The agent's agent_confidence score is never exposed to the public, because it isn't in the anonymous column list. Momen's permissions documentation explains how the role, table, and column layers work together.
The agent is configured in Momen with Claude Sonnet 5 at temperature 0 and a structured output called ProposalDraft: job_type, a list of line_items (description, quantity, price), total, confidence, and a list of questions. Its system prompt covers the two behaviours James asked for:
No guessing: confidence is judged on whether the enquiry gave the scope, size, location, and timing. A vague scope means below 0.7 "no matter how clearly it is written," and missing details go into questions, never into line items
Redrafts should move the score: when the enquiry includes a section headed "Follow-up answers from the customer," the agent treats those answers as settled, doesn't ask them again, and prices the job once it is within a sensible range. Even a vague answer like "whatever it costs" counts as an answer
Because the output is structured, the Actionflow reads each field directly and never has to parse the agent's text. Momen's AI integration guide covers how agents and structured outputs are set up.
The trigger New request drafts a proposal runs this flow in the background on every insert into request. The steps:
send the enquiry text and contact name to the Proposal drafter agent
insert a proposal with the agent's total, job_type, and agent_confidence
loop over the drafted line items and insert each one into line_item
branch on confidence:
0.7 or above: set status to READY_FOR_REVIEW
below 0.7: set status to NEEDS_INFO, then insert each open question into proposal_question with answered set to false
Every run inserts a new proposal row, so each drafting pass is stored with its own score.
Anonymous visitors can call this flow from the public proposal page. It takes a public_token, finds the matching proposal, writes total × 0.25 into deposit_amount, and returns that figure as the amount to charge. The deposit is worked out on the server from the stored total, not by the page.
James entered his Stripe test keys in Momen's payment settings, and the Stripe integration handles the payment callback. Claude Code extended the default StripePayment flow so that when a payment succeeds and hasn't already been processed, it:
reads the payment record to see how much was actually paid
sets deposit_paid to true and stamps deposit_paid_at, but only on the proposal whose deposit_amount is no more than the amount received
That second condition means a payment smaller than the deposit never marks the proposal as paid. All of these flows were built in Momen's Actionflow editor, and James opened them there to check that the branch matched what he had described.
Claude Code built the frontend with React and Vite against James's existing Momen backend. In the video it has three routes:
/ is the public request form
/dashboard is the owner dashboard, behind sign-in through Momen's built-in authentication
/p/:token is the public proposal page with the deposit button
Each screen talks to the API Momen generates from the data model, and every rule above applies to those calls. In the video the app runs locally on port 5173. Because the frontend was built outside the Momen editor, Momen's one-click deploy doesn't apply to it; the frontend gets hosted separately while the backend stays in Momen.
Building this project on Momen comes to approximately $99/month on the Pro plan. Pro is the minimum because Stripe deposit collection needs the payment features that start at that tier. The custom Owner role alone would already rule out the Free plan.
The plan is the whole bill. The estimate assumes about 2,300 users accumulating over a 225-day operating period, and every resource fits inside Pro's allowance with no add-ons:
AI points: about 1.4 million a month for drafting and redrafting, against the 5 million Pro includes
Database storage: about 76 MB of requests, proposals, line items, and questions, against 1 GB
Peak load: about 1 request per second, against 25
You can estimate the cost of your own project using Momen's pricing calculator.
James walks through the whole build in his video: the tables, the permission lockdown, the confidence branch, and the gym-app test that took three rounds of questions. The project itself is open in the Momen editor, and you can clone it into your own account.
To build something similar, install the Momen plugin in Claude Code and describe your tables first. Then ask for permissions that lock out anonymous users, and describe the agent's output fields and the branch rule before you ask for a frontend. For a version of the same idea with two chained agents and a studio website, see how Mikey's design studio quotes and gets paid automatically.