DevWallet

FinTechIntermediateJan 6, 2026

DevWallet

Automate tracking and optimize your SaaS & cloud spending as a developer.

The Problem

Solo developers, indie hackers, and small dev teams often juggle an ever-growing list of SaaS subscriptions and cloud service bills. From database providers like Supabase, hosting on Vercel or Render, email APIs like Resend, AI models via OpenAI, to domain registrars and various dev tools – the monthly recurring expenses stack up. Manually tracking these costs across multiple bank statements and credit cards is a significant time sink, often leading to 5-10 hours wasted per month on reconciliation. This fragmentation makes it nearly impossible to quickly identify forgotten subscriptions, spot unexpected cloud cost spikes (e.g., high egress fees), or gain a consolidated view of their operational tech spend. The lack of clear insights leads to financial inefficiencies, unnoticed overspending, and unnecessary stress, directly impacting a builder's profitability and focus on product development.

The Solution

DevWallet provides a centralized, automated platform designed specifically for developers to track and manage their technical expenses. Users securely connect their bank accounts and credit cards (read-only) via Plaid or Nordigen. Our core solution automatically categorizes transactions, identifying common developer-centric services and cloud providers. The dashboard offers a clear, consolidated view of monthly recurring subscriptions, one-time dev tool purchases, and cloud spending trends. Users receive intelligent alerts for new subscriptions detected, unexpected cost increases, or potential forgotten services. DevWallet's unique value lies in its specialized categorization engine tailored for the developer ecosystem, moving beyond generic expense tracking to provide actionable insights for optimizing your build costs. It simplifies financial oversight, allowing builders to reclaim valuable time and ensure every dollar spent on their tech stack is optimized.

Tech Stack

Frontend
Next.js 14ReactTailwind CSS
Backend
Next.js API RoutesTypeScript
Database
PostgreSQL (Supabase)
APIs
Plaid (or Nordigen for EU)ResendStripe (for future monetization/user revenue tracking)

System Architecture

Database Schema

CREATE TABLE users (
  id UUID PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE,
  email TEXT UNIQUE NOT NULL,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

CREATE TABLE financial_accounts (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id UUID REFERENCES users(id) ON DELETE CASCADE,
  account_name TEXT NOT NULL,
  plaid_account_id TEXT UNIQUE, -- Unique ID from Plaid/Nordigen
  plaid_access_token TEXT NOT NULL, -- Encrypted access token
  institution_id TEXT NOT NULL,
  last_synced_at TIMESTAMP WITH TIME ZONE,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE INDEX idx_financial_accounts_user_id ON financial_accounts(user_id);

CREATE TABLE merchants (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  name TEXT UNIQUE NOT NULL, -- e.g., 'Vercel', 'Supabase', 'Stripe'
  category TEXT, -- e.g., 'Hosting', 'Database', 'Payments'
  keywords TEXT[], -- Keywords to identify transactions (e.g., ['vercel.com', 'vc*']) 
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

CREATE TABLE transactions (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id UUID REFERENCES users(id) ON DELETE CASCADE,
  account_id UUID REFERENCES financial_accounts(id) ON DELETE CASCADE,
  transaction_id TEXT UNIQUE NOT NULL, -- ID from Plaid/Nordigen
  merchant_name TEXT, -- Original merchant name from bank
  amount NUMERIC(10, 2) NOT NULL,
  currency TEXT DEFAULT 'USD' NOT NULL,
  date DATE NOT NULL,
  description TEXT,
  category TEXT, -- Automated or user-assigned category (e.g., 'SaaS', 'Cloud', 'Domain')
  merchant_id UUID REFERENCES merchants(id) ON DELETE SET NULL, -- Link to known merchant
  is_recurring BOOLEAN DEFAULT FALSE,
  status TEXT DEFAULT 'pending' NOT NULL, -- 'pending', 'reviewed', 'disputed'
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
  updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE INDEX idx_transactions_user_id ON transactions(user_id);
CREATE INDEX idx_transactions_account_id ON transactions(account_id);
CREATE INDEX idx_transactions_date ON transactions(date DESC);

CREATE TABLE subscriptions (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id UUID REFERENCES users(id) ON DELETE CASCADE,
  merchant_id UUID REFERENCES merchants(id) ON DELETE SET NULL,
  name TEXT NOT NULL,
  initial_amount NUMERIC(10, 2) NOT NULL,
  currency TEXT DEFAULT 'USD' NOT NULL,
  billing_cycle TEXT NOT NULL, -- 'monthly', 'annually', 'weekly'
  last_billed_date DATE,
  next_billing_date DATE,
  is_active BOOLEAN DEFAULT TRUE,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
  updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE INDEX idx_subscriptions_user_id ON subscriptions(user_id);

CREATE TABLE alerts (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id UUID REFERENCES users(id) ON DELETE CASCADE,
  type TEXT NOT NULL, -- 'new_subscription', 'cost_increase', 'inactive_service'
  message TEXT NOT NULL,
  is_read BOOLEAN DEFAULT FALSE,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE INDEX idx_alerts_user_id ON alerts(user_id);

API Endpoints

POST/api/auth/callbackHandles Supabase OAuth callbacks.
POST/api/onboard/create-link-tokenGenerates a Plaid/Nordigen Link token for connecting bank accounts.
POST/api/onboard/exchange-public-tokenExchanges a Plaid/Nordigen public token for an access token and stores it.
GET/api/accountsRetrieves all connected financial accounts for the user.
DELETE/api/accounts/:idDisconnects a financial account.
GET/api/transactionsFetches a paginated list of transactions, with optional filters (date range, category).
PATCH/api/transactions/:idUpdates a transaction's category or status (e.g., 'reviewed').
GET/api/dashboard/summaryProvides a summary of monthly spending, recurring expenses, and trends.
GET/api/subscriptionsLists all identified recurring subscriptions.
PATCH/api/subscriptions/:idUpdates a subscription's status or details.
GET/api/merchantsRetrieves a list of known or user-defined merchants.
POST/api/merchantsAdds a new custom merchant for categorization.
GET/api/alertsFetches active alerts for the user.
πŸ€–

Start Building with AI

Copy this prompt for Cursor, v0, Bolt, or any AI coding assistant

πŸ‘·

...

builders copied today

Found this useful? Share it with your builder friends!

BD

BuilderDaily Team

Verified

Indie hackers and full-stack engineers creating validated Micro-SaaS blueprints with production-ready tech stacks.

FinTech
Code TestedSchema ValidatedProduction Ready
Coming Soon in Beta

Gap Alert

Today's gap expires in ~14 hours

Get tomorrow's blueprint delivered to your inbox so you never miss a profitable idea.

(Email delivery launching soon β€” sign up to be first!)

No spam, everβ€’Unsubscribe anytime