ChaseDesk is a modern SaaS web application that helps freelancers and small businesses track unpaid invoices and get paid faster. It gives a solo operator a precise, instrument-grade surface for the money they are owed: sign in with a Supabase magic link, import invoices from a CSV file, see overdue invoices grouped by how late they are with overdue totals shown separately for each currency, compose an editable payment reminder in a friendly, firm, or final tone, and open that message in the user's email client or WhatsApp with the text prefilled. When a client settles, the user marks the invoice as paid so the overdue view and per-currency totals stay accurate.
The audience is freelancers and small business owners who invoice clients across time zones and currencies and who need to chase payment without a heavyweight finance suite. The product is deliberately narrow: the first version is focused on invoice tracking and reminders, and it excludes automatic email sending, AI features, accounting integrations, team accounts, and unnecessary features.
The requester (Crezia) asked that work begin by inspecting the project and proposing an implementation plan with a credit estimate, and that coding not start until that plan is approved. That is a delivery-process commitment recorded in this document; the plan, the credit estimate, and any success criteria are not product features and are not presented anywhere in the ChaseDesk interface.
ChaseDesk is delivered as a Next.js and TypeScript web application backed by Supabase (PostgreSQL) with strict row-level security. Identity is application-owned through Supabase magic-link authentication: a visitor establishes identity by requesting a magic link to their email address and following it, and a returning user verifies the same way. Every invoice record is scoped by row-level security to the signed-in user, so each account sees only its own invoices, totals, and reminders.
The current product consists of five surfaces. Landing is the anonymous public entry that explains what ChaseDesk does and introduces sign-in. Login owns self-service first use and returning verification through the Supabase magic link. Overdue Invoices is the recurring working surface: a currency-totals rail pinned above lateness buckets (1–15, 16–30, 31–60, 60+ days late) with invoice rows aligned to a tabular grid. Import Invoices owns uploading a CSV file and importing invoices into the signed-in user's account. Invoice Details owns a single invoice: generating and editing a tone-based reminder, opening Email or WhatsApp with the message prefilled, and marking the invoice as paid.
Two active human personas use the product: the Freelancer and the Small business owner. Both follow the same accepted workflow; the product does not differentiate their permissions or visibility. Reminders leave the product only through the user's own email client or WhatsApp — ChaseDesk composes and prefills the message but never sends it.
Removed from scope
ChaseDesk is a first-party web application with application-owned identity. The anonymous entry boundary is split cleanly: Landing is publicly reachable and explains the product, and Login is publicly reachable and owns the magic-link interaction that establishes access. A protected destination never owns the interaction that establishes access to itself — Overdue Invoices, Import Invoices, and Invoice Details all require a signed-in session, and a visitor who reaches them without one is directed to Login and returned to the intended destination after verification.
The reminder delivery boundary is external by design. ChaseDesk generates and lets the user edit the reminder text, then hands the composed message to the user's own email client (via a mailto: link) or to WhatsApp (via a WhatsApp deep link) with the message prefilled. The actual send happens in that external client, under the user's control. ChaseDesk does not send email or WhatsApp messages itself, does not connect to accounting systems, does not use AI to draft or score messages, and does not model teams or shared accounts. Multi-currency support is a first-class read of the data — overdue totals are shown separately for each currency rather than converted into one figure — and marking an invoice paid is the only state change that removes an invoice from the overdue view.
/; move row focus with the keyboard; mark an invoice paid directly from its row./ search affordance.FR-1 — Magic-link sign-in. As a Freelancer or Small business owner, I should sign in using Supabase magic-link authentication so that I can reach my own invoice data. (explicit)
FR-2 — Self-service first-use enrollment. As a first-time Freelancer or Small business owner, I should establish my account by requesting a magic link to my email and following it, so that I can begin using ChaseDesk without a separate signup flow. (required_inference)
FR-3 — Returning verification. As a returning Freelancer or Small business owner, I should verify again via magic link so that I can resume my own invoice data. (required_inference)
FR-4 — Authenticated session before protected pages. As a Freelancer or Small business owner, I should be required to hold an authenticated session before accessing Overdue Invoices, Import Invoices, or Invoice Details, so that my invoice data stays private. (required_inference)
FR-5 — CSV invoice upload. As a Freelancer or Small business owner, I should upload invoices through CSV files so that I can bring my outstanding invoices into ChaseDesk. (explicit)
FR-6 — Overdue invoices grouped by lateness. As a Freelancer or Small business owner, I should view overdue invoices grouped by how late they are so that I know which clients to chase first. (explicit)
FR-7 — Editable tone-based reminders. As a Freelancer or Small business owner, I should generate editable payment reminder messages in friendly, firm, and final tones so that I can match the message to the relationship and the lateness. (explicit)
FR-8 — Email and WhatsApp prefilled handoff. As a Freelancer or Small business owner, I should have Email and WhatsApp buttons on each invoice that open my email client or WhatsApp with a prefilled message so that I can send the reminder from my own client. (explicit)
FR-9 — Multiple currencies with separate overdue totals. As a Freelancer or Small business owner, I should see overdue totals shown separately for each currency so that I read my receivables as a ledger rather than a single converted figure. (explicit)
FR-10 — Mark invoices as paid. As a Freelancer or Small business owner, I should mark invoices as paid so that the overdue view and per-currency totals stay accurate. (explicit)
FR-11 — Strict row-level security scoping. As a Freelancer or Small business owner, I should have my invoice data scoped to my signed-in user by strict row-level security so that no other account can read or change it. (required_inference)
FR-12 — Clean, responsive, professional interface. As a Freelancer or Small business owner, I should get a clean, responsive, professional interface suitable for international customers so that I can work confidently across devices and currencies. (explicit)
FR-13 — Focused first version. As the product owner, I should keep the first version focused on invoice tracking and reminders so that no automatic email sending, AI features, accounting integrations, team accounts, or unnecessary features are added. (explicit)
FR-14 — Plan before coding. As the requester, I should receive a project inspection and an implementation plan with a credit estimate, and coding should not start until I approve the plan. (explicit)
/ to focus search and narrow the list, or move row focus with the keyboard.Muse: Rasmus Andersson. Headline: "Instrument-grade product craft for the money you're owed."
Palette (light mode):
#F6F3EE (warm paper)#FFFFFF (cards, invoice rows, panels)#141517 (ink)#E8551F (tangerine) — overdue totals, days-late numerals, active tab underline, primary CTA#8A857C (metadata, labels, hairlines)#E4DFD6#C98A00 (1–15), tangerine #E8551F (16–30), deep rust #A3300C (31–60), ink #141517 (60+)Typography:
-0.03em, flush-left.0.08em.clamp(72px, 10vw, 128px), h1 40/56, h2 28/36, h3 20/24, body 15/17, micro-label 11/12, money figures 34/44 tabular. Line-height 1.05 on display, 1.6 on body.Shape language: 8px radii on cards and controls, 4px on tags and inputs, 1px hairline borders in #E4DFD6, no soft shadows except a single 1px inner highlight. Buttons are solid ink rectangles with 8px radius; the one hot accent button is reserved for the primary action per screen. Tabs are underlined text, not pills. Numerals are the ornament — large, tabular, flush to a ruled baseline.
Layout: 12-column grid on a 4/8pt spacing scale, max content width 1200px, 32–48px gutters. Overdue Invoices is the spine: currency-totals rail pinned at the top, then lateness buckets as full-width ruled sections with invoice rows aligned to a tabular grid. Import Invoices is a single centered column with a drag-and-drop zone and a preview table mirroring the invoice-row grid. Invoice Details is a two-pane split: invoice facts left, reminder composer right with underlined tone tabs and a monospace-editable body.
The public entry is an oversized editorial statement, not a centred SaaS hero. On warm paper (#F6F3EE), the left two-thirds carries the headline "Get paid. On time. In every currency." in Inter Tight 700 at clamp(72px, 10vw, 128px), stacked in three flush-left lines with tight leading, the word "paid" set in tangerine (#E8551F). Beneath it, a single ruled strip of live-looking overdue totals — USD, EUR, GBP — each with its tabular figure and days-late count, separated by hairlines, like a trading desk readout. The right third is a tall ink (#141517) panel bleeding off the right edge, containing a monospace sample reminder message with a tangerine cursor and a solid tangerine "Open in WhatsApp" button, cropped by the viewport. No gradient, no blob, no centred button stack. The composition recomposes only accepted content — the product promise, the per-currency readout, and the reminder handoff — and introduces no new behavior.
Interaction Model: Animated Motion Tempo: restrained Hero Dimensionality: flat
Landing Hero Motion Brief
In-product motion: Tone tabs swap the message with a 120ms crossfade; marking paid collapses the row with a 160ms height transition and a tangerine checkmark that fades to ink; totals count up once on first paint (300ms, no bounce).
/ focuses search); reduced-motion support for all motion. (required_inference, from creative direction)mailto: links for email and WhatsApp deep links for WhatsApp, opening the user's own clients. (explicit)
ChaseDesk tracks your unpaid invoices and helps you get paid faster — built for freelancers and small businesses invoicing across time zones and currencies.
Sign in with a magic link, then your overdue invoices wait for you — grouped by how late they are, with overdue totals kept separate for each currency.
Already signed in on this device? The same sign-in path takes you on toOverdue Invoices. ChaseDesk composes reminders and hands them to your own email client or WhatsApp — it does not send them itself.

ChaseDesk tracks your unpaid invoices and helps you get paid faster — built for freelancers and small businesses invoicing across time zones and currencies.
Sign in with a magic link, then your overdue invoices wait for you — grouped by how late they are, with overdue totals kept separate for each currency.
Already signed in on this device? The same sign-in path takes you on toOverdue Invoices. ChaseDesk composes reminders and hands them to your own email client or WhatsApp — it does not send them itself.
No comments yet. Be the first!