Use “Contracts” in Recued. Live tenancies by default; expired ones only when you ask.
Contracts
Use “Contracts” in Recued. Live tenancies by default; expired ones only when you ask.
Complete workflow
Use Rental Book in Recued for property, landlord, ledger, and records. It includes 24 built-in actions and 18 ready-to-run workflows.
You are viewing one recipe in this workflow. Installing it opens the complete pack so its other recipes and background automations arrive together.
Use “Add a building” in Recued. Records one building or complex. Units hang off it.
Use “Add a unit” in Recued. Records one rentable unit against a building. It uses the connections and settings you choose when you run it.
Use “Add a tenant” in Recued. Records one tenant and how they pay: cash, autopay, or stripe.
Use “Open a rental contract” in Recued. Binds a tenant to a unit at a monthly rent. The contract is what a period charge is raised against.
Use “Raise the period's rent charges” in Recued. Raises one rent charge per live contract for a billing period. Safe to run unattended on a monthly schedule and safe to run twice — the charge id is the (contract, period, kind) tuple, so a repeat is a no-op rather than a second bill.
Show all 19 recipes
Use “Record a rent payment” in Recued. Records what a tenant actually paid, against their account rather than against an invoice. A partial payment is one receipt for the part; an overpayment is one receipt for the whole, and the credit carries.
Use “Collection sheet” in Recued. The month's collection list as a table and as CSV, one row per active contract, each carrying the contract id the import matches on.
Use “Import payments” in Recued. Reads the collection sheet back and records one receipt per row that carries an amount and the date it arrived. Re-uploading the same sheet records nothing twice, and a row it cannot record is named rather than dropped.
Use “Tenant statement” in Recued. One tenant's account: everything charged, everything received, and the balance derived from the two. Not read off any invoice, because no invoice knows about the payment that arrived against a different month.
Use “Buildings” in Recued. Every building you hold, with a way into each one's units.
Use “Building” in Recued. One building: what it is, and every unit in it. It uses the connections and settings you choose when you run it.
Use “Unit” in Recued. One unit: who is in it now, and every tenancy it has had. It uses the connections and settings you choose when you run it.
Use “Customers” in Recued. Everyone on the book, most recent first — and the way to start a tenancy for one.
Use “Retire or restore a customer” in Recued. Takes a customer off the working list without deleting anything they are attached to, or puts them back.
Use “End a tenancy” in Recued. Closes a contract on a date. The ledger it produced stays exactly as it is — ending a tenancy is not settling it.
Use “Change the rent” in Recued. Sets a contract's rent. Periods already raised keep the amount they were raised at.
Use “Collect the rent” in Recued. Type what each tenant paid, straight into a grid — one row per live tenancy, one save.
Use “Records runtime” in Recued. It helps you complete this workflow using the connections and settings you choose.
Expired is a DATE question, not a status one
A contract can be left active long after its end date passed. This filters on the date itself, as of a day you choose — so "still live" means had not ended before that day, and an open-ended contract always qualifies.
⚠ The comparison happens inside the store. It cannot be done here: the condition operators coerce with Number(), and Number('2026-07-01') is NaN, so a date compared recipe-side matches nothing at all.
Filters only AND, so "ends after this day OR never ends" is two reads, unioned.
Getting around
Each row's button RUNS the next recipe with the id filled in — that is how one screen reaches another. ⚠ There is no URL for a single record: the webclient's recipes route reads #recipes/<recipe-id> and ignores any further segment, and a ?query tail is parsed and discarded. So a screen is reachable, but not bookmarkable or shareable.
Why this one does not page
The live view is the UNION of two reads — contracts ending after the chosen day, and contracts that never end — because filters only AND. A cursor points into ONE ordering of ONE query, so there is no cursor that means "the next page of the union": page 2 of each read merged is not page 2 of the merge.
Rather than page wrongly, the list reads up to the cap and TELLS you when it truncated — the store mints a next cursor on any read it cut short, and Coverage reports it. Raise the cap or narrow the day to see the rest.
⚠ The other screens page because each is a single read.
How it works
Inspect the data fetches, transforms, gates, and output this recipe runs.
Settings
Configurable at install. Defaults shown — change them anytime in Recued.
as of
setting
=
limit
setting
=
100
include expired
setting
=
false