How to build a rental property management app with OpenAI Codex
Build the app your spreadsheet is standing in for: leases, a rent ledger that reconciles, maintenance requests, and a portal per tenant. Describe it one task at a time from your terminal and Codex writes the migrations, the allocation logic, and the access rules as diffs you approve.
OpenAI Codex
$ Build a rental property manager: properties, units, and leases; a ledger of charges and payments where a payment clears the oldest open charge first; scheduled monthly rent; maintenance tickets; and a tenant portal scoped to one lease.
- Ledger written and proved
- Access rules reviewed as SQL
- Ready for your review
What a rental property management app actually is
It is two applications sharing one database: the side where you run properties, leases, rent, and repairs, and the side where each tenant signs in to see their own lease, their own balance, and the requests they have raised.
Most portfolios are run without one. The leases live in a folder, the rent lives in a bank statement, a spreadsheet holds who has paid, and the repairs live in text messages nobody can find in November. It works until a tenant disputes a balance, or a boiler fails while you are away, or you buy four more units and the spreadsheet stops being something one person can hold in their head.
The part that makes this genuinely hard is the money. Rent is not a payment, it is a charge that comes due on a date, sometimes paid late, sometimes paid short, sometimes paid twice, and every one of those cases has to leave a balance you can defend in front of the person who owes it. Get that right and the rest of the app is properties, screens, and a portal on top of it.
The ledger is the product
Charges on one side, payments on the other, and a balance derived from both rather than typed in anywhere. Once that holds, arrears, late fees, receipts, and the tenant’s own statement all fall out of the same records instead of being tracked separately.
Your tenant is a user of your software
That single decision is what makes this harder than an internal tool. Someone outside your organisation signs in, and they must see their own lease and nothing near anybody else’s - which is a database rule, not a screen that filters.
Rent arrives on a date, not on a click
Charges have to appear on the first, or the fifth, or whichever day each lease says, whether or not anybody opens the app. That means something running on a schedule, and it means being certain that running it twice cannot bill anyone twice.
Who actually owns the rentals
59.6%
of one-unit rental properties are owned by individual investors, against 1.8% held by REITs and real-estate corporations combined - Chandan Economics’ 2026 analysis of the Census Bureau’s 2024 Rental Housing Finance Survey.
Chandan Economics, 2026 (Census RHFS 2024 data) · checked published February 2026
The parts every rental property manager is built from
Two of these six are where the difficulty lives. Knowing which two before you start is most of the planning this build needs.
A ledger you would be happy to show a tenant
Every charge raised, every payment received, and a balance worked out from those two lists rather than stored as a number someone can edit. Decide early which open charge a part payment pays down - oldest first is the convention, and it is worth being deliberate about, because it decides which line goes overdue and which late fee gets raised.
Properties and units, with a status that means something
A property holds units, a unit holds one lease at a time, and a unit is occupied, vacant, or out for works. That status is what turns a list of addresses into an answer to “what can I let next month”.
Leases that carry the money terms
A lease is where the rent amount, the deposit, the start and end dates, the day rent falls due, the grace period, and the late fee live. Put them on the lease rather than in your settings, because two tenants in the same building routinely sit on different terms.
A rent run that goes off on its own
Something that wakes up, finds every lease due today, raises this month’s rent charge, and adds a late fee where one is owed - without anybody opening the app. Build it to check whether it has already billed a period before it bills it, so a retry, a double trigger, or a manual run cannot charge anyone twice.
Maintenance requests with a trail
A tenant reports a problem, it gets a priority, somebody takes it, and it closes. Keep the history of who changed what and when: half the value of tracking repairs at all is being able to show that a request from six weeks ago was answered.
A portal worth signing into
Their lease, their statement, their receipts, their open requests. Get this right and most of the messages you currently answer by text stop arriving, because the answer was already on a screen the tenant can reach themselves.
Own the ledger or rent it by the transaction
The subscription is rarely the interesting number here. Look at two other lines instead: what each product charges to move a single rent payment, and how many doors it expects before it will quote you at all. Those are what decide the cost in year three.
Build your own
An app you own is a one-time build. No fee rides on a rent payment, no minimum door count applies, and with an AI coding tool writing the ledger and the permission rules, the build runs in weeks rather than quarters.
- No per-transaction fee on rent, because you choose the payment rail and negotiate its rate yourself
- No unit minimum and no cap on an entry tier, so four doors and four hundred cost the same to run
- Late fees, grace periods, proration, and which charge a part payment clears all follow your rules rather than a vendor’s defaults
- Your tenants’ names, phone numbers, and payment histories sit in a database you control
- The portal carries your name rather than a vendor’s, which matters when you are asking tenants to trust it
- The records are ordinary rows, exportable the day you want them somewhere else
Rent the rails
Buildium · TenantCloud · DoorLoop · AppFolioWhat renting genuinely buys you is the money infrastructure and the compliance around it. Bank verification, returned payments, chargebacks, tenant screening through the credit bureaus and 1099 filing are all real work, and none of it is the ledger you would enjoy building.
- Rent collection works on day one, with the bank connections and failed-payment handling already solved
- Tenant screening runs through bureau relationships you cannot easily arrange on your own account
- Accounting depth arrives built rather than described: owner statements, bank reconciliation, 1099 e-filing
- Somebody else keeps up with the filing rules and the forms when they change
- Every one of them attaches a fee to moving rent, charged either to you per transaction or to your tenant per payment
- Two of the four put a floor under your portfolio, either a unit cap on the cheapest tier or a 50-unit minimum before there is a price at all
The clearest published statement of what it costs to let somebody else move your rent. The plans run “starting at $62/month”, “starting at $192/month”, and “starting at $400/month”, and each carries its own transaction rate: incoming EFT is “$2.35 per transaction” on Essential, “$1.35 per transaction” on Growth, and “First 12 months free, then $0.60” on Premium. Outgoing EFT is “$0.99 per transaction” and cards “2.99% per transaction” throughout, with “$99 per business bank account” to set up on the entry plan. Multiply the incoming rate by your doors and by twelve before you compare tiers, because on a small portfolio that line can outgrow the subscription. Above 5,000 units the page gives a phone number instead of a price.
buildium.com · checked August 2026
The cheap end, and the one that prices units differently: “Properties & Units” reads “Unlimited” on every tier, so nothing here scales with your door count. What scales is the payment, and the page is explicit about who pays it: “$ 1.95*paid by a tenant” on Starter, falling to “$1.75” on Growth and “$1.50” on Pro. Worth deciding deliberately rather than by default, because passing a per-payment charge to the person paying rent is a choice your tenants will notice. Plans run “$18.00/m” monthly against “$15.00/m” annually, “$35.00/m” against “$29.17/m”, and “$60.00/m” against “$50.00/m”, with Business “Starting at $100.00/mo”.
tenantcloud.com · checked August 2026
Included for the cap rather than the price. The entry tier shows $69 against a struck-through $99, on a basis the page states as “Per month. Billed yearly.”, and it is limited to “Max 10 units”, which is fewer doors than plenty of the individual owners in the statistic above. The higher tiers show $149 and $209 against $189 and $239, Premium carries an “Onboarding fee based on portfolio size”, and past 300 units the page routes you to a demo booking. Every tier also displays “Only $3/unit” alongside its flat monthly figure without reconciling the two, so confirm which one you would actually be billed on before you budget from either.
doorloop.com · checked August 2026
The enterprise end, and the sharpest illustration of who this class of software is sold to. Three plans are named (Core, Plus, and Max) with no dollar figure anywhere on the page; every route is “Get a Quote” or “Chat with an Expert”. The single hard number published is the floor: “Minimum spend and 50 unit minimum apply”. We quote no estimate of the cost, because the vendor publishes none. If your portfolio is smaller than fifty doors, the useful thing to take from this row is not the price but the minimum.
appfolio.com · checked August 2026
Rule of thumb: if what you want is rent collected for you, screening run for you, and 1099s filed for you, buy it, because those are the parts that are genuinely tedious to arrange alone and the per-transaction fee is what they cost. If what you want is a ledger that matches how your leases actually work, a portal with your name on it, and no floor under your door count, build it. The middle case is a small portfolio that will grow, and there the number to look at is the fee on an incoming payment multiplied by your doors and by twelve, because that is the line that grows with you whether or not the subscription does.
Why build with Codex
Most software looks simple from the outside, but almost all of the actual work is invisible: a database, logins, permission checks, forms that validate what people type, and dozens of screens that read and write records. Doing that by hand means knowing the whole stack cold, so weeks pass before the first feature a customer would notice actually works.
Codex closes that gap by working the way a developer would, just faster. The whole workflow becomes a simple loop:
Describe
Tell Codex what you want, in plain language.
Build
It edits the real project files, backend and auth and UI, rather than replying in a chat.
Check
Run the app yourself and confirm the change works.
Repeat
Describe the next change.
None of that loop needs a computer-science background, which is why one person can take an idea to a working app over a handful of focused sessions.
Three hard partshandled for you
The data model, authentication, and access rules are the pieces that make software like this genuinely hard to build alone. Describe them and Codex scaffolds all three, leaving mostly screens to build on top.
Any language is the interface
There’s no code to write, and no requirement to describe it in English. Ask for a new field, a renamed step, or an AI summary in whatever language you think in, and Codex implements it.
Local files it edits directly
Codex works on the project on your own disk rather than a copy somewhere else, so what it changes is exactly what you see when you run the app. Point it at the handful of files that matter and it stays fast and focused.
Pay a developer, or do it with AI
Two ways to get the same app built: pay a developer for their hours, or spend your own describing it to an AI coding tool. Here is what each one costs to build, and what it costs to keep running once it is live.
Hire a developer
Custom build, from scratch- Developer
- ~$12k-$46k
- Supabase (backend)
- Free tier · $25/mo (Pro plan)*
- Hosting
- $0 free tier
- Build time
- ~230 hrs of their work
~$12k-$46k to build, then from $25/mo after launch
Our ~230-hour estimate, costed against the rate survey linked below. Its bands run through $100-$150+/hour for senior US developers, before the 20-40% an agency adds on top, which brackets a realistic range at roughly $50/hr and $200/hr. Where those hours go is the part worth knowing: the ledger and the permission rules are close to half of it, and neither is visible in a screenshot, which is why quotes for this kind of app come back higher than owners expect.
Build it with Codex
From scratch, with Codex- Codex
- ~$20/month (Plus) to ~$200/month (Pro)
- Backend (Supabase)
- Free tier · $25/month (Pro plan)*
- Hosting
- $0 on a free tier
- Your time
- ~110 hrs
~$20-$200/month while you build, then whichever plan you keep using
Codex itself is free to install. The cost sits in the ChatGPT plan behind it, or in API usage if you sign in with a key instead. Plus, around $20/month, covers a template import or a short build. A from-scratch build that runs for weeks usually needs Pro’s top usage-multiplier tier instead, which lands around $100 to $200 a month. The fee doesn’t shrink when you start from a template the way a per-hour developer bill would: the template changes how many of the hours in the estimator above you actually spend, not which ChatGPT plan you’re paying for.
* One line on the free tier matters more here than on most builds. Supabase Free includes 500 MB of database space, 1 GB of file storage, and 5 GB of egress a month, and it pauses a project after a week of inactivity - which is a real risk for an app whose busiest day is the 1st and whose quietest stretch is everything between. Pro, from $25/mo, removes the pause, raises storage to 100 GB (then $0.0213 per GB) and egress to 250 GB (then $0.09 per GB), and adds a daily backup with 7 days of history. Before you have tenants signing in, Free is fine; the day you send the first invite, the pause is the reason to move.
Neither column takes a cut of rent, because the app records payments rather than moving them, so the running cost is a database and a host and nothing else. That bill does not move when rent does: ten doors and two hundred cost the same to host, and the only thing that grows is the storage under whatever lease documents you keep.
Prices and rates from supabase.com, developex.com and learn.chatgpt.com, checked August 2026.
Decide before you build
Six answers to write down first. Every one of them is a product decision about what you are promising your tenants, and each is far cheaper now than after real balances exist in the database.
How rent actually moves
Settle this before the schema. Recording payments (you get paid by transfer or card as you do today, and the app keeps the ledger) is simpler, cheaper, and enough for a great many portfolios. Taking payments inside the app adds a provider, a per-transaction fee, failed-payment handling, and a decision about who absorbs the fee. Retrofitting the other later means rebuilding the ledger.
Whether tenants sign in at all
A landlord-only tool is a much smaller build: one kind of account, one set of access rules, no invitations, no password resets for somebody else’s family. A portal answers most of the messages you currently answer by hand, at the cost of the entire second audience - roughly a third of the work in the estimator above.
What your rent terms actually are
Write your own rules down before anybody builds them: which day rent falls due, whether that differs per lease, how many days of grace, whether a late fee is flat or a percentage or both, how a mid-month move-in is prorated, and which open charge a part payment clears first.
Whose properties these are
Managing your own portfolio and managing other people’s are different applications wearing the same clothes. The second needs owners as a third kind of account, a statement per owner, and a management fee on what you collect. Say so before the data model is written, not after.
What personal data you keep, and for how long
This app holds tenants’ names, phone numbers, addresses, and payment histories - the most sensitive material any of these builds carries. Decide what you genuinely need, what happens to it when a tenancy ends, and how long a closed lease stays queryable.
How a tenant gets their account
Somebody has to be sure the person signing in is the tenant on the lease. A one-time link that expires and cannot be reused is the straightforward answer. Then decide how it reaches them - phone, your own email, move-in day, or a mail service you wire in - because that half is easy to forget until launch.
Comparing your build options
The starting point decides how much of the estimate goes on money arithmetic rather than on screens. Below is one app built three ways - entirely by hand, on a UI kit that stops at tables, or with Codex working task by task on the real source.
Programming complex calculations consumes most of your time and money. Charging rent, processing partial payments, applying late fees, and balancing monthly accounts require invisible logic that can’t just be designed - it must be meticulously coded to prevent costly financial errors.
Starter kits save time on visuals by offering ready-made dashboards, tables, and settings. However, a kit knows nothing about your business rules. You still need developers to program lease logic and configure security - ensuring one tenant never sees another’s financial details.
Instead of writing code, you describe one feature at a time in plain language and read back the change before you keep it. It links your screens to the database itself and sets up the permissions, so you can sign in as a tenant and verify exactly what they can see and access.
Estimate your exact build timeframe
Plenty of landlords need less than this. If your tenants will never sign in, or you would rather import your portfolio by hand once than build a CSV importer, untick those and watch the estimate drop.
Your estimate
110 hrs
start to finish
Based on the 6 of 6 features you’ve selected, plus ~31h 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.
Let’s set up the tools you need
Before step 01, four things go on your computer. It takes about 15 minutes in total, and none of it is coding. Three are ordinary installers, and the fourth is a ChatGPT plan with Codex access switched on. After that, you build by describing what you want in plain language.
OpenAI Codex
Your main AI assistant. The app itself costs nothing and installs with a single command from OpenAI, then runs in your Terminal. What it costs to use is the next card: every request spends the usage allowance on your ChatGPT plan, and the free plan’s allowance is small enough that a build of this size stops early. Codex is also built into an extension for popular code editors and into the ChatGPT desktop app, which can hand a longer task off to Codex cloud to keep running in an isolated environment while you do something else.
Install Codex CLIChatGPT plan
Codex is technically included on the free ChatGPT plan too, but Free’s usage is the tightest of any tier. OpenAI doesn’t publish Free’s own cap, only that every paid tier gets a larger multiple of it, so treat Free as a way to try Codex rather than to build with it. ChatGPT Plus, around $20/month, is the realistic starting point, and a long, from-scratch build tends to need the top ChatGPT Pro tier, priced by usage multiplier at roughly $100 to $200/month. Codex can also run on pay-as-you-go API billing instead of a ChatGPT plan, if you’d rather pay per token than hold a subscription.
Compare ChatGPT plansNode.js engine
The engine that runs your app on your own computer. You never have to learn how it works: download the version marked LTS (the most stable one), install it, and forget about it.
Download Node.js (LTS)Supabase (database)
Where your project keeps its data. Install it, then sign in once by running supabase login. Words like migrations and row-level security turn up later in the guide, and Codex writes those parts for you.
Install Supabase CLINothing here is worth memorizing. These four just need to exist on your machine. From step 01 on, you say what you want and Codex runs the commands.
Build your rental manager, one Codex task at a time
You describe a task, Codex writes the files and runs the commands. The sequence puts the money first: a ledger is the one part of this build where a plausible-looking diff can be wrong in a way no screen reveals, so it gets its own task and a close read before any login exists.
- 01
Write AGENTS.md before anything is scaffolded
Codex loads AGENTS.md at the start of every task, so the two rules that govern this whole build are in front of it before there is any code to break them.
PromptSet up the projectStart by writing an AGENTS.md at the project root: the stack is React 18, Vite, TypeScript, Tailwind, and the Supabase JS client, and this project is a rental property manager. Fix the vocabulary - property, unit, lease, tenant, charge, payment, ledger entry - and record two standing constraints: a lease balance is always computed from its charges and payments and never stored as a column, and a tenant account may only ever reach rows belonging to its own lease. You load that file automatically at the start of every later task. Then scaffold the project: a typed Supabase client under src/lib reading VITE_SUPABASE_URL and the publishable key (the sb_publishable_… key that replaced the older anon key) from .env, with .env confirmed present in .gitignore. Start the dev server once to prove it boots.
The stored-balance rule is the one worth writing down. Caching a balance is a reasonable-sounding optimisation for any assistant to propose later, and it is how a ledger and a statement start disagreeing with each other.
- 02
Give the ledger its own task, and read that diff closely
The largest piece of genuinely tricky logic in the build. Keep it in one task, ask for the SQL before it runs, and test the awkward payments rather than the tidy one.
PromptModel the portfolio and the ledgerWrite the data model as Supabase migrations, with no authentication in this task. Six tables. Properties, and the units belonging to them, each unit vacant, occupied, or under maintenance. Leases, tying one tenant to one unit and carrying the money terms: rent amount, deposit, start and end dates, which day of the month rent is due, how many days of grace follow it, and late fees as both a flat amount and a percentage. Tenants. Charges, each typed, dated, and tagged with the period it covers. Payments. Then two database functions: one allocating a payment against that lease’s oldest open charges first and marking each fully covered charge paid, and one deriving the lease balance from its charges and payments. Show me the SQL before you run it. Then seed three leases and walk through an exact payment, a short payment, and an overpayment, printing the balance after each.
This is the task to spend a round trip on. Asking for the SQL first is cheap; finding out in November that part payments were allocated newest-first is not.
- 03
Schedule the rent run, and prove it is safe to repeat
A well-specified, self-contained task with a clear test at the end - the kind that suits a cloud run if you would rather not sit through it.
PromptBuild the monthly rent runAdd a scheduled Supabase edge function that runs daily, selects every active lease whose rent day is today, and raises that month’s rent charge - skipping any lease that already has a rent charge for that period, so repeating the run is harmless. In the same pass, look for charges that have sat past their lease’s grace period and raise a late fee on each, taking the flat amount, the percentage, or both from the lease itself. Have it log what it created. Then run it twice in a row against the seed data and show me that the second run creates nothing.
If you hand this one to a cloud run, read the diff before merging it. The guard against double-billing is one condition, and it is invisible in a summary of what changed.
- 04
Narrow Codex’s permissions, then add the two logins
This task touches authentication and writes the rules protecting other people’s data - exactly the kind of change worth scoping down for rather than leaving whatever settings you use for routine edits.
PromptAdd auth, roles, and access rulesThis task touches authentication, so narrow your permissions to just this one. Wire in Supabase Auth for email-and-password sign-up, login, logout, a persisted session, and a useUser hook. Add an app_role enum of 'landlord' and 'tenant' with a user_roles table kept off the account itself, since anything stored there is editable by its owner, plus a SECURITY DEFINER has_role function, and link each tenant record to an auth account. Then row-level security across properties, units, leases, tenants, charges, payments, and ledger entries, with two rules per table - a landlord reaches their own portfolio, a tenant reaches only what belongs to their lease - and an explicit WITH CHECK on every insert and update. Show me the policies as SQL before they run, and then walk me through querying as a second tenant to prove the first tenant’s rows come back empty.
Two audiences means roughly twice the policies, and a table nobody thought about is the one that leaks. Ask for the list of tables it covered and check it against your own schema rather than assuming the set was complete.
- 05
Build the tenant side and maintenance
Two features that share a boundary: everything here is read by somebody outside your organisation, so every query goes through the rules written in step 04.
PromptBuild the portal and maintenanceBuild the tenant portal in this task, then maintenance. The portal sits behind a tenant session and shows four things: the lease with its terms, a running statement of charges and payments, a form for recording a payment already made, and the requests that tenant has raised. Maintenance spans both audiences - a tenant files a description, a priority, and optionally a photo, and the landlord works one queue across the whole portfolio, moving status and leaving notes, with every change writing a history row. Finish with a message thread per tenant and a notice the landlord can post to an entire building. No screen here may filter in the component: they all read through the policies from the previous task, and I want you to flag in the diff anywhere you were tempted to do otherwise.
- 06Destination
Hand the import to a cloud run, then test it as a tenant
A CSV importer and a dashboard are self-contained and well specified - a reasonable pair to hand off while you do something else, provided you read the diff before it merges.
PromptImport the portfolio and test end to endTwo remaining pieces, both self-contained. First, a CSV import for units, tenants, leases, and opening balances that validates each row, imports the valid ones, and stores every rejected row with the reason it failed so I can fix and re-upload only those. Second, the landlord dashboard: rent roll, outstanding balances with how overdue each is, occupancy, and collections this month. When they are in, run the app and take it end to end yourself - import a small CSV, invite a tenant with a single-use expiring link, accept it as that tenant, read the statement, raise a repair request, record a payment that clears the oldest charge, and confirm the balance and the ticket both show correctly on the landlord side - then fix whatever does not hold up.
Landlord control, tenant privacy
A person outside your organisation signs in to this one, and must reach exactly one lease. That privacy is enforced by the database rather than engineered by you - here is what does the work, and the part that still needs your attention.
No password handling to build
Sign-up, sign-in, sessions, and password resets all come from your database provider’s own auth service rather than from code you or your AI tool invented. Email and password is the right default for this audience: a tenant signs in a handful of times a month, and anything more elaborate is how a portal ends up unused.
Strict separation: landlord vs tenant
The template ships landlord and tenant, and the tenant role carries unusual weight: the rows it reaches are somebody’s own financial record - what they were charged, what they have paid, what they still owe. A landlord reaches their whole portfolio; a tenant reaches one lease, one statement, and their own requests. Everything else in this section exists to make that line hold.
Protection enforced at the data layer
A tenant portal that filters in the interface is one forgotten condition away from showing somebody another family’s payment history. Row-level security puts the check where the data is served from, so a query that forgets to filter comes back empty rather than embarrassing.
Pre-configured privacy for every table
The template ships 139 row-level security policies, and the count has a structural cause rather than an anxious one: nearly every table needs one rule for the landlord who owns the record and a second for the tenant it is about. Charges, payments, tickets, and messages each carry both.
Roles belong in their own table
Whether somebody is a landlord or a tenant is kept in a separate roles table rather than on the account record, because anything stored on the account is editable by the person it belongs to. A tenant who could rewrite their own role would inherit the portfolio.
Lease documents need rules of their own
A signed lease or a condition report is a file rather than a row, and file storage has its own access rules that have to be written alongside the table’s. A locked-down leases table in front of a readable bucket is the version of this that looks finished and is not.
The invitation is a credential
A tenant’s first sign-in comes from a link, which means that link is as good as their account until it is used. Keep only a hash of it in the database rather than the link itself, let it be used once, and give it an expiry - so a forwarded message or an old screenshot stops working.
Automatic daily backups on Pro
Nothing on the free tier is backed up - your leases and your ledger included. A daily backup with a week of history starts on Supabase Pro at $25/mo, and this is the template where that line is worth reading twice: losing the ledger means a dispute with every tenant at once, which is a different class of problem from losing a draft.
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 before launch so Codex checks nobody can see data they shouldn’t.
The one rule that matters: the database service key, and any provider key you add later, never go into the app or a public repo. If one gets out, treat it as compromised and rotate it the same day.
What speeds the build, and what slows it
Speeds the build
- An AGENTS.md file at your project root: Codex reads it automatically before every task, so you never have to remind it
- Setting Codex’s permissions once for the session, instead of approving every small edit by hand
- Handing a long, well-scoped task to Codex cloud, so it keeps working in an isolated environment while you do something else
- Reviewing a diff in the IDE extension, next to the code it touched, before you keep it
Slows the build
- Leaving permissions wide open for a sensitive change instead of narrowing them for that one task
- Skipping the AGENTS.md file, so Codex starts each new task without your conventions loaded
- Handing Codex cloud a vague, open-ended task, where you can’t steer it mid-run the way you can in a live terminal session
- Merging a cloud task’s changes back in without reading the diff first
Git: what it is, and why you need it
Before you build anything, meet the one tool that makes building safe. You need no coding background for it: Git remembers every version of your project, so you can try things, break things, and get back to a working state in seconds.
What Git actually is
Git is a quiet recorder that runs alongside your project. Each time you save your work it keeps a full snapshot, so the entire history of your project lives on your computer, not just whatever the files look like right now.
Why you need it
Codex asks before it edits files or runs commands, unless you widen its permissions for the session. Once you do, Git is what makes that safe: there’s always a working version to return to, so you can hand it a bigger task without the fear of losing what already works.
A commit is a save point
Each commit is a snapshot with a short note, like “added the home page”. Make one after every working step and you can jump back to any of them later.
GitHub’s beginner guide to GitUndo anything, safely
If a change breaks something, you roll back to the last good commit instead of unpicking it by hand. It’s the safety net that keeps a Codex session low-risk even once you’ve widened its permissions.
GitHub is also where Codex can start from
Git lives on your computer. GitHub is a free, private cloud copy of the same project. Keep it private, and never commit secret keys or passwords. Once your project is pushed there, Codex cloud can pick up a task straight from a GitHub issue or repo, without you opening a terminal at all.
Create a free GitHub accountYou rarely type git commands
There’s little to memorize. Ask Codex to “commit this” or “undo the last change” and it runs the git steps for you, inside whatever permission boundary you’ve set. Prefer clicking to typing? The Codex extension for your editor shows each change next to the code it touched before you keep it, and GitHub Desktop gives you plain buttons for saving and rolling back.
Get CodexWhere 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).
| Host | Best for | Notes | Free tier |
|---|---|---|---|
| Vercel | One-click deploys | Point it at the repository once and every push publishes itself, with a Vite project needing no configuration at all. Read the plan terms before you start, though: Hobby is personal, non-commercial use only, and letting property is a business by any reading, so a live portfolio belongs on Pro at $20/user/mo. | Pro from $20/user/mo (Hobby is non-commercial) |
| Netlify | Drag-and-drop or Git | Either link the repository or drop the built folder onto the page. A deep link to a tenant’s statement needs one redirect rule, which it writes for a Vite project without being asked. | Free tier |
| Cloudflare Pages | Cheapest at scale | Serves from wherever is nearest the visitor, which is worth something when your tenants are spread across a city and half of them open the portal on a phone. | Generous free tier |
| GitHub Pages | Free Git-based hosting | Serves the site straight from your GitHub project once one routing setting is changed. The catch is specific to this build: free publishing needs a public repository, and the repository for an app holding tenants’ personal data should not be public - so this is free only in a way you would not use. | Free from a public repo only |
| Firebase Hosting | Teams already on Google | One setup, then a single command per release. Worth it mostly if Google is already where your other accounts live. | Free Spark tier |
| AWS Amplify Hosting | Teams already on AWS | Deploy from the AWS console; one rewrite rule keeps a deep link to a tenant’s statement working. Worth it mainly when AWS already handles your other bills. | Free tier (build + hosting) |
| Surge | Publish from the terminal | Publishes the built folder straight from a terminal command, with no repository involved anywhere. Useful for putting a ledger in front of a landlord for ten minutes, not for the app tenants sign into. | Free - unlimited publishing |
| DigitalOcean App Platform | DigitalOcean users | Builds and serves the project from the same account as whatever else you run there, which is the main reason to pick it. | Free - 3 static sites, 1 GB/mo transfer |
Any of these will serve the app. Two things to check rather than one: whether the plan permits commercial use, since Vercel’s Hobby tier does not and rent is commercial by any reading; and whether it can publish from a private repository, because the code sits next to an app holding tenants’ personal data and the repository should not be public.
Keep your data in Supabase
Leases, ledgers, accounts, and whichever documents you attach. This is also where the scheduled rent run lives, since it has to fire whether or not anybody has the app open.
| Service | Best for | Notes | Free tier |
|---|---|---|---|
| Supabase | Data, auth, functions, files | Postgres for the portfolio and the ledger, auth for both kinds of login, edge functions for the monthly rent run and the imports, and storage for lease documents. Make a free project, hand over the URL and publishable key, and it is connected. The one line to watch on the free tier is the pause after a week of inactivity - fine while you build, not once tenants rely on it. | Free tier, then usage-based |
Choosing your banking system
The application tracks balances, but an external service processes the actual payments. Today that service is whatever you already use, whether that is a transfer, a standing order or a card machine, and it costs you nothing, because nothing here takes a cut. Collecting rent inside the app means picking one of the three below, and rent is the payment shape where that choice matters most.
The cap is the whole reason to choose this: an $800 charge and a $3,000 charge both cost $5, so the fee stops growing with your rents. It pulls on a schedule you set, which is what a monthly charge needs. It also confirms slower than a card does, and a failed payment reaches you days later rather than immediately.
stripe.com · checked August 2026
Built for recurring bank debit rather than adapted to it, on Bacs in the UK and SEPA in Europe, with the same capped shape. Read the international line before you commit: a payment from abroad costs 2% + 20p and carries no cap at all, so check it against your own tenants if any of them pay from another country.
gocardless.com · checked August 2026
No cap, so this one takes a percentage of every rent payment for as long as the lease runs. On $1,500 rent that is about $44 a month, per unit, against $5 on the row above. Keep it as the fallback for a tenant who will not use anything else, rather than as the default.
stripe.com · checked August 2026
Work out one number before you connect anything: the fee on a single incoming payment, times your doors, times twelve. On twenty units at $1,500, capped bank debit costs about $1,200 a year and cards about $10,500, for the same money arriving. Connecting nothing is still a real answer: the ledger is correct either way, and a landlord who is happy to be paid by transfer pays none of this.
Where AI genuinely helps a landlord
Each of these is one more prompt once the ledger works - copy any of them in as they stand. All four reach the model through a single server-side function, which is the only place your key ever sits.
Triage a repair request
Tenants describe problems the way people describe problems. Turning “there’s water coming through the ceiling in the back bedroom” into an urgent plumbing ticket, routed to the right trade, saves the reading and the re-typing.
Add a step when a tenant submits a maintenance request that sends the description and any photo caption to a server-side function calling an AI model, and returns a suggested category, a suggested priority, and a one-line summary for the ticket list. Show them as suggestions the landlord can accept or change rather than applying them silently, and never let the suggestion downgrade something the tenant marked as an emergency.
Draft the arrears message nobody wants to write
Chasing rent is the job landlords put off longest, and lateness costs more the later it is raised. A draft that already knows the balance and the days overdue turns it into an edit rather than a task.
Add a "Draft a reminder" action on a lease with an outstanding balance. Send the amount owed, which charges are unpaid, how many days overdue each is, and the tenant’s payment history for the last few months to your ai function, and return a short, factual message in a tone I choose - a first friendly nudge, a firm follow-up, or a formal notice. Always show it as an editable draft, never send it automatically, and state the figures rather than describing them vaguely.
Read the lease and fill in the fields
Every existing tenancy arrives as a PDF or a scan with the rent, the dates, and the deposit buried in it. Typing those into a form for forty units is the single most tedious hour of moving a portfolio into any new system.
Add an upload on the lease form that sends an existing lease document to your ai function and returns the fields it can find - rent amount, start and end dates, deposit held, the day rent falls due, and any late-fee terms - as a pre-filled form for me to check before saving. Mark each field with how confident the extraction was, leave anything ambiguous blank rather than guessing, and keep the original document attached to the lease.
Ask the portfolio a question in plain words
The reports you build cover the questions you thought of. The ones you actually ask are things like which units come up for renewal before Christmas, or who has paid late twice in a row.
Add a question box on the dashboard that turns a plain-language question about my portfolio into a read-only query against my own data and shows the answer as a small table I can export. Send the schema rather than the records to the model, run only SELECT statements, apply the same access rules as the rest of the app so it can never read past what the signed-in account is allowed to see, and show me the query it ran alongside the answer.
Each prompt above should pick whichever model tier fits the job: a fast, lower-cost model for high-volume work, and a stronger reasoning model for anything that weighs tradeoffs against each other. Codex’s model names change faster than this page does, so check OpenAI’s current model line-up (linked in the references below) before you build, rather than copying a name you saw once. Keep all of it behind that same ai function, so one key and one rule set covers every feature you add.
Get a head start with our template
The complete rental manager from this guide, already built. Point it at your own database, set your rent terms and fee rules, and start moving your portfolio in today.
Rental Property Manager
The exact property management app this guide builds, packaged so you can open it, point it at your own backend, and make it yours from there. A property management workspace where landlords handle properties, units, leases, tenants, rent, and repairs in one place, while tenants get their own portal. It replaces the spreadsheets and scattered messages that running rentals usually turns into.
The key benefits of starting with a template
The ledger already balances and the portal already keeps tenants apart. That is most of what this saves you - and behind it, the monthly rent run, the maintenance history, the messaging, and the CSV import are done too.
Building the core from scratch
~110 hrs
Opening the template, already built
~1 hr
~109 hrs of building you skip
Two different measurements, deliberately: ~110 hrs is what building the app costs you, and ~1 hr is how long the finished one takes to open, point at your own database, and get your own portfolio into. Setting your rent terms and fee rules takes the same time either way, so neither side counts it.
A ledger that already reconciles
Charges, payments, part payments, and a balance derived from the records rather than stored - with payments applied to the oldest open charge first, which is the convention most tenants and most accountants expect.
Landlord and tenant kept apart
Landlords manage the full portfolio while tenants strictly see their own lease and payment history. Privacy rules are enforced automatically by the database on every request.
All background automation, ready out of the box
Automated monthly rent charges with late-fee rules, protection against duplicate billing, repair request tracking, and tenant invitations are fully configured.
Clean structure your AI can safely customize
The template follows clean, predictable rules so you can ask your AI coding tool to add custom features without risking errors in your financial ledger or security rules.
From founders who build on our templates
I braced myself for a headache building the financial logic, but the ledger and rent runs worked right out of the box. The data structure is incredibly clean, so I could just focus on tweaking the UI and onboarding my first properties. It saved us weeks of development.
Jeevan ThomasFounder & CEO, Hado.aiCommon questions
Not on its own, and that is a deliberate position rather than a gap. The app records what is charged and what has been paid, and keeps the balance right; the money itself arrives however it does today - transfer, standing order, card, cash. If you want rent taken inside the app, that is a payment provider you connect, with its own per-transaction fee to either absorb or pass on. Deciding which way you want it before you build the ledger is the single most useful hour of planning here.
No - that is the part your AI coding tool is best at. Say what you need in plain language and it writes the tables, both kinds of login, the access rules between them, and the job that raises rent each month. The one thing left to you is opening a free Supabase project for it to point at, so your leases and ledgers sit somewhere you own rather than somewhere you rent.
By invitation rather than by signing themselves up, because you need to know the person logging in is the tenant on the lease. The pattern to build is a one-time link that expires and cannot be reused, with only a hash of it stored in your database. How the link reaches them is your call - read out on the phone, sent from your own email, or handed over at move-in.
The database, not the screen. Every table carries access rules checked on each query, so a tenant’s session can only ever return rows tied to their own lease. That is the difference that matters: a page which forgets to filter shows nothing instead of showing somebody else’s payment history.
Nothing, provided you build it to check first - and you should ask for that explicitly. The rule is that the job looks for an existing rent charge for that lease and that month before raising one, so a retry, a duplicate trigger, or a manual run you had forgotten about cannot bill anybody twice. Double-billing is the failure tenants notice fastest and forgive slowest.
Yes, and it is worth building the import rather than typing. Units, tenants, leases, and opening balances all come in from a spreadsheet, and the thing to insist on is that rejected rows are kept with the reason they failed, so a bad date in row 40 does not silently leave one unit out of your rent roll.
A database and a host, both starting free, with Supabase Pro from $25/mo once real tenants depend on it. That last part is not only about limits: free projects pause after a week of inactivity, and an app that is quiet between the 1st of one month and the 1st of the next can hit that. There is no fee on rent in either case, because the app is not the thing moving it.
Yes, with one addition worth planning for up front. Managing your own units needs two kinds of account; managing other people’s needs a third - the owner - plus a statement per owner and a management fee taken from what you collect. All of that is describable in plain words, but it shapes the data model, so decide before it is written rather than after.
Nothing here is proprietary. Leases, charges, payments, and tickets live in ordinary PostgreSQL, so a standard dump gives you the whole portfolio in a form any Postgres host accepts, and attached documents come out of storage the same way. That is worth more in this category than most: the reason portfolios stay on software they have outgrown is usually that the ledger will not come out.
Yes - all of the hosts above attach one in a few clicks, HTTPS included, and it is worth doing before the first invitation goes out. You are asking tenants to sign in somewhere and hand over their details, and a name that is recognisably yours does a lot of that persuading for you.
No, though you will type the occasional command: installing Codex, starting the app, applying a database change. The setup section above lists what you need, with a link for each, and once it’s on your machine Codex runs most of those commands for you.
A regular ChatGPT chat can sketch ideas and write snippets, but it isn’t working on your actual project. Codex reads and edits the real files on your computer. The app you get out of it is one you can run and publish, not a preview.
On a ChatGPT plan, Codex’s usage resets on a rolling window rather than billing per token, so a heavy day of building can bump into a limit. You either wait for it to reset, move up a plan, or switch to pay-as-you-go API billing for the rest of the session. Nothing you’ve already built is lost either way, so the work only pauses.
References
Sources checked August 2026- 01Individual investors’ share of one-unit rentals (Census RHFS 2024 data), Chandan Economics. chandan.com (published February 2026)
- 022024 Rental Housing Finance Survey release, U.S. Census Bureau. census.gov (published February 2026)
- 03Pricing (plan tiers, incoming EFT per transaction), Buildium. buildium.com
- 04Pricing (monthly vs annual, tenant-paid ACH fee), TenantCloud. tenantcloud.com
- 05Pricing (entry-tier unit cap, billing basis), DoorLoop. doorloop.com
- 06Pricing (quote-only plans, 50-unit minimum), AppFolio. appfolio.com
- 07Pricing (Pro plan, storage, egress, backups, free-tier pause), Supabase. supabase.com
- 08Web developer hourly rates 2026 (freelance and agency benchmarks). developex.com
- 09Row Level Security, Supabase docs. supabase.com
- 10Storage access control, Supabase docs. supabase.com
- 11Stripe pricing. stripe.com (August 2026)
- 12GoCardless pricing. gocardless.com (August 2026)
- 13Pricing (plans, usage limits), ChatGPT docs. learn.chatgpt.com
- 14Codex CLI, ChatGPT docs. learn.chatgpt.com
- 15API pricing (models), OpenAI for developers. developers.openai.com
- 16IDE extension, ChatGPT docs. learn.chatgpt.com
- 17ChatGPT desktop app, ChatGPT docs. learn.chatgpt.com
- 18Codex cloud, ChatGPT docs. learn.chatgpt.com
- 19AGENTS.md, ChatGPT docs. learn.chatgpt.com
This guide is general information, not legal, tax, or accounting advice - tenancy law, notice periods, deposit handling, and what you may charge as a late fee vary by country and by state, so check your own rules before you automate anything. Third-party prices, plan limits, 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. Codex, ChatGPT, and the OpenAI API are products of OpenAI. Verify current capabilities and pricing before relying on them.