If rent is the heartbeat of your portfolio, autopay is the pacemaker. Done right, you stop chasing checks and start watching deposits clear. Done wrong, you create disputes that end up in small-claims court. Here is what a clean, defensible rent flow looks like in 2026.

ACH First, Cards Second

Card payments feel modern, but a 2.9% processing fee on a $2,000 rent payment is $58 of margin you don't get back. Default tenants to ACH (bank-to-bank) and only enable card as a fallback. ACH costs cents, settles in 1-3 business days, and is what every property management platform built for scale uses under the hood.

Make Autopay Opt-In, Not Opt-Out

You cannot legally enroll a tenant in autopay without their explicit, time-stamped consent. Hide the consent in a 12-page lease addendum and you have a chargeback risk every month. The right pattern: a one-screen mandate during onboarding, a clear "Authorize" button, and a confirmation email the tenant can forward to their bank.

Late Fees Must Match Your Lease and Your State

Late-fee law varies wildly. California caps "reasonable" late fees at roughly 6% of monthly rent. Texas allows higher fees but requires a stated grace period. Florida requires the fee be disclosed in the lease itself. If your software charges a flat $75 late fee on a $900 rent in California, you just handed the tenant an affirmative defense.

  • Store the late-fee schedule per lease, not per portfolio.
  • Apply fees on a cron job after the grace period, not retroactively.
  • Email the tenant the moment the fee posts. Surprise charges trigger disputes.

Pro Tip: The 3-Strike Rule

After three NSF (insufficient funds) returns in a 12-month window, terminate the autopay mandate and require certified funds going forward. Document the policy in the lease so it's never a surprise.

Reconcile Daily, Not Monthly

Waiting until the 5th to discover the 1st-of-month batch failed is how landlords end up two months behind. Modern software pulls Stripe (or your processor) webhooks in real time, posts each settled payment to the ledger, and flags failed ACH attempts the same business day so you can call the tenant before the situation compounds.

How Rentari.ai actually runs this for you

The advice above is the textbook. Here is how Rentari.ai implements each piece, with the parts that catch most platforms out.

ACH-first with Stripe Financial Connections, zero platform markup. When a tenant signs up for autopay, Rentari.ai creates a Stripe SetupIntent for a US bank account, the tenant authenticates with their bank in seconds, and the mandate is stored on the tenant's Stripe customer with idempotency keys on both customer and subscription creation so a refresh or double-click cannot create two subscriptions. Stripe's ACH fee (0.8 percent, capped at $5) is split 50/50 between payer and recipient. Rentari.ai adds zero on top.

The late-fee cron runs every day at 07:00 UTC. It scans every pending rent record where the due date plus the grace period (read from the lease, not a portfolio default) has passed. For each match it posts a Ledger row with transaction_type='late_fee' at whatever amount the lease specifies, then caps that amount against the state's statutory maximum. California rent of $900 with a flat $75 late-fee setting? Rentari.ai posts the legally-defensible cap, not the lease number, and the audit log records both values so you can see what was prevented.

SCRA active-duty protection is on by default. If the tenant flags as a covered servicemember, the late-fee cron skips them and logs the skip. You never have to remember to turn it off.

NSF the way it should work. When Stripe's webhook delivers an ach_charge_returned event, a handler reads the lease's NSF fee, caps it against the state limit, posts a single Ledger row, and emits a customer-facing event. The platform absorbs Stripe's $15 ACH return fee up front and recovers it via that ledger entry. Duplicate NSF fees in a 14-day window are blocked by an idempotency check, so a retry loop on the bank side cannot bill the tenant twice for the same bounce.

Reconciliation drift, daily, before you log in. A second cron at 07:00 UTC sums the ledger and compares against Stripe Connect's available + pending balance. Anything off by more than $1 lands in an audit-log row tagged 'reconciliation_drift' so the admin dashboard surfaces it the same day. The "I'm two months behind" failure mode is the one this cron exists to prevent.

Autopay is not about saving the tenant a click. It is about turning rent collection from a monthly anxiety into a background process you can audit in seconds.