Stripe ACH & card processing
Bank account at 0.8 % capped at $5, card at 2.9 % + $0.30. Everything through Stripe. PCI scope: zero. Account numbers never touch your server.
Tenants pay rent online; Stripe Subscriptions charges the right amount on the right day, every month. You run the server. You own the data. EZPM adds zero per-tenant fees on top of Stripe’s standard rates.
Bank account at 0.8 % capped at $5, card at 2.9 % + $0.30. Everything through Stripe. PCI scope: zero. Account numbers never touch your server.
Stripe Subscriptions owns the schedule. Server can be offline at charge time and rent still bills. Webhooks reconcile on the way back up; a CLI catches anything missed during multi-day outages.
Instant verification via Stripe Financial Connections. Microdeposit fallback for banks that need it. Either path lands the same verified PaymentMethod.
Email + password, passkeys, or federated identity. Auth.js v5 JWE cookies; federated logout kills both sessions. Admins can fire a Zitadel password-reset email from the tenant page.
Tenants report issues with photos from their phone; admins move status open → in progress → resolved. Files get UUID names, server-side type/size checks, and ownership-checked serving — no public URLs.
A comment thread per request. Replies sync both directions with Mattermost; status shows as a single emoji reaction (🔨/✅/🚫). Reply from chat, it lands in the app and emails the tenant.
A per-tenant folder both sides upload to — lease, insurance, proof of income, notices. PDF, images, and office files up to 25 MB, served only through an ownership-checked route.
Post a notice every tenant sees on their dashboard, optionally emailed to all of them in one click. Water shut-offs, reminders, policy changes.
Receipts, maintenance status, and reply emails on one shared template, sent over any SMTP relay. Each tenant turns off the emails they don’t want in their settings.
Signups, subscriptions, charges, and failures post to a channel. Each maintenance request is its own thread. An optional WebSocket bridge gives you two-way replies — works with a private channel.
KPI cards plus charts for revenue, payments, tenant growth, and maintenance, over 1M / 3M / 6M / 1Y / 2Y / Max. Every card clicks through to the exact filtered list.
A token-guarded /api/metrics endpoint exposes business gauges in Prometheus format — scrape it, graph it in Grafana today. Runtime metrics drop into the same endpoint later.
Every Stripe event INSERTs into a unique-id table with ON CONFLICT DO NOTHING. Retries become no-ops. A reconcile CLI replays anything Stripe couldn’t deliver during an outage.
App Router, React 19, TypeScript. Docker compose for postgres + PostgREST + Caddy. Coolify-friendly, runs on a $5/mo VPS or a home server behind a Cloudflare tunnel.
Source available. Modify, redeploy, fork. Derivative SaaS must release modifications. No license server, no callbacks, no telemetry.
Coolify, Render, a home server — anywhere docker runs. One compose file for the app, one for the database stack. ~10 minutes from clone to running.
Drop your Stripe keys and webhook secret into the env. Register the OIDC callback URL in Zitadel. The first user who logs in becomes admin, atomically.
Admin enters tenant email, property, and rent. Zitadel sends the invite. Tenant sets a password and lands on their dashboard automatically — no second login screen.
Stripe PaymentElement handles the form. Bank picker for instant ACH verification; manual entry falls through to microdeposits. Subscription auto-creates on the first verified method.
Every month, automatically. Webhooks update the payments mirror. Failed charges go to Stripe Smart Retries; bounced ACH and disputes fire normal events you can see in the admin.
| Payment method | Stripe rate | $1,500 rent | $2,500 rent | $5,000 rent |
|---|---|---|---|---|
| Bank account (ACH) us_bank_account · Stripe Financial Connections | 0.8 %, capped at $5.00 | $ 5.00 | $ 5.00 | $ 5.00 |
| Credit / debit card card · all major networks | 2.9 % + $0.30 | $ 43.80 | $ 72.80 | $ 145.30 |
| EZPM software fee that's the whole pitch | — | $ 0.00 | $ 0.00 | $ 0.00 |
Configuration determines who absorbs the fee. By default the tenant sees it as a line item on top of rent; flip a setting and the property owner absorbs it instead. Bank account is dramatically cheaper at any rent above ~$625, where the $5 ACH cap takes over.
A weekend to deploy. A few minutes to onboard each tenant. Stripe takes over from there. Your weekends go back to running properties, not chasing payments.