Agent setup guide
Lease Renewal Planner
Monthly: drafts renewal offers by your own rent rule for leases ending in 60–90 days — sent only after you approve the batch.
What it does
Monthly: drafts renewal offers by your own rent rule for leases ending in 60–90 days — sent only after you approve the batch.
- On the 1st of each month, reads your leases sheet in Google Sheets (up to 100 leases ending in the window per run).
- Dates are worked out in code, never by the AI: days until or since each date, the window and business days are computed in your workflow's time zone, and records outside the window are skipped before the AI sees them.
- For each lease ending in 60–90 days (or your window) that isn't marked yet, AI applies your written rent rule exactly, shows its working and drafts a renewal offer with your terms, the reply-by date (computed in code) and your sign-off.
- The rule's percentage step, the monthly increase and the % change are recalculated in code before you review — never by the AI; anything the AI got wrong is corrected and flagged to the reviewer (rounding, caps and overrides from your rule are shown for you to confirm).
- Leases your sheet marks “Do not renew” are listed as non-renewal notices to prepare; leases it can't draft safely (no email, no rent, the rule doesn't fit) are held for you.
- The whole batch waits in Reviews; the property manager edits any offer or holds any lease, then approves.
- Each approved offer is checked in code (still an offer, still marked to send, 1–5 valid tenant emails, no placeholders) and by an AI wording check that stops only a rent that differs from the approved figures, legal statements, pressure and anything about the tenant as a person. Then it is emailed with replies to your leasing inbox, and its row is marked “Renewal offer sent” with the date.
- A summary — offers sent, notices to prepare, leases that need you — is posted to your Slack channel.
- The summary is counted in code from what each step really did (sent, held, skipped, failed), so it never reports a held message as sent.
What it needs
- A paid plan (agents run live on paid plans).
- An AI provider key (Settings → AI Providers).
- Google Sheets (with edit access to the leases sheet) and Slack, connected in Settings → Integrations.
- A leases sheet with tenant emails, lease end dates, current rents, a decision column and an empty status column.
- Your written rent rule and renewal terms.
What it doesn't do
- It drafts and organises renewal offers for a person to approve; it makes no legal decision. It never decides the rent (only your written rule does) or whether to renew (only your sheet's decision column does).
- It doesn't check rent-control, rent-increase or notice laws: you set the rule and you're responsible for compliance.
- It follows your rent rule only and never uses fair-housing-sensitive criteria — nothing about the tenant as a person changes an offer.
- It doesn't send non-renewal notices or the renewal agreement; the tenant signs through your usual process.
- Nothing is emailed before the batch is approved. It skips rows whose lease end it can't read (they're listed in the summary) and drafts up to 100 leases per run, so keep ended leases in another tab.
Availability and plans
Available
Its workflow is built and tested, and every app it needs is live. You can get it and set it up now.
Included free on the Enterprise plan; on other paid plans it's a one-time purchase per workspace (the price is on the Agents page). The Agents page in the app always shows its current status.
Before you start
- A paid plan: agents run live, and the Free plan only runs Dry Runs.
- An AI provider key (OpenAI, Anthropic, Google and more) in Settings → AI Providers. AI usage is billed by your provider.
- These apps, connected in Settings → Integrations: Google Sheets and Slack.
- Nothing to send: the agent runs on a schedule.
- About 25 minutes.
Set it up step by step
Get the agent first (buy it, or it's already yours when your plan includes it), then in Agents → My agents press “Set up this agent”. That creates the agent's workflow in your workspace (it counts towards your plan's workflow limit) and opens the canvas with a setup checklist above it. Each item links to the exact place to go and ticks itself off when it's done.
1. Connect your AI provider
The AI steps run on your own key (OpenAI, Anthropic, Google and more). Add one in Settings → AI Providers.
2. Connect Google Sheets
Connect the Google account that can open and edit your leases spreadsheet (Settings → Integrations → Google Sheets).
3. Connect Slack
Connect the Slack workspace your leasing team uses (Settings → Integrations → Slack).
4. Write your renewal rules
Open “Draft the renewal offer (or skip)” and replace the placeholder with your rent rule, terms and sign-off. The 60–90 day window and the reply window are set in “Check the lease end dates”.
| Setting | What to enter | In step |
|---|---|---|
| Your renewal rules | Replace the placeholder with your company name, the rent rule (exact formula, rounding and any cap), renewal term options, how tenants accept, and your sign-off. Only rules about the unit and lease — never about the tenant as a person. The 60–90 day window and the 21-day reply window are set in “Check the lease end dates”. It starts as “[PASTE YOUR COMPANY NAME, YOUR RENT RULE (E.G. +3% ROUNDED TO THE NEAREST $5), RENEWAL TERM OPTIONS, HOW TENANTS ACCEPT, WHO GETS NON-RENEWAL NOTICES AND YOUR SIGN-OFF HERE]” until you replace it. | “Draft the renewal offer (or skip)” |
5. Pick your leases sheet
Open “Read your leases sheet” and “Mark the lease row” and pick the same account, spreadsheet and tab in both, then enter the status column letter.
| Setting | What to enter | In step |
|---|---|---|
| Google account (read leases) | The Google account that can open your leases spreadsheet. Pick your connected Google Sheets account. | “Read your leases sheet” |
| Leases spreadsheet | Paste the link of the spreadsheet with your leases. | “Read your leases sheet” |
| Leases tab | The tab with one row per current lease, e.g. Leases. | “Read your leases sheet” |
| Google account (mark rows) | The same Google account, used to mark each handled lease row. Pick your connected Google Sheets account. | “Mark the lease row” |
| Leases spreadsheet (same one) | Paste the same spreadsheet link again, so handled rows are marked in place. | “Mark the lease row” |
| Leases tab (same one) | The same tab name as above. | “Mark the lease row” |
| Status column letter | The column letter of your empty “Renewal status” column (the date goes in the column to its right), e.g. I. | “Mark the lease row” |
6. Add your leasing inbox and Slack channel
Open “Email the renewal offer” and enter the Reply-to address, then “Post the summary to Slack” and pick the account and channel.
| Setting | What to enter | In step |
|---|---|---|
| Your leasing inbox (replies) | Tenants' replies to the offer come back to this address (Reply-to). | “Email the renewal offer” |
| Slack account | The Slack workspace your leasing team uses. Pick your connected Slack account. | “Post the summary to Slack” |
| Slack channel for the summary | The channel the monthly summary is posted to, e.g. #leasing. | “Post the summary to Slack” |
7. Test it with Dry Run
Press Dry Run: the agent runs on sample data with no messages sent and nothing written to your apps.
8. Switch the trigger on
Open the trigger, set your time zone (lease end days are counted in it) and switch the schedule on. It runs on the 1st of each month at 8:00.
How it works
The agent is a normal workflow with 19 steps (2 AI steps, with a person approving in Reviews). You can open, edit and monitor it like any other workflow.
- 1st of each month at 8:00 — Runs on a schedule (cron 0 8 1 * *, UTC — change it in the trigger's settings). Runs on the first morning of every month. Set your time zone on the trigger: “today” and the 60–90 day window are counted in that zone.
- Read your leases sheet — Google Sheets: Read rows. Reads your leases tab in Google Sheets: one row per lease with tenant, email, property, unit, lease end, current rent, your renewal decision and the agent's status column.
- Check the lease end dates — Step. In code, not AI: works out the days to each lease's end in your time zone and keeps only leases ending in 60–90 days. It also works out each lease's effective renewal date (the day after the lease ends) and the reply-by date (21 days from today). Change the window here (within.min / within.max) and the reply window in add (reply_by days).
- Each lease ending soon — Repeats the steps below for each item (up to 100 per run). Repeats the draft step for every lease the date check kept (up to 100 per run).
- [For each item — “Each lease ending soon”] Draft the renewal offer (or skip) — AI step (runs on your AI provider key). AI applies your stated rent rule exactly (showing its working) and drafts the offer — or lists it for a non-renewal notice when your sheet says you decided not to renew. The 60–90 day window, the effective date and the reply-by date were already worked out in code.
- [For each item — “Each lease ending soon”] Check the math — Step. Recalculates in code — not by AI — the rule's percentage step (current rent × (1 + %)), the increase in dollars and the % change from the current to the new rent, corrects any figure the AI got wrong and lists it in math_check for the reviewer. Rounding, caps and overrides from your rule are left for the reviewer to confirm.
- Approve this month's batch — A person approves or rejects it in Reviews (the run waits). All of this month's drafts wait in Reviews together. The property manager checks every rent and wording, edits any offer, sets send to false on any that shouldn't go, and approves; nothing is sent before that.
- Each approved lease — Repeats the steps below for each item (up to 100 per run). Branch: Approved. Repeats the wording check, the code checks, the send and the row update for every lease in the approved batch.
- [For each item — “Each approved lease”] Non-renewal? — Step. In code: is this lease marked “non_renewal” in the approved batch? Those are marked for notice prep with no email; everything else goes through the wording check and the code checks.
- [For each item — “Each approved lease”] Offer or non-renewal? — Decision: picks the branch to follow. Non-renewals your sheet decided are marked for notice prep (no email); everything else goes through the checks.
- [For each item — “Each approved lease”] Final check on the wording — AI step (runs on your AI provider key). Branch: Offer. AI reads each approved offer for a rent that differs from the approved figures, legal statements, pressure and anything about the tenant as a person — stating the unit, the lease end, the new rent, the terms and the reply-by date is fine. It must quote the exact sentence it objects to.
- [For each item — “Each approved lease”] Check before sending — Step. In code: drafted as an offer, still marked to send, 1–5 valid tenant emails, a row number, a new rent, and a subject and body with no placeholders left — plus the wording check's verdict. Anything that fails is held, with the reason.
- [For each item — “Each approved lease”] Send it? — Decision: picks the branch to follow. Offers that pass every check are emailed and their row marked; the rest are held and listed in the summary with the reason.
- [For each item — “Each approved lease”] Email the renewal offer — Sends an email from your workspace's sender. Branch: Passes. Sends the approved offer to the tenant from your workspace's sender, with replies going to your leasing inbox.
- [For each item — “Each approved lease”] Mark the lease row — Google Sheets: Update a row. Branch: Non-renewal. Writes the status (“Renewal offer sent” or “Non-renewal — notice to prepare”) and today's date into the lease's row, so next month's run skips it.
- [For each item — “Each approved lease”] Held — Kept in the run history. Branch: Held. Skipped, on hold, set to not send or stopped by a check; listed in the Slack summary with the reason.
- Count what happened — Step. In code, not AI: sorts every approved lease by what really happened — offer sent, non-renewal marked, skipped, held (with the reason) or failed — and lists the leases outside the window.
- Post the summary to Slack — Slack: Post a message. Posts the batch summary — counted in code: offers sent, non-renewal notices to prepare, leases that need you — to your leasing channel.
- Done — Kept in the run history. The run history keeps the batch, every outcome and the summary.
Test it with Dry Run
Press Dry Run in the canvas. The agent runs on the sample data stored on its trigger (the “Sample data for Dry Run” box), so you can check every step's output before anything is live.
- Nothing is sent or written: app actions, emails and Slack posts are simulated, and AI steps don't call your AI provider.
- Approval steps use the Dry Run decision you pick in the step's settings (approved, rejected or timeout), so you can try each branch.
- For-each loops repeat only the first 3 items.
Go live
- Open the trigger, set your time zone (lease end days are counted in it) and switch the schedule on. It runs on the 1st of each month at 8:00.
- Scheduled runs start only once the schedule is activated, and can't repeat faster than your plan's minimum interval.
- The setup checklist adds a “paid plan” item before activation: live runs need a paid plan (the Free plan only runs Dry Runs).
- When every checklist item is done and the trigger is on, the checklist says “Live — this agent is running”. Follow its runs in the workflow's History tab and in Analytics → Agents.
Questions
What should the leases sheet look like?
One row per current lease with a header row: Tenant, Email, Property, Unit, Lease end, Current rent, Decision (blank, Renew, Do not renew or Hold) and two empty columns at the end for the agent: Renewal status and Status date. Column names can vary; the date check looks for a lease end or expiration column. Dates like 2026-12-31, 12/31/2026 or December 31, 2026 all work. Keep ended leases in another tab.
How is the 60–90 day window worked out?
In code, not by the AI: the agent counts the days from today (in your trigger's time zone) to each lease end, and only leases inside the window reach the AI. The effective date (the day after the lease ends) and the reply-by date (21 days from today) are computed the same way. To change them, open “Check the lease end dates” and edit within.min / within.max or the reply_by days.
Who decides the rent?
You do, through the rent rule you write (e.g. “+3%, rounded to the nearest $5, capped at $100”). The agent applies it exactly and shows its working; the percentage step, the increase and the % change are recalculated in code (rounding and caps are shown for you to confirm), and the property manager approves every offer before it's sent. It doesn't check rent-control or notice laws.
Does it decide not to renew anyone?
No. It only lists the leases your sheet marks “Do not renew” so you can prepare those notices through your usual process.
Troubleshooting
- “No AI provider connected” or a rejected key: connect or fix the key in Settings → AI Providers, then press Test there.
- A checklist item stays unticked: the setting is still empty or still contains its placeholder text. Open the step from the checklist and fill it in.
- An app step fails with “Needs reconnect”: the account's access was revoked or expired. Reconnect it in Settings → Integrations.
- Slack says the app isn't in the channel: in Slack, type /invite @Fluxo Flow in that channel (always needed for private channels).
- It didn't run at the expected time: the schedule must be activated, and its time is in the trigger's timezone.
- A run shows as paused: it's waiting for someone in Reviews to approve or reject it.
- A step failed: open the run in History and check that step in the Trace tab for the error and what it received.
Generated from the agent's own workflow, so it always matches what the agent does. Last updated .