← back to work case study · data & tooling

StudioKeeper: a studio dashboard for my art business

painting the southwest · 2026 · everything: data model, design, build, deploy · sheets and notion → github → vercel

My art business sells the same work five different ways, each with its own margin and payment schedule. I built the one screen that makes sense of all of it, so I can get back to painting.

$37.2Kyear to date revenue
+96%against the same point in 2025
5revenue channels, one screen
$0monthly cost

the problem · five businesses wearing one smock

My studio's income does not arrive one way. A market weekend pays cash on the spot at full margin. The gallery takes half and pays on consignment, weeks later. Wholesale moves volume at half price. Online trickles daily. A civic purchase lands once and moves every number for the year.

Some products are editions, prints and cards that can be remade forever. Some are originals that exist exactly once. So the retrospective questions that decide what to make next — what is actually worth making more of, which channel deserves the weekend — had no single place to be answered. Neither did the operational ones: how many prints are left, and how much of that market cash belongs to the tax man.

How could one screen give me my whole business, sliced by year, month, channel or product, without becoming a bookkeeping job of its own?

where the information actually lived
Squarespace exports
Square POS tallies
Handwritten market journal
Gallery checks, by mail
Emails from the public arts office
Net-30 wholesale invoices
↓ ↓ ↓
one tired artist, reconciling by hand
the same product sold, five different profit levels
Public art & civic
$100
In-person market
$96
Online retail
$91
Gallery
$50
Wholesale
$50
what the studio keeps from a $100 sale, by channel — before this existed, no single view weighed them against each other

01 · understand the business — margins first, charts later

Before designing anything I sat with a year of my own receipts and mapped how each channel really behaves: what it keeps, when it pays, and what it costs in weekends. That table became the spine of every view that followed. The same $100 sale is worth wildly different amounts depending on which channel it came through, and nothing I had weighed them against each other.

In-person market
keeps ~96%
Cash weekends, booth fees, best margin — but it costs a Saturday
Online retail
keeps ~91%
Trickles daily, platform fees, marketplace remits its own tax
Gallery
keeps 50%
Consignment; prestige and price ceiling, paid weeks later
Wholesale
keeps 50%
Volume at half price, net-30, editions only
Public art & civic
keeps ~100%
Rare, huge, moves every number on the page when it lands
the questions that kept coming up
what should I make more of?
which channel deserves the weekend?
how many of that print are left?
how much tax do I owe right now?
was that market worth the booth fee?
what did this month do vs last year?
when do I reorder ornaments?
line-item deep dives
price testing
commission pipeline
solid = the dashboard answers it today · dashed = on the roadmap

02 · model the data — three tables, one truth

Everything reduces to products, orders, and the line items that join them. Every product carries a SKU, a type (original or edition), a cost, and a restock point. Every order carries a channel and a date, and can hold many line items, because one market day or one big civic sale is still one order. Get that join right and every question becomes a filter.

The source of truth stayed a Google Sheet on purpose. That is where I already log sales after a market day, and a tool you will not update is a tool that lies. Notion holds product notes and photos; the build reads both. Records can be typed in, imported from a CSV, or snapped from a photo of the handwritten market journal, where OCR drafts the line items and I confirm them.

products

SKU · name · type
price · cost · stock
restock point

line items

order id · SKU
qty · unit price
discount

orders

date · channel · status
venue · total
tax status

03 · build — sentences before charts

The pipeline is deliberately boring: Sheets and Notion feed a small build on GitHub, Vercel serves it, nothing costs a monthly fee. It ended the cycle of paying for one almost-right tool after another and wrestling each into shape.

The design decision that mattered most was not visual. It was that every insight reads as a plain English sentence with the caveat built in. A number that says "up 681%" without explaining the bookkeeping change behind it is not insight, it is a jump scare.

  • Honest numbers. Every stat names its comparison window and its asterisk. "Part of this jump is bookkeeping" ships right in the insight card.
  • Slicing over dashboards. One set of views filtered by the window you pick — 30 days, year to date, last year, all time — instead of a page per question.
  • Alerts that act. Stock crossing a restock point sends an email with the reorder quantity and the next market date. Tax set-asides compute themselves against the filing calendar.

outcome

  • $37.2K year to date revenue, up 96% against the same point in 2025.
  • Five revenue channels and every SKU on one screen, sliceable by any time window.
  • Restocking moved from reactive to scheduled; the tax envelope computes itself.
  • $0 a month, replacing a carousel of paid tools that each did part of the job.

three lessons

  • Meet the data where it lives. The Sheet stayed the source of truth because that is what I actually update after a long market day. Adoption beats architecture, even when the user is you.
  • Caveats are a feature. The most trusted card on the page is the one that says read this one gently. Numbers with their asterisks attached get believed.
  • The goal is fewer screens. Not more charts. Every view had to earn its place against the question it answers.

a note on the figures

The headline numbers here are real: revenue, growth, channel mix, SKU counts. The order-level rows inside the live dashboard are scrubbed, because those are actual customers, venues and tax records for a business I still run. Same call I make with the employer work on this site — show the capability, not the ledger.

data modelingrevenue attributioninventory logicautomationgoogle sheets apinotionvercel

open to marketing operations, analytics and martech roles

Let's talk.

Remote, or Albuquerque and hybrid. If you want the architecture behind any of the work here, ask me and I will walk you through it.