One link for rent splits, shared expenses, and group confirmations.
iPaid generates a short confirmation link. Friends tap when they have paid you back or finished their part, and you get an email when everyone is done.
Live site: ipaidforus.com
| Create a link | Friends pick themselves |
|---|---|
![]() |
![]() |
| Private confirmation | Owner gets the status |
|---|---|
![]() |
![]() |
- Create a shared bill without login.
- Add participants and custom amounts.
- Generate one short share link for the group.
- Let each participant open only their own private confirmation page.
- Track paid / unpaid status on the owner dashboard.
- Send one-time email nudges to unpaid participants if you collected their emails.
- Email the owner a live panel link when a bill is created.
- Send an optional completion email to the bill owner when the bill clears.
- Let participants opt in to their own recurring email reminders.
- Generate calendar reminders without requiring an account.
- Track anonymous site visits and product events on a private traffic dashboard.
- Use the same flow for non-payment check-ins where everyone just needs to tap once.
- Rent split and roommate bills.
- Rent reminders and roommate utility bills.
- Utilities, Wi-Fi, dinner, travel, and shared expenses.
- Who-paid tracking for group payments.
- Student house or club dues.
- Simple task confirmation where every person needs to tap once.
- Lightweight group check-ins with a completion email.
iPaid is intentionally small:
- It does not process payments.
- It does not store bank accounts, card numbers, SSNs, or payment passwords.
- It stores owner and participant tokens as hashes.
- Owner dashboard links and participant confirmation links are separate access boundaries.
- Participants can only subscribe themselves to reminders.
- Reminder emails include unsubscribe links.
- Next.js App Router
- TypeScript
- Tailwind CSS
- Prisma
- Postgres-compatible database
- Resend for email delivery
- Vercel-friendly deployment
Install dependencies:
npm installCreate an environment file:
cp .env.example .envSet DATABASE_URL in .env. You can use a local Postgres database, Supabase,
Neon, or Prisma's local dev database.
For Prisma's local dev database:
npx prisma dev -d --name ipaid-for-usThen apply the schema:
npm run db:pushRun the app:
npm run devOpen:
http://localhost:3000
npm run prisma:validate
npm run lint
npm run buildDATABASE_URL
APP_SECRET
NEXT_PUBLIC_APP_URL
APP_ALLOWED_HOSTS
APP_TIME_ZONE
RESEND_API_KEY
FRIEND_REMINDER_EMAIL_FROM
REMINDER_EMAIL_FROM
COMPLETION_EMAIL_FROM
CRON_SECRET
TRAFFIC_DASHBOARD_TOKEN
RESEND_API_KEY is optional in local development. Without it, nudge, reminder,
and completion emails are recorded as skipped instead of crashing the app.
FRIEND_REMINDER_EMAIL_FROM is optional. If it is not set, iPaid falls back to
the reminder or completion sender.
APP_SECRET must be a long random string. It is used for token hashing and
sealing.
APP_ALLOWED_HOSTS is a comma-separated allowlist used when the app builds
share links from the current request domain. Include local hosts, your Vercel
domain, and any production custom domains.
CRON_SECRET protects:
/api/cron/monthly-reminders
TRAFFIC_DASHBOARD_TOKEN protects:
/traffic?token=...
The traffic dashboard counts anonymous public-page visits, top pages, traffic sources, share-link opens, bill creation, paid taps, and nudge emails. It does not display participant emails or private tokens.
Production email should use a verified sender domain in Resend.
The app is designed to deploy on Vercel with a Postgres-compatible production database.
For production, configure the environment variables above in Vercel. The build command runs Prisma migrations for non-local databases before building the Next.js app.
Please report security and privacy issues privately. See SECURITY.md.
MIT. See LICENSE.



