DevWallet
DevWallet
Automate tracking and optimize your SaaS & cloud spending as a developer.
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.
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
System Architecture
βββββββββββββββββββββ
β Client β
β (Browser/Mobile) β
βββββββββββ¬ββββββββββ
β
βββββββββββΌββββββββββ
β Next.js Frontend β
βββββββββββ¬ββββββββββ
β
βββββββββββΌββββββββββ
β Next.js API Routesβ
β (TypeScript) β
βββ¬ββββββββ¬ββββββββ¬ββ
β β β
β β β
βββΌββββββββΌββββββββΌββ
β Supabase β
β (Auth & PostgreSQL)β
βββββββββββββββββββββ
β²
β DB Access
β
βββββββββββ΄ββββββββββ
β Plaid/Nordigen API β
β (Bank Integrations)β
βββββββββββββββββββββ
βββββββββββ¬ββββββββββ
β Resend β Stripe β
β (Email)β (Payments)β
βββββββββββ΄ββββββββββ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
/api/auth/callbackHandles Supabase OAuth callbacks./api/onboard/create-link-tokenGenerates a Plaid/Nordigen Link token for connecting bank accounts./api/onboard/exchange-public-tokenExchanges a Plaid/Nordigen public token for an access token and stores it./api/accountsRetrieves all connected financial accounts for the user./api/accounts/:idDisconnects a financial account./api/transactionsFetches a paginated list of transactions, with optional filters (date range, category)./api/transactions/:idUpdates a transaction's category or status (e.g., 'reviewed')./api/dashboard/summaryProvides a summary of monthly spending, recurring expenses, and trends./api/subscriptionsLists all identified recurring subscriptions./api/subscriptions/:idUpdates a subscription's status or details./api/merchantsRetrieves a list of known or user-defined merchants./api/merchantsAdds a new custom merchant for categorization./api/alertsFetches active alerts for the user.Start Building with AI
Copy this prompt for Cursor, v0, Bolt, or any AI coding assistant
BuilderDaily Team
VerifiedIndie hackers and full-stack engineers creating validated Micro-SaaS blueprints with production-ready tech stacks.
Related Blueprints
More Micro-SaaS ideas you might like to build
MediBrief AI
AI-powered clinical note summarization for healthcare professionals.
AssessGenius AI
Instantly create engaging quizzes from any text using AI.
PromptGuard AI
Version, Test, and Validate AI Prompts for Reliable Structured Outputs.
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!)