Renewal and Retention
Workflow purpose
Turn the expiring-lease population into a priced renewal plan that (1) offers every resident a renewal inside the overlay's lead-time window, (2) prices each offer using market_to_lease_gap and the resident's prior effective rent, (3) routes any offer outside policy for approval before send, (4) draft-produces resident communications for review, and (5) tracks acceptance through to executed renewal with a loop back to retention-NPV logic when refusals cluster.
Trigger conditions
- Explicit: "build renewal strategy", "renewal plan for June", "price renewals for Ashford Park", "retention plan".
- Implicit: lease with
end_date within renewal_offer_lead_time and no renewal_offered event; renewal_offer_rate below target band; renewal_acceptance_rate trend declining over trailing 90 days.
- Recurring: monthly, one calendar-window ahead (e.g., April build for July expirations) at property grain.
Inputs (required / optional)
| Input |
Type |
Required |
Notes |
| Expiring-lease list |
table |
required |
lease_id, end_date, current effective rent, unit_type, resident tenure |
| Rent roll snapshot |
table |
required |
for loss_to_lease, market_to_lease_gap |
| Market rent reference |
csv |
required |
by unit_type and submarket |
| Concession policy overlay |
yaml |
required |
ceiling and cases allowed |
| Renewal uplift bands |
csv |
required |
overlay-driven per segment / market |
| Resident ledger (T12) |
table |
optional |
payment history informing retention-NPV case |
| Turn cost reference |
csv |
optional |
per-unit turn cost for refusal-case NPV |
| Jurisdiction notice rules |
yaml |
optional |
flags whether renewal notice is statutory |
Outputs
| Output |
Type |
Shape |
| Renewal segmentation table |
table |
lease_id, tier, prior effective rent, market rent, proposed offer, band, gap |
| Renewal strategy memo |
memo |
narrative with blended uplift, expected acceptance, budget impact |
| Draft resident communication set |
email_draft |
per-lease letter templates, legal_review_required where statutory |
| Approval request bundle |
list |
any offer outside policy band |
| Acceptance tracker |
checklist |
follow-up cadence, due dates |
Required context
Asset_class, segment, form_factor, lifecycle_stage, management_mode, market, role. The workflow refuses to price without a market rent reference; if absent, routes to workflows/market_rent_refresh first.
Process
- Pull expiring-lease population. Include leases with
end_date within the overlay's renewal_offer_lead_time. Exclude transfers (same household, new unit — handled separately). Annotate residents with tenure, payment record flag (from ledger if provided), and unit turn scope tag (classic vs. renovated).
- Compute market rent per unit. Use
reference/normalized/market_rents__{market}_mf.csv with submarket and unit_type keys. Compute market_to_lease_gap per lease and the property's weighted loss_to_lease.
- Segment into tiers (decision point).
- Tier A: in-place effective rent > market (negative
market_to_lease_gap). Default offer: flat or overlay-defined decrease to retain; case-by-case concession review only.
- Tier B: in-place rent within overlay's band of market. Default offer: median overlay renewal uplift.
- Tier C: in-place rent < market by more than overlay's threshold. Default offer: closer-to-market uplift, with a short-term option for negotiation room.
- Tier D (flag only): payment-record flag, lease-compliance flag, or non-renewal signal from ops. These are not priced in this workflow; they route to the PM for human decision and, if a non-renewal is contemplated, approval gate row 1 opens when jurisdiction treats non-renewal as notice.
- Check every offer against policy bands. Any offer whose uplift falls outside the overlay's renewal uplift band requires
approval_request row 13. Any offer with a concession exceeds policy also requires row 13. Both open automatically; the workflow does not send.
- Fair-housing guardrail scan. Scan for systematic differential pricing by unit cluster that correlates with protected-class proxies (unit size, building location). Surface statistical outliers for regional review; never propose corrective pricing on a protected-class basis.
- Acceptance estimation. Compute expected
renewal_acceptance_rate by tier using overlay bands and the property's trailing 90-day baseline. Express downside: if Tier B refusal rate rises X points, expected turnover_rate, average_days_vacant, and blended_lease_trade_out shift; show the sensitivity.
- Retention-NPV check (decision point).
- If Tier C refusal case would produce a weighted turn cost + vacancy + new-lease trade-out loss that exceeds the dollar value of the accepted uplift, the workflow proposes a softer Tier C offer inside policy before recommending the stretch offer.
- If the softer offer is still refused on historical data, flag the NPV gap and route to regional_manager for a human call; do not resolve autonomously.
- Draft communication set. Produce per-lease renewal letters with
draft_for_review banner. Mark legal_review_required on any letter whose jurisdiction treats renewal notice (or rent-increase notice) as statutory. Include a portal-message variant and an email variant.
- Approval routing. Bundle every offer requiring
approval_request row 13 into a single approval packet for the regional_manager, with per-lease rationale and sensitivity numbers. Executor does not send until approvals return approved.
- Acceptance tracking. Produce a follow-up checklist: offer sent -> response due -> second nudge window -> non-renewal decision date. Include the PM's response SLA.
- Confidence banner. Surface reference
as_of_date and status tags. Note that jurisdiction-specific rules are overlay-driven.
Metrics used
renewal_offer_rate, renewal_acceptance_rate, rent_growth_renewal, renewal_rent_delta_dollars, blended_lease_trade_out, market_to_lease_gap, loss_to_lease, concession_rate, turnover_rate, average_days_vacant.
Reference files used
reference/normalized/market_rents__{market}_mf.csv
reference/normalized/concession_benchmarks__{market}_mf.csv
reference/derived/role_kpi_targets.csv
reference/derived/renewal_uplift_bands__middle_market.csv
reference/normalized/approval_threshold_defaults.csv
overlays/segments/middle_market/service_standards.md
Escalation points
- Any offer above policy uplift band ->
approval_request row 13.
- Any concession above policy ->
approval_request row 13.
- Non-renewal contemplated where jurisdiction treats non-renewal as statutory notice ->
approval_request row 1.
- Fair-housing disparity signal ->
approval_request row 3.
Required approvals
- Concession above policy (row 13).
- Non-standard payment plan attached to a renewal (row 13).
- Jurisdictional non-renewal notice (row 1 if statutory).
Failure modes
- Blanket concessions to hit acceptance rate. Fix: every concession is per-lease and routes above policy.
- Pricing on last quarter's market. Fix: market rent reference is required; stale references (> overlay threshold) force a
workflows/market_rent_refresh before the workflow runs.
- Sending letters that are statutory notices without legal review. Fix:
legal_review_required banner mandatory in jurisdictions that treat renewal notice as notice.
- Using payment-history flags as a screening proxy. Fix: ledger data is only used in NPV math and PM handoff, not as a pricing input.
- Over-indexing on acceptance rate, ignoring
blended_lease_trade_out. Fix: report acceptance and trade-out together; tier breakouts show the trade-off.
- Silent sample-data usage. Fix: confidence banner surfaces status tags; sample rows never presented as operating fact.
Edge cases
- Short-term lease-up property: use a tighter uplift band (lease-up overlay) and flag when renewal uplift would undermine stabilization pace.
- Renovation unit recently delivered: renewal pricing must reflect renovation unit type; exclude pre-renovation leases from benchmarking.
- Resident in active workout or partial payment plan: route to PM; renewal offer conditional on plan resolution.
- Notice already filed (non-renewal in process): exclude from renewal plan; appears in
workflows/move_out_administration instead.
- Very small expiring cohort (< overlay minimum): run the plan but annotate low-sample confidence.
Example invocations
- "Build the June renewal plan for Ashford Park, 28 expirations. Stay inside policy on concessions."
- "Retention is softening in Willow Creek. Produce a renewal memo with tiering and sensitivity, flag any NPV gaps."
- "Price renewal offers for the 14 leases expiring August at Riverbend. Draft the resident letters and route anything above policy."
Example outputs
Output — Renewal plan (abridged, Ashford Park, 28 leases expiring 2026-06)
Summary. 28 expirations segmented A / B / C / D. Weighted market_to_lease_gap at property: within band. Expected renewal_acceptance_rate consistent with trailing 90-day baseline.
Segmentation.
- Tier A (8 leases): in-place > market. Proposed offer: flat with explicit decline option; no concession proposed.
- Tier B (13 leases): in-place within band of market. Proposed offer: median overlay renewal uplift; no concession.
- Tier C (5 leases): in-place < market by more than overlay threshold. Proposed offer: closer-to-market; short-term option as counter.
- Tier D (2 leases): payment-flag / compliance-flag. Handed to PM for decision; not priced here.
Approvals. No Tier B / C offers outside band. Two Tier A cases carry an overlay-permitted minor decrease; within policy. Zero approval_request row 13 opened.
Communications. 28 resident letters drafted with draft_for_review; 0 marked legal_review_required (jurisdiction overlay: Charlotte does not treat renewal notice as statutory). Portal-message variant produced for each.
Sensitivity. If Tier B acceptance falls 5 points vs. baseline, blended_lease_trade_out softens and expected incremental vacancy drives turn cost and lost rent per the reference library; memo shows the dollar impact.
Confidence banner. market_rents__charlotte_mf@as_of=2026-03-31, status=sample. renewal_uplift_bands__middle_market@as_of=2026-03-31, status=starter.
1---2name: renewal-and-retention3description: Plans, prices, and executes the renewal cycle for leases in the renewal-offer window. Segments expiring leases into pricing tiers, computes per-tier offers using market_to_lease_gap and prior effective rent, checks every offer against policy bands, and produces a draft communication set with all legal-notice templates flagged for review. Guards against retention through concession creep. Runs monthly at the property and per-tagged trigger when a lease enters its renewal-offer window.4---56# Renewal and Retention78## Workflow purpose910Turn the expiring-lease population into a priced renewal plan that (1) offers every resident a renewal inside the overlay's lead-time window, (2) prices each offer using `market_to_lease_gap` and the resident's prior effective rent, (3) routes any offer outside policy for approval before send, (4) draft-produces resident communications for review, and (5) tracks acceptance through to executed renewal with a loop back to retention-NPV logic when refusals cluster.1112## Trigger conditions1314- **Explicit:** "build renewal strategy", "renewal plan for June", "price renewals for Ashford Park", "retention plan".15- **Implicit:** lease with `end_date` within `renewal_offer_lead_time` and no renewal_offered event; `renewal_offer_rate` below target band; `renewal_acceptance_rate` trend declining over trailing 90 days.16- **Recurring:** monthly, one calendar-window ahead (e.g., April build for July expirations) at property grain.1718## Inputs (required / optional)1920| Input | Type | Required | Notes |21|---|---|---|---|22| Expiring-lease list | table | required | lease_id, end_date, current effective rent, unit_type, resident tenure |23| Rent roll snapshot | table | required | for `loss_to_lease`, `market_to_lease_gap` |24| Market rent reference | csv | required | by unit_type and submarket |25| Concession policy overlay | yaml | required | ceiling and cases allowed |26| Renewal uplift bands | csv | required | overlay-driven per segment / market |27| Resident ledger (T12) | table | optional | payment history informing retention-NPV case |28| Turn cost reference | csv | optional | per-unit turn cost for refusal-case NPV |29| Jurisdiction notice rules | yaml | optional | flags whether renewal notice is statutory |3031## Outputs3233| Output | Type | Shape |34|---|---|---|35| Renewal segmentation table | table | lease_id, tier, prior effective rent, market rent, proposed offer, band, gap |36| Renewal strategy memo | `memo` | narrative with blended uplift, expected acceptance, budget impact |37| Draft resident communication set | `email_draft` | per-lease letter templates, `legal_review_required` where statutory |38| Approval request bundle | list | any offer outside policy band |39| Acceptance tracker | `checklist` | follow-up cadence, due dates |4041## Required context4243Asset_class, segment, form_factor, lifecycle_stage, management_mode, market, role. The workflow refuses to price without a market rent reference; if absent, routes to `workflows/market_rent_refresh` first.4445## Process46471. **Pull expiring-lease population.** Include leases with `end_date` within the overlay's `renewal_offer_lead_time`. Exclude transfers (same household, new unit — handled separately). Annotate residents with tenure, payment record flag (from ledger if provided), and unit turn scope tag (classic vs. renovated).482. **Compute market rent per unit.** Use `reference/normalized/market_rents__{market}_mf.csv` with submarket and unit_type keys. Compute `market_to_lease_gap` per lease and the property's weighted `loss_to_lease`.493. **Segment into tiers (decision point).**50 - **Tier A:** in-place effective rent > market (negative `market_to_lease_gap`). Default offer: flat or overlay-defined decrease to retain; case-by-case concession review only.51 - **Tier B:** in-place rent within overlay's band of market. Default offer: median overlay renewal uplift.52 - **Tier C:** in-place rent < market by more than overlay's threshold. Default offer: closer-to-market uplift, with a short-term option for negotiation room.53 - **Tier D (flag only):** payment-record flag, lease-compliance flag, or non-renewal signal from ops. These are not priced in this workflow; they route to the PM for human decision and, if a non-renewal is contemplated, approval gate row 1 opens when jurisdiction treats non-renewal as notice.544. **Check every offer against policy bands.** Any offer whose uplift falls outside the overlay's renewal uplift band requires `approval_request` row 13. Any offer with a concession exceeds policy also requires row 13. Both open automatically; the workflow does not send.555. **Fair-housing guardrail scan.** Scan for systematic differential pricing by unit cluster that correlates with protected-class proxies (unit size, building location). Surface statistical outliers for regional review; never propose corrective pricing on a protected-class basis.566. **Acceptance estimation.** Compute expected `renewal_acceptance_rate` by tier using overlay bands and the property's trailing 90-day baseline. Express downside: if Tier B refusal rate rises X points, expected `turnover_rate`, `average_days_vacant`, and `blended_lease_trade_out` shift; show the sensitivity.577. **Retention-NPV check (decision point).**58 - If Tier C refusal case would produce a weighted turn cost + vacancy + new-lease trade-out loss that exceeds the dollar value of the accepted uplift, the workflow proposes a softer Tier C offer inside policy before recommending the stretch offer.59 - If the softer offer is still refused on historical data, flag the NPV gap and route to regional_manager for a human call; do not resolve autonomously.608. **Draft communication set.** Produce per-lease renewal letters with `draft_for_review` banner. Mark `legal_review_required` on any letter whose jurisdiction treats renewal notice (or rent-increase notice) as statutory. Include a portal-message variant and an email variant.619. **Approval routing.** Bundle every offer requiring `approval_request` row 13 into a single approval packet for the regional_manager, with per-lease rationale and sensitivity numbers. Executor does not send until approvals return `approved`.6210. **Acceptance tracking.** Produce a follow-up checklist: offer sent -> response due -> second nudge window -> non-renewal decision date. Include the PM's response SLA.6311. **Confidence banner.** Surface reference `as_of_date` and `status` tags. Note that jurisdiction-specific rules are overlay-driven.6465## Metrics used6667`renewal_offer_rate`, `renewal_acceptance_rate`, `rent_growth_renewal`, `renewal_rent_delta_dollars`, `blended_lease_trade_out`, `market_to_lease_gap`, `loss_to_lease`, `concession_rate`, `turnover_rate`, `average_days_vacant`.6869## Reference files used7071- `reference/normalized/market_rents__{market}_mf.csv`72- `reference/normalized/concession_benchmarks__{market}_mf.csv`73- `reference/derived/role_kpi_targets.csv`74- `reference/derived/renewal_uplift_bands__middle_market.csv`75- `reference/normalized/approval_threshold_defaults.csv`76- `overlays/segments/middle_market/service_standards.md`7778## Escalation points7980- Any offer above policy uplift band -> `approval_request` row 13.81- Any concession above policy -> `approval_request` row 13.82- Non-renewal contemplated where jurisdiction treats non-renewal as statutory notice -> `approval_request` row 1.83- Fair-housing disparity signal -> `approval_request` row 3.8485## Required approvals8687- Concession above policy (row 13).88- Non-standard payment plan attached to a renewal (row 13).89- Jurisdictional non-renewal notice (row 1 if statutory).9091## Failure modes92931. Blanket concessions to hit acceptance rate. Fix: every concession is per-lease and routes above policy.942. Pricing on last quarter's market. Fix: market rent reference is required; stale references (> overlay threshold) force a `workflows/market_rent_refresh` before the workflow runs.953. Sending letters that are statutory notices without legal review. Fix: `legal_review_required` banner mandatory in jurisdictions that treat renewal notice as notice.964. Using payment-history flags as a screening proxy. Fix: ledger data is only used in NPV math and PM handoff, not as a pricing input.975. Over-indexing on acceptance rate, ignoring `blended_lease_trade_out`. Fix: report acceptance and trade-out together; tier breakouts show the trade-off.986. Silent sample-data usage. Fix: confidence banner surfaces status tags; sample rows never presented as operating fact.99100## Edge cases101102- **Short-term lease-up property:** use a tighter uplift band (lease-up overlay) and flag when renewal uplift would undermine stabilization pace.103- **Renovation unit recently delivered:** renewal pricing must reflect renovation unit type; exclude pre-renovation leases from benchmarking.104- **Resident in active workout or partial payment plan:** route to PM; renewal offer conditional on plan resolution.105- **Notice already filed (non-renewal in process):** exclude from renewal plan; appears in `workflows/move_out_administration` instead.106- **Very small expiring cohort (< overlay minimum):** run the plan but annotate low-sample confidence.107108## Example invocations1091101. "Build the June renewal plan for Ashford Park, 28 expirations. Stay inside policy on concessions."1112. "Retention is softening in Willow Creek. Produce a renewal memo with tiering and sensitivity, flag any NPV gaps."1123. "Price renewal offers for the 14 leases expiring August at Riverbend. Draft the resident letters and route anything above policy."113114## Example outputs115116### Output — Renewal plan (abridged, Ashford Park, 28 leases expiring 2026-06)117118**Summary.** 28 expirations segmented A / B / C / D. Weighted `market_to_lease_gap` at property: within band. Expected `renewal_acceptance_rate` consistent with trailing 90-day baseline.119120**Segmentation.**121122- Tier A (8 leases): in-place > market. Proposed offer: flat with explicit decline option; no concession proposed.123- Tier B (13 leases): in-place within band of market. Proposed offer: median overlay renewal uplift; no concession.124- Tier C (5 leases): in-place < market by more than overlay threshold. Proposed offer: closer-to-market; short-term option as counter.125- Tier D (2 leases): payment-flag / compliance-flag. Handed to PM for decision; not priced here.126127**Approvals.** No Tier B / C offers outside band. Two Tier A cases carry an overlay-permitted minor decrease; within policy. Zero `approval_request` row 13 opened.128129**Communications.** 28 resident letters drafted with `draft_for_review`; 0 marked `legal_review_required` (jurisdiction overlay: Charlotte does not treat renewal notice as statutory). Portal-message variant produced for each.130131**Sensitivity.** If Tier B acceptance falls 5 points vs. baseline, `blended_lease_trade_out` softens and expected incremental vacancy drives turn cost and lost rent per the reference library; memo shows the dollar impact.132133**Confidence banner.** `market_rents__charlotte_mf@as_of=2026-03-31, status=sample`. `renewal_uplift_bands__middle_market@as_of=2026-03-31, status=starter`.