Vernon Tech & MediaCase Study
All case studies · Client build: CC Network
Client build // media company

One system to run a studio, from booking request to wrap.

CC Network runs a production studio: room rentals, podcast and interview shoots, event coverage and storytelling campaigns. Their operations lived across Monday, Keap and Acuity. We built one CRM on our template: a public booking engine that cannot double-book, sign-before-deposit, a client portal, a shared inbox, and an eight-stage production workflow lifted straight from their own operations manual.

~40 database tables3 tools replaced4 lines of business15-min row-locked slot holdsPayPal Orders v2 + webhooks
CC Network CRM dashboard, cinematic render
The problem

Three tools, three logins, and a studio that could still get double-booked.

Requests came in over email and DMs, availability lived in someone’s head and a calendar, quotes went out as PDFs, deposits were chased by hand, and the production checklist lived in a doc nobody opened. Monday tracked it, Keap emailed it, Acuity booked it, and none of them knew about each other.

monday.com
Standard, 3 seats (plan minimum)
$432 / yr · $36/mo
Keap
Single published plan (replaces the former Pro tier), 2 users included
$2,988 / yr · $249/mo
Acuity Scheduling
Standard (the 'growing' mid tier)
$324 / yr · $27/mo
DocuSign eSignature
Standard, 1 user, 100 envelopes per user per year
$360 / yr · $30/mo
Annual cost of the stack, mid-tier plans$4,104 / yr
→
consolidated
into one
V

CC Network CRM

One record per request. Availability, agreement, deposit, messages and the production job attached to it, from the public booking door to the wrap.

Booking engineBooking ladderE-signPayPalClient portalInboxCampaigns
The approach

How we thought about the problem.

Four decisions shaped the build, and each one closes a specific way the old stack leaked money or time.

01 / Model

Model the business as a ladder.

Four lines of business (venue rental, interview package, storytelling campaign, and a no-deposit guest pipeline) share five pipeline sections but define their own rungs, all declared as data in one file that every screen reads. Nothing is hand-typed per page.

02 / Availability

Make the booking door honest.

A Postgres function paints a month of true availability server-side (buffers, minimum notice, business hours). Taking a slot uses a row lock so two people confirming the same second cannot both win, then opens a 15-minute hold with a live countdown.

03 / Money

Sign before money.

The agreement has to be signed before the deposit checkout is even offered, and the server enforces it, not just the screen. PayPal Orders v2 with a real webhook: only a completed capture counts as paid.

04 / Operations

Digitize the manual, don’t hardcode it.

Five real campaign products and eight stages came straight from CC Network’s own operational manual into a template file the team can edit without a deploy. Each stage is owned by a department and gated by a quality standard.

The stack

What it’s built on, and how the pieces talk.

Same three-layer shape as everything we build, with one twist: the public booking door and the client portal are served by locked-down database functions, so anonymous visitors can book without ever touching a table directly.

Layer 1

Frontend

React single-page app with hand-written CSS. Staff app, public storefront, and phone-first client portal.

React 18ViteReact Router 6Archivo + DM Sans
request · Supabase JWT or portal token
Layer 2

API

Vercel serverless functions plus Postgres RPCs for the public flows (booking holds, portal reads, form submits).

Vercel functionsSECURITY DEFINER RPCsResend emailpdf-lib e-sign
query · RLS per permission
Layer 3

Database

Supabase Postgres with row-level security on nearly every table, keyed to a per-user permission function.

Supabase~40 tablesRLS + has_permission()Storage buckets
Wired in
PayPal Orders v2
PayPal Subscriptions
Booking engine RPCs
Resend
pdf-lib e-sign
Campaign templates
Client portal tokens
VTM CRM template
Built on the VTM CRM template: a stable core plus installable modules (documents, e-sign, payments). A fix to the shared payments adapter improves every client CRM built from it at once.
Where it stands todayStill finishing: one studio has public online booking today (the others are staff-booked), agreement wording is a placeholder pending legal review, and Gmail sync, bulk email and invoicing are on the roadmap. We would rather show you the real state than a demo.
Inside the product

Seven surfaces, one booking record.

Real screens rebuilt from the app with an invented studio and invented clients. Two of them are public: the booking door and the client portal need no login.

Run of show

What needs a human today, and what the system already handled.

The home page is built around the day: KPIs up top, a band showing what automation handled since you left (holds released, receipts sent, reminders texted), then today’s run of show next to the short list that needs a person, and the money that has to land before the door opens.

src/lib/dashboard.js · holds · balances due · runway
Dashboard · Run of show
Dashboard · Run of show
Pipeline

Four lines of business on one ladder.

Venue rentals, interview packages, storytelling campaigns and no-deposit guest bookings each climb their own rungs inside shared sections. Advancing a row stamps booked and deposit-paid dates automatically, which is the exact moment a lead becomes a client everywhere else in the app.

venue_bookings · stage · rung · pipeline · movePatch()
Leads · Booking ladder
Leads · Booking ladder
Storefront booking · replaces Acuity

A booking door that cannot double-book.

A five-question wizard on a public page: shoot type, length, calendar and time, who you are, review. Availability is computed server-side against every existing booking plus buffers and hours, the chosen slot is held under a row lock with a live 15-minute countdown, then the agreement is signed and the deposit paid, in that order.

book_month · book_hold (for update) · hold_expires_at · book_release
Public booking · Studio III
Public booking · Studio III
Client portal · no login

The client sees exactly where their job is.

A token link opens a phone-first portal with a six-step journey (request, proposal, sign and deposit, booked, shoot day, wrapped), the quote, messages, updates and add-ons. Staff who open the same link get a banner: this is what the client sees.

portal_token · journey stepper · sticky action bar
Client portal
Client portal
Shared inbox · replaces Keap conversations

Every conversation, next to the booking it belongs to.

Staff and clients share one thread per booking, with internal notes, canned quick replies with name tokens, team routing, and a client-context rail that shows the balance and next shoot while you type.

threads · messages (client | staff | internal_note) · quick_responses
Inbox
Inbox
Production workflow · replaces Monday

Their operations manual, running as software.

Every production job moves through eight stages, each owned by a department with its own grouped checklist and a quality gate before the next stage unlocks. Items completed by the automation actor lock so a human cannot accidentally undo them.

campaign_stages · campaign_tasks (task | quality_gate) · 5,788-line template
Campaigns · Harbor & Vine Podcast
Campaigns · Harbor & Vine Podcast
Booking record

One record from request to wrap.

Messages, notes, payments, add-ons and an append-only event timeline that records whether the actor was the system, the client, the storefront, or a staff member, plus the hand-off into a production campaign.

venue_bookings · booking_events (actor) · booking_payments · booking_addons
Booking · Studio III
Booking · Studio III
Why clients switch

The math a client sees before they say “I want this.”

CC Network retired $4,104 a year in software list price and reclaimed about 102 operator hours a year at 100 bookings, worth another $4,067 at $40 an hour. That is $8,171 of recurring annual value against a one-time $5,400 build, which pays for itself inside year one and returns roughly $19,112 over three years.

Software you stop paying for
$4,104
per year, at mid-tier plans, across 4 tools. $12,312 over three years.
Hours given back
102 hrs
per year at 100 bookings, across 6 everyday actions. Worth about $4,067 at $40/hr.
Net position
$2,771
year one, after CC Network CRM build, one-time ($5,400). $19,112 over three years, before counting the hours.

The stack this replaces

Current published list prices, mid-tier plans, billed annually.
monday.comStandard, 3 seats (plan minimum)$432 / yr
KeapSingle published plan (replaces the former Pro tier), 2 users included$2,988 / yr
Acuity SchedulingStandard (the 'growing' mid tier)$324 / yr
DocuSign eSignatureStandard, 1 user, 100 envelopes per user per year$360 / yr
Annual stack$4,104
CC Network CRM$5,400 once
One-time contracted build. No per-seat fee, no per-envelope fee, no contact-tier escalator. Adding a seventh staff member or the 101st booking costs nothing.

Time saved at 100 bookings

Minutes to do it by hand in the old tools versus inside the system, scaled to a year.
ActionBy handIn the systemSaved / yr
Take a booking request and check availability across 3 studiosRead the inbound email or DM, open the calendar, check all 3 studio calendars against the requested window, write a reply offering two or three options, re-check when the client comes back with a different date, then hand-enter the booking on the right studio calendar. Double-booking risk is real because the calendar is only true at the moment it is read.12 min2 min17 hrs
Send quote + agreement + collect depositBuild the quote PDF from a template and fill in the package, rate, and dates (about 5 min). Upload the agreement to DocuSign, drag signature, initial, and date fields onto it, set the recipient, and send (about 6 min). Create and send a PayPal invoice for the deposit (about 4 min). Come back later to check whether the signature landed, whether the deposit cleared, and record both (about 3 min). Three separate tools, three separate logins, three places the thread can stall.18 min3 min25 hrs
Update the client on job statusRoughly four touchpoints per job (booked, shoot complete, in edit, ready for review). Each one means opening the thread, remembering where the job actually stands, writing the update, and sending it, at about 3 min each. Clients who do not get the update send a chaser, which costs more time than the update would have.12 min2 min17 hrs
Run a production job through its stagesCreate the Monday board card and fill its fields, keep a separate checklist doc for what each department owes, move the card between columns by hand, ping the right person in Slack at each handoff, and chase whoever did not see the ping. Nothing stops a job moving to the next stage with a step skipped, so mistakes are caught late by a person rather than early by the process.22 min7 min25 hrs
Reconcile paymentsTwo payments per booking (deposit and balance). For each, open PayPal, find the transaction, match it to the right client and job, type it into the spreadsheet, and mark the job paid. Then work out which balances are still outstanding, which means reading the spreadsheet against the calendar.6 min1 min8 hrs
Answer client messagesMessages arrive across email, Instagram DM, and text. Before replying to any of them the operator has to find the thread, work out which job it belongs to, and check the current status somewhere else. The reply itself is fast. The hunting and context-switching is what costs the time, and messages get missed when they land in the channel nobody checked that day.14 min8 min10 hrs
Total hours given back per year102 hrs
Runs while you sleep
⚡
Hold auto-release

A 15-minute row-locked hold reserves the slot the moment a client selects it, then releases it automatically if the booking is not completed. Nobody has to remember to free up an abandoned cart, and no two clients can be sold the same studio hour.

On slot selection, and again on expiry
⚡
Booking-is-signed enforcement, server side

A booking cannot reach confirmed without a signed agreement on file. The rule lives on the server, not in the interface, so it holds even if someone works around the screen. This is the difference between a policy and a control.

On every booking state change
⚡
Transactional receipts

Signature confirmations, deposit receipts, and balance receipts send themselves with the correct job details attached. No template to find, no amount to retype, no receipt forgotten on a busy shoot day.

On signature and on each captured payment
⚡
Unread badges and notifications

Surfaces what is actually waiting on a human across the shared inbox and the production stages, so nothing is missed because it landed in the channel nobody opened.

Continuously, on new message and on stage handoff
⚡
Editable campaign templates

Production stages, owners, and quality gates are edited in the app by CC Network's own team. Changing how a job type runs does not require a developer or a deploy, which is what keeps the process matching the business a year from now instead of drifting away from it.

On demand, no deploy required
What it adds up to

One system, measured.

~40
Postgres tables, one connected schema
4
Lines of business on one ladder
8
Production stages with quality gates
15 min
Row-locked booking holds
The takeaway

A studio that runs on one system.

This build came off the same template that runs our own agency, tailored to how CC Network actually operates. If your business books rooms, people or time, this is what we would build for you.

Build one for your business →
Vernon Tech & Media