Recued
Menu
← Back to recipes

Contracts

by recued-core v5 8 views

Use “Contracts” in Recued. Live tenancies by default; expired ones only when you ask.

Complete workflow

Rental Book 19 pinned recipes

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.

Contracts
This recipe

Use “Contracts” in Recued. Live tenancies by default; expired ones only when you ask.

pack:rental-booklistcontractfilter
by recued-core pinned v5

Use “Add a building” in Recued. Records one building or complex. Units hang off it.

pack:rental-bookbuildingsetup
by recued-core pinned v2

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.

pack:rental-bookunitsetup
by recued-core pinned v2

Use “Add a tenant” in Recued. Records one tenant and how they pay: cash, autopay, or stripe.

pack:rental-bookcustomertenantsetup
by recued-core pinned v3

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.

pack:rental-bookcontractsetup
by recued-core pinned v4

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.

pack:rental-bookbillingchargescheduled
by recued-core pinned v4
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.

pack:rental-bookreceiptpaymentmanual
by recued-core pinned v3

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.

pack:rental-bookreportexportcsv
by recued-core pinned v2

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.

pack:rental-bookreceiptpaymentimport
by recued-core pinned v5

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.

pack:rental-bookstatementreportledger
by recued-core pinned v5

Use “Buildings” in Recued. Every building you hold, with a way into each one's units.

pack:rental-booklistbuildingnavigation
by recued-core pinned v5

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.

pack:rental-bookdetailbuildingnavigation
by recued-core pinned v5

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.

pack:rental-bookdetailunittenancy
by recued-core pinned v4

Use “Customers” in Recued. Everyone on the book, most recent first — and the way to start a tenancy for one.

pack:rental-booklistcustomerpicker
by recued-core pinned v5

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.

pack:rental-bookcustomerhousekeeping
by recued-core pinned v5

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.

pack:rental-bookcontractterminationlifecycle
by recued-core pinned v5

Use “Change the rent” in Recued. Sets a contract's rent. Periods already raised keep the amount they were raised at.

pack:rental-bookcontractrentlifecycle
by recued-core pinned v5

Use “Collect the rent” in Recued. Type what each tenant paid, straight into a grid — one row per live tenancy, one save.

pack:rental-bookreceiptpaymentbatch
by recued-core pinned v5
View pack details, dependencies, and permissions →

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 23 steps

Inspect the data fetches, transforms, gates, and output this recipe runs.

Process (23 steps)
as_of_in trim
Trim whitespace from setting as of
today_win date_period
Apply date_period
today truncate
Truncate today win start to a max length
as_of default
Apply default
cap clamp
Clamp setting limit between 1 and 200
all_read ?
skip: config.include_expired not_equal true
dated_read ?
skip: config.include_expired equal true
open_read ?
skip: config.include_expired equal true
defaults defaults
Apply defaults
live flatten
Flatten nested lists in
everything default
Apply default
both flatten
Flatten nested lists in
rows unique
Remove duplicates from
count count
Count items in rows
more_dated compare
Check if dated read next cursor has data
more_open compare
Check if open read next cursor has data
more_all compare
Check if all read next cursor has data
truncated any
Check if any of the conditions are true
completeness ternary
Apply ternary
table_rows map
Extract from each item
table to_table
Format results as a data table
scope ternary
Apply ternary
card to_summary
Format results as a summary card
Settings 3 configurable

Configurable at install. Defaults shown — change them anytime in Recued.

as of setting =
limit setting = 100
include expired setting = false

About

Tags

pack:rental-booklistcontractfilternavigation

Details

23 steps 3 configurable settings recipe_id: list-contracts