Trellis

A multi-tenant wine club billing platform, built to replace a discontinued vendor for about 800 club members at 14 Acres, and designed to sell to other wineries.

Role
Design, architecture, review & testing
Status
In development · first live charges Jan 2027
Stack
Next.js, TypeScript, PostgreSQL, Render
How it’s built
AI-assisted; I review and test every change
Trellis logo: a trellis post with a vine and a leaf, and the tagline “Built by wineries, for wineries.”

Customer and context

14 Acres Vineyard & Winery is a working winery and tasting room in Ridgefield, Washington. Its wine club has about 800 members who are charged on a schedule, and every charge goes through the Clover POS the tasting room already uses.

Staff manage members in Trellis’s admin; members get their own pages.

The wine club manager runs club billing quarterly, but every staff member uses the wine club software: to check which customers are club members, and to make sure their details and card on file are accurate.

Discovery

What they asked for: a replacement for the winery’s club billing vendor, which was discontinued.

The real problem: whatever replaced it had to be trustworthy with money from day one, charge through the Clover account the winery already runs on, and not need a rewrite to serve other wineries later.

What went wrong with the old software: it was very buggy, with many problems and critical security issues. There were so many issues that staff stopped using it.

Constraints

  • Existing systems: every charge has to go through Clover, the POS the tasting room already uses.
  • Money: about 800 members are billed on a schedule, so a retried job can never charge someone twice.
  • Timeline: first live member charges are planned for January 2027.
  • Budget: as cheap as possible while still producing viable software.
  • How it’s built: I design and direct an AI-assisted build, and review and test every change.

What I shipped

Staff manage members in the Next.js app. Workers on Render run the charge schedule and call Clover. Every table carries a winery ID, and Postgres row-level security means one winery can never read another’s data.

No double charges

Each Clover payment carries an idempotency key, so a retried job can’t bill a member twice.

Multi-tenant from day one

Tenant IDs and row-level security now, so selling to other wineries doesn’t mean a rewrite.

CI on every push

GitHub Actions runs lint, tests and a secret scan before anything merges.

charge.ts — excerpt
[Paste a short, real excerpt here, e.g. the idempotency-key charge call]

Rollout and training

Trellis isn’t live yet. First live member charges are planned for January 2027.

[Add after go-live: the plan for moving about 800 members off the old vendor (validation, cutover, rollback), and how staff learned the admin]

Results

[Add after January 2027: charges run, failed charges caught, and time saved compared with the old vendor]

What broke and what I changed

[Add: something that broke or didn’t fit during the build, and what you changed because of it]

What’s next

  • First live member charges, January 2027
  • Monitoring and alerts for failed charges, an admin audit log of who changed what, and a short runbook for when billing fails
  • A member self-service page once the MVP is stable
  • An Android app once the MVP is done
  • Offering it to other wineries