CONTENTS

    James Pelton Gave His Freelance Business an Estimator That Asks the Questions He Would

    avatar
    Cici Yu
    ·October 25, 2026
    ·7 min read

    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.

    What the app does

    • 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 data model: five tables

    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.

    Locking down permissions with one voice prompt

    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 and the Actionflows behind it

    Proposal drafter, the AI agent

    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.

    Draft proposal from request

    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.

    Prepare deposit

    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.

    StripePayment

    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.

    The frontend, and where it lives

    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.

    What running this actually costs

    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.

    Vibe No-Coding with Momen Today. Describe Your App, Own Every Piece AI Builds.

    This blog is powered by QuickCreator.io, your free AI Blogging Platform.
    Disclaimer: This blog was built with Quick Creator, however it is NOT managed by Quick Creator.