Software Project
Pitch Ledger
A small-business CRM as a progressive web app, originally built for a piano tuning business. Customer records, appointment tracking, quarterly tax rollups, email/SMS invoicing with a Venmo payment link, and a marketing-blast tool that knows not to spam recent customers.
Overview
What it is
Pitch Ledger is a lightweight CRM for a one-or-two-person service business. The first deployment is for a piano tuner, but the data model and workflow translate directly to other appointment-driven small businesses: lawn care, mobile repair, tutoring, in-home services.
The app installs as a PWA so it lives on a phone home screen and runs full-screen, with a Back4App-hosted Parse backend providing authentication and per-user data isolation. Every record is saved with an ACL tied to the logged-in user, so two businesses sharing the same deployment never see each other's customers.
Screenshots
The app, on a phone
Features
What it does
Customers and Appointments
- Full customer CRUD: name, address, email, phone, reminder preferences, notes
- Appointments tracked with date, status, base price, tax, and notes
- Per-user ACLs so each business's data is private
Money
- Quarterly sales and tax rollups for filing
- Draft invoices by email or SMS with a Venmo payment link baked in
Outreach
- Reminder queue based on each customer's last completed appointment
- Follow-up queue for post-service check-ins
- Marketing blasts with smart exclusion so recently serviced customers don't get pestered
Stack
How it's built
The frontend is a Vite-built TypeScript PWA that runs as a single
installable app on any modern phone or browser. State and storage
live in
Parse Server (Back4App),
with Parse classes for Customer,
Appointment, Business_Settings, and
CommunicationLog. Every saved object carries an
owner-scoped ACL plus ownerId/
ownerUsername fields for filtering.
Email and SMS go through Parse Cloud Functions instead of opening
the device's mailto:/sms: handlers, so
the messages are sent from the business identity rather than the
phone:
Resend
for email,
Twilio
for SMS. Cloud Functions like sendBusinessEmail,
sendBusinessSms, and sendMarketingBlast
do the actual delivery and write back to the
CommunicationLog.
Deployment is via GitHub Pages with a custom domain
(ppcm.ulrichlabs.dev); a GitHub Actions workflow
builds and publishes on push to main, with
environment-specific Parse keys held as repository secrets.