Maintenance agreement tracker for HVAC shops

B2BWeb1 weekNext.jsSupabaseTwilioStripe

The idea

An owner-operator HVAC shop with 200 maintenance agreements at 200 USD a year is sitting on 40,000 USD of recurring revenue, tracked in a spreadsheet nobody opens between seasons. Renewals lapse silently because no one sends the reminder, and the spring tune-up rush gets planned on a whiteboard. Each lapsed agreement is 150-300 USD gone, plus the repair work that agreement customers reliably generate.

ServiceTitan solves this, but it costs 300+ USD a month and demands a full operational migration. The wedge is doing exactly one job: import the customer list, never miss a renewal again, and put every active agreement on a seasonal visit board. Shops that will never buy a field service suite will buy this.

Who pays

The buyer is the owner of a 2-10 tech HVAC shop with 50-500 active agreements, sold at a flat 49 USD/month subscription. Distribution: HVAC owner Facebook groups, contractor subreddits, and partnerships with the bookkeepers and marketing agencies that already serve these shops; the pitch is one recovered renewal pays for four months.

MVP scope

  • CSV import of customers and agreements with preview and dedupe
  • Automated renewal email/SMS sequences at 60/30/7 days with delivery tracking
  • Dashboard showing expiring, lapsed, and revenue at risk
  • Drag-and-drop spring/fall visit scheduling board
  • Skip for v1: online payment collection for renewals, technician mobile app, QuickBooks sync, multi-location support
// Build prompt — paste into Cursor / Claude Code / Lovable / Bolt
Build AgreementKeeper, a web app for HVAC shop owners to manage maintenance
agreements. Stack: Next.js (App Router), Supabase (Postgres + auth), Twilio
for SMS, Stripe for the shop's own subscription. Magic-link auth, no
passwords.

Core flow: owner imports customers via CSV (name, phone, email, address,
agreement start date, annual price). Each customer gets an agreement record
with a renewal date computed as start date plus 12 months. Sixty, thirty, and
seven days before renewal, the system sends a templated email and SMS asking
the customer to renew; the owner sees delivery status per customer.

Pages: dashboard (agreements expiring in 30/60/90 days, lapsed count,
estimated revenue at risk), customer list with search and status filters,
customer detail with message history, a spring/fall scheduling board where
each active agreement appears as a card the owner drags into a week slot for
its tune-up visit, and settings for message templates and shop branding.

Non-obvious details: CSV import must be forgiving - preview rows, flag bad
phone numbers, and dedupe on phone. Store all reminder sends in a
message_log table so a customer is never texted twice for the same
milestone; run the scheduler as a daily Supabase cron job.

Pricing: single plan at 49 USD/month via Stripe Checkout, 14-day free trial,
no card required up front.

// More B2B ideas