← 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.

30+SKUs across decks, prints and originals
3tables the whole model reduces to
5revenue channels, one screen
$0monthly cost
try it

StudioKeeper, running

Not a video of it. Switch the time window and every figure moves. Open an order for its line items, work the task list, check the restock radar and the tax envelope.

runs entirely in your browser · nothing is sent anywhere

the problem · five businesses wearing one smock5 channels

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
01 · understand the business — margins first, charts latermargins first

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 truth3 tables

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 chartssheets → vercel

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

  • Revenue growing year over year, with the channel mix visible for the first time rather than reconstructed from receipts.
  • 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 lessons3 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.
  • Caveats are a feature. The most trusted card on the page is the one that says read this one gently.
  • The goal is fewer screens, not more charts.

a note on the figures

Every dollar figure on this page and in the dashboard is illustrative. What is real is the shape: five channels, what each one keeps, the direction of travel, and the SKU counts. The amounts are scaled and the customer and venue names are invented, because those are live 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 apinotionvercelopen source

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.