Subscription Tracker

Next.js React TypeScript PostgreSQL Prisma Docker Jest Recharts NextAuth

Overview

Built this because I kept forgetting about subscriptions quietly charging me. It's a full-stack app where you add all your recurring services, configure email or webhook reminders before renewals, and get a clear picture of where your money's going through spending charts. Under the hood, an async background job queue handles scheduling without blocking the main thread, so reminders go out reliably even under load.

What I built

  • Async job queue for scheduling renewal reminders without blocking the app
  • Webhook + email notifications with configurable lead time
  • Spending dashboard with monthly & yearly breakdowns using Recharts
  • Category and payment method organization
  • Multi-user support with NextAuth authentication
  • Jest test coverage for the job queue and notification logic
  • Docker-ready for easy self-hosting

What I learned

  • How to design a reliable background job queue and handle retries
  • Webhook delivery patterns, idempotency, failure handling, and retry backoff
  • Building meaningful data visualizations with Recharts
  • NextAuth configuration with custom session handling and credential flows

Architecture

flowchart TD
    User([" User"])

    subgraph Frontend["Next.js Frontend"]
        UI["Dashboard & Forms"]
        Charts["Recharts Analytics"]
    end

    subgraph API["Next.js API Routes"]
        Auth["NextAuth"]
        CRUD["Subscription CRUD"]
        Trigger["Reminder Trigger"]
    end

    subgraph Queue["Background Job Queue"]
        Scheduler["Job Scheduler"]
        Retry["Retry Logic"]
    end

    subgraph Notify["Notifications"]
        Email["Email"]
        Webhook["Webhook"]
    end

    DB[("PostgreSQL
(Prisma)")]

    User --> UI
    UI --> Auth
    UI --> CRUD
    CRUD --> DB
    DB --> Charts
    Trigger --> Scheduler
    Scheduler --> Retry
    Retry --> Email
    Retry --> Webhook