PVME CLIENT BRANDING — SYSTEM WHITEBOARD

LIVE · pro-tether-tools.pages.dev/pvme-branding-clients.html · 5th module under Pro Tether Tools · single-file HTML, no build
← Back to Dashboard
Client touchpoints (where she interacts)
PVME workflow (Rothstein's side)
Dashboard module
Infrastructure
The Two Packages — same workflow, different scope

Brand Pro

$3,500 – $5,500 · paying clients
  • 25–35 retouched lifestyle / brand photos
  • 1 brand video (30–60 sec)
  • 3 short social clips
  • 2–3 Reels (vertical)
  • 3–5 polished headshots
  • 3–5 banner graphics (LinkedIn / Facebook / IG covers)
  • 6–8 hour shoot, multiple locations, 3 outfits
  • Discovery + Strategy Call

🎁 Brand Preview (gifted promo)

$500 – $750 perceived value · training / pro bono
  • 5 retouched photos
  • 1 polished headshot
  • 1 short Reel (15–30 sec)
  • 1 LinkedIn banner graphic
  • ~2 hour shoot, single location, one outfit
  • Discovery + Strategy Call
Why two packages: Nafeesa + Annie are gifted Brand Previews so Rothstein can run the full 8-stage process end-to-end without giving away the farm. Same workflow, same emails (gifted-aware via {ifGifted}…{endif} in templates), smaller deliverables. Future paying clients flip the 🎁 Gifted checkbox off and the Pro deliverable seed + Pro outreach template are used.
The 8-Stage Pipeline
1 · Leadname on radar
2 · Outreachemail sent
3 · Discoveryform back
4 · Pre-Prodplan locked
5 · Shoot WeekT-7 to T-0
6 · Postedit / retouch
7 · Deliverydrafts + final
8 · Closeoutreview / referral
At Each Stage — what you owe vs what you need

1 Lead

Owe:30 sec research (IG, brokerage)
Need:Nothing — she doesn't know you yet
→ Send outreach email · move card

2 Outreach

Owe:Patience · 1 nudge at 3d · 1 call at 7d
Need:Discovery form submission
→ Form arrives · move card

3 Discovery

Owe:Read form 2× · build brandProfile · list gaps · propose 3 shoot dates
Need:Gap answers · shoot day pick · stylist info
→ Critical gaps closed + shoot day locked

4 Pre-Production

Owe:Shot list · script · locations · wardrobe sync · Pre-Prod email (presents plan)
Need:Sign-off on shot list · time slot pick · wardrobe confirm
→ All sign-offs + 5d before shoot

5 Shoot Week

Owe:T-7 weather · T-3 gear check · T-1 confirmation · T-0 show up early
Need:Reply to T-1 · show up on time with outfit
→ Shoot wraps · files on Mac

6 Post-Production

Owe:Cull · retouch · edit Reel · design banner · upload gallery
Need:Nothing — silence is fine
→ All deliverables in Draft state

7 Delivery

Owe:Draft Delivery email · 48h revision turnaround · Final Delivery
Need:1 consolidated revision list · download confirmation
→ Final files confirmed

8 Closeout

Owe:Closeout / Testimonial email · personal thank you
Need:Google review · portfolio permission · 1–2 referrals
→ Review + permission obtained · keep card visible
Data flow — Google Form to outbound email
📝 Google Form "Brand Discovery Questionnaire" built via Apps Script under pvme2013@gmail.com
🧠 brandProfile per-client object on each card voiceTriangle · feelingTriangle · locationVibe · fixGoal
📧 Templates interpolate {brandVoice}, {locationVibe}, etc.
📤 mailto: opens default mail client activity log auto-records
Why not Gmail API directly: No OAuth on the dashboard. mailto: matches the existing PVME pattern (Send Proofs, Pre-Shoot Reminders in the Headshot module). Works on every device including iPhone. The compromise: the dashboard can't auto-detect replies — Rothstein clicks ✓ Mark reply received to flip the card to ✓ Replied. Future upgrade path: Gmail OAuth in a Supabase Edge Function once active client count crosses ~10.
Dashboard Module — what's inside

🃏 Three Views

  • Kanban — 8 lanes (Lead → Closeout); drag cards between lanes (HTML5 + iPad touch polyfill, 350ms long-press); stage moves auto-log + run advance guards
  • List — table view sorted by stage; receive/quoted column shows paid vs gifted clearly
  • 🅿️ Parking Lot — two-column accountability view; closeout clients excluded (not in flight)

🏷 Card Chips (at a glance)

  • Stage tag · 🎁 GIFTED badge if applicable
  • 📤 Sent today / 📬 Awaiting reply / 🚨 No reply / ✓ Replied
  • Shoot countdown (red ≤7d, blue otherwise)
  • N gaps badge (open gaps from discovery)
  • ➤ Next: line — current step at a glance
  • Stage progress bar (% of stage steps complete)

🪟 Client Modal — 8 sections

  • 🎯 Next Steps — workflow checklist with CTAs
  • Basic fields (name, email, brokerage, stage, dates, value)
  • 📧 Communicate (template picker + email status + manual-log link)
  • 💬 Email Thread — paste-her-replies box + chronological thread
  • Open Gaps (checklist from discovery)
  • Deliverables (per-item progress)
  • Activity Log (auto-stamped event trail)
  • 📁 Project Folder & Quick Links — copy path, Finder shortcut, external URLs
Stats strip — seven tiles always visible
TileWhat it counts
Total ClientsTotal cards · "X active · Y gifted" subtitle
Pipeline ValueSum of quoted $ across paying clients in non-closeout stages
ReceivedSum of actually paid $ across all clients (deposits + payments)
🎁 Gifted ValueSum of quoted $ across gifted clients — training / pro bono delivered
📬 Awaiting RepliesCount of cards with unmarked-reply emails 3+ days old · turns red at 6d+
Next ShootEarliest upcoming shoot date across active clients
In-Flight DeliveryAverage deliverables % across Post + Delivery stage clients
Next Steps engine — how it decides what's next

🎯 Per-stage WORKFLOW data

  • Each stage has 3–6 ordered steps
  • Step has id, label, and optionally done(c) → bool
  • Programmatic steps detect done from activity log + client data (e.g., hasSentTemplate(c, 'preprod'))
  • Manual steps (no done predicate) get a "Mark done" button — toggle goes into c.workflowDone
  • Walk steps in order: first not-done + available = current

🎬 Step states + CTAs

  • ✓ done — dimmed, green check
  • ➤ current — pulsing gold ring, CTA button
  • ○ todo / future — muted text
  • CTA types: template (send), action:advance (move card stage), type:info (muted hint)
  • Card-level shows current step as "➤ Next: …" line
Email templates — 11 total, numeric order with ★ recommended
#LabelTriggersVoice
1Promo Outreach (Gifted Brand Preview)Lead · OutreachHonest about gift; positions Brand Pro as paid offering
2Initial Outreach (Paid Brand Pro)Lead · OutreachFull package, $3,500–$5,500 quote language
3Discovery Form NudgeOutreach · DiscoverySoft bump if no reply 3+ days · sent BEFORE recap if she hasn't replied to outreach
4Discovery Recap (form-driven)DiscoverySent AFTER her form comes back · echoes her brand triangle + feeling + fix-goal back; auto-lists open gaps in one batchable reply; locks shoot day
5Pre-Production Plan (presents the shoot)Pre-prodForm-driven; presents brand triangle + locations + 3 time slot options
6Shoot Day Confirmation (T-1)Shoot WeekAnchors brand brief in her own words before logistics
7Draft Delivery (presents the work)DeliveryExplains editing lens used; "cut anything ordinary"
8Revision ConfirmationDelivery48h turnaround promise
9Final Delivery (closes the loop)Delivery · CloseoutRepeats her fix-goal · honest upsell to Brand Pro for gifted clients
10Closeout / Testimonial RequestCloseoutAsks for Google review + tag + referral
11Just Touching BaseanyGeneric blank canvas for one-off notes
Gifted-aware branching: Templates 4 / 5 / 6 / 8 use {ifGifted}…{else}…{endif} blocks so the same template renders Brand Preview language (1 outfit, 1 location, 4 deliverables) for gifted clients and full Brand Pro language for paying ones. Form-driven: Templates 4 / 5 / 6 / 8 / 9 pull from each client's brandProfile — her own words from the discovery form become the engine.
Template picker behavior: Already-sent templates are hidden from the dropdown by default (toggle "Show N already-sent templates too" to reveal for resends). When every stage-relevant template has been sent, the picker shows a green "all sent" badge instead of an empty list.
Email reply detection — the mailto: workaround
Card chipDays since last sendCard borderSuggested action
📤 Sent today / Nd ago0–2neutralWait — give her the polite window
📬 Awaiting reply · Nd3–5amberConsider sending Discovery Form Nudge
🚨 No reply Nd6+redCall her or write a personal note (template #10)
✓ RepliedgreenMove to next stage step
How sent emails are tracked: Clicking 📧 Open in Email appends 📧 Opened template "Label" to the client's notesLog. emailStatus(client) walks the log to find the most recent send. When Rothstein clicks ✓ Mark reply received, it appends ✓ Reply received from email@… — if that timestamp is more recent than the last send, the card flips to ✓ Replied.
60-second auto-refresh: A setInterval(60_000) re-renders cards so day counters and urgency tags stay current without a reload. Skipped while a modal is open (don't clobber edits).
⚖️ Checks & balances — guardrails before any email goes out

Client communication is the product. Nothing fires without a deliberate click. Three guards stand between an idea and an outgoing email.

🛂 Guard 1 — Pre-Send Confirmation Dialog

  • Clicking 📧 Open in Email no longer fires mailto: directly
  • Opens a confirm dialog showing:
  •   • Recipient name + email
  •   • Template number + label
  •   • Substituted subject line
  •   • Expandable full body preview
  •   • Cancel / Send buttons
  • Last chance to catch a wrong client, wrong template, or wrong tone

⚠️ Guard 2 — Validation Warnings

  • The dialog surfaces issues before send:
  •   • Template uses {brandVoice} but brandProfile is empty
  •   • Template uses {shootDate} but no shoot date set
  •   • Template uses {deliveryDate} but no delivery date set
  •   • Template uses {openGapsList} but no open gaps
  •   • Out-of-sequence detection via TEMPLATE_PREREQS graph
  • Each warning shows next to ⚠️ Heads up; you can override but must look it in the eye first

🛡 Guard 3 — Stage-Advance Guards

  • checkStageAdvance(client, newStage) runs on:
  •   • Drag-drop between Kanban lanes
  •   • Next Steps CTA "Move to X" buttons
  • Triggers a confirm dialog if:
  •   • Skip-forward: jumping more than 1 lane in a single drop
  •   • Backwards move: from a later stage to an earlier one
  •   • Unfinished critical steps: enumerates what's still incomplete in the current stage
  • Cancel keeps state intact; Confirm logs the move to activity
TEMPLATE_PREREQS — which template should come before which
TemplateShould typically followWhy
3 · Discovery Form Nudge1 Promo Outreach or 2 Initial OutreachCan't nudge if outreach didn't go out
4 · Discovery Recap1 Promo Outreach or 2 Initial OutreachRecap echoes the form — assumes she filled it after outreach
5 · Pre-Production Plan4 Discovery RecapPre-prod builds on the brand-anchor confirmation the recap establishes
6 · Shoot Day Confirmation (T-1)5 Pre-Production PlanT-1 confirms the plan she signed off on
8 · Revision Confirmation7 Draft DeliveryCan't confirm revisions without drafts
9 · Final Delivery7 Draft DeliveryFinal assumes the draft + revision cycle happened
10 · Closeout / Testimonial9 Final DeliveryAsks for a review of files that have been delivered
Override philosophy: Every warning is overridable. You're the strategist; the guards are decisions made loud, not decisions made for you. Sometimes you legitimately want to send Pre-Prod before Recap (e.g., the recap content is folded into a phone call instead). The system says "you sure?" — you say "yes" — it logs and moves on.
💬 Email Thread — per-client conversation record

Until Gmail OAuth ships (deferred until 10+ active clients), the dashboard can't read your inbox. Until then, replies are captured by pasting her actual email text into a dedicated box on her card. This preserves the full conversation permanently with the client, regardless of whether the mailto: send happened from the dashboard or from your mail client directly.

📋 Paste-her-reply box

  • Blue-tinted prominent textarea at the top of the Email Thread section
  • Date picker (defaults to today)
  • 💾 Save reply button — pushes incoming entry to thread + logs activity + flips card chip to ✓ Replied
  • "Mark Reply Received" button on the email status panel now SCROLLS + FOCUSES this box so capturing the actual text is the obvious move, not just a metadata flag

📜 Thread display

  • Newest first; chronological scroll back through every exchange
  • Outgoing entries (gold-tinted): template label, subject, collapsible body
  • Incoming entries (blue-tinted): full reply text shown inline, × button to remove a stray paste
  • When you want strategic help drafting a response, copy her pasted text from the thread + drop in a Claude conversation
Why the dashboard stores rendered bodies on outgoing entries: {firstName}, {brandVoice} etc are substituted at send time. The thread preserves what she actually received, not the template skeleton. Useful when you re-read the conversation 3 months later and want to know what exactly went out.
🅿️ Parking Lot view — accountability at a glance

Third view button alongside Kanban / List. Built for one question: "Where's the ball right now?" A future assistant scanning the board should be able to answer it without opening any card.

🎯 Waiting on YOU

  • No email sent yet (need to send outreach)
  • She replied — your move (next step text included)
  • Sorted by urgency: overdue (red) → warn (amber) → fresh (green); alphabetical within tier

⏳ Waiting on CLIENT

  • Outgoing template sent, response pending
  • Urgency derived from emailStatus(): 0–2d (green polite window), 3–5d (amber consider nudge), 6+d (red chase her)
  • Each row clickable → opens client modal directly
Classify logic: classifyClient(client) calls emailStatus(). No email yet → you (fresh). Reply marked received → you (with next-step text). Outgoing pending → her (with urgency tier). Closeout clients are excluded — they're done, not in flight.
📁 Project folders — each client linked to a local directory

Every client card connects to a local folder under a single parent. Consolidated on 2026-06-16 from ~/Documents/Projects/{Client} Realtor Branding Project/ (mixed with other projects) into ~/Documents/Projects/Realtor Project/ — the dedicated parent for the productized branding business.

🗂 Folder structure

  • ~/Documents/Projects/Realtor Project/ — parent for all branding clients
  • Nafeesa Bashir-James/ — full name as subfolder
  • Annie Rushing/
  • Each subfolder holds: Client Notes · Shot List · Script · Locations · Wardrobe · Contracts-Releases · Final Deliverables · Pricing Notes · README.md

🔗 Dashboard wiring

  • CLIENT_FOLDER_ROOT_DEFAULT constant + localStorage override key
  • client.folder field = subfolder name (e.g., "Nafeesa Bashir-James")
  • Combined: full path shown in the modal's 📁 Project Folder block
  • Three actions: 📋 Copy path · 🌐 Browser view (file://) · 📂 Show in Finder ⓘ (instructions)
  • Finder workflow: copy path → ⌘⇧G in Finder → ⌘V → Enter
Why not auto-open Finder: browsers can't open Finder windows directly for security reasons. The copy-path + toast notification + ⌘⇧G shortcut workflow is the most reliable cross-browser path. After the first open, the folder appears in Finder's Recent Folders for one-click reopens.
Training context — Nafeesa & Annie

👩🏾‍💼 Nafeesa Bashir-James

  • Stage: 4 · Pre-Production
  • Package: 🎁 Brand Preview (gifted)
  • Email: Realtornafeesa@gmail.com
  • Folder: ~/Documents/Projects/Realtor Project/Nafeesa Bashir-James/
  • Shoot: Mon 2026-06-29
  • Delivery: 2026-07-20
  • Brokerage: New Kingdom Realty (Samson Properties)
  • Market: Central Virginia
  • brandProfile populated from her actual 2026-06-03 form submission
  • 6 open discovery gaps (brand colors, logo, fonts, references, city, stylist contact)
  • Pre-Production Plan email sent 2026-06-16 (out of typical sequence but covered)

👩🏼‍💼 Annie Rushing

  • Stage: 2 · Outreach
  • Package: 🎁 Brand Preview (gifted)
  • Email: anniemaelouise@yahoo.com
  • Folder: ~/Documents/Projects/Realtor Project/Annie Rushing/
  • 20+ year relationship with Rothstein
  • Promo Outreach email sent 2026-06-15
  • brandProfile populates once her form comes back
  • Next step: Wait for her reply, then nudge at day 3
Infrastructure

☁️ Cloudflare Pages

pro-tether-tools.pages.dev
  • Auto-deploys from main on push
  • No build step — static HTML
  • GitHub repo: pvme2013-png/pro-tether-tools
  • This module: pvme-branding-clients.html

🗄 Data persistence

  • localStorage key pvme_branding_clients_v5
  • Single-machine only — survives page reloads, doesn't sync across devices
  • Export JSON anytime · Import to restore
  • LS version bumps on schema changes; users get fresh seed
  • Photographer signature: pvme_photographer_name (default: Rothstein)

📨 Email delivery

  • mailto: — opens user's default mail client
  • No backend, no OAuth, no API keys
  • Works on Mac Mail, Gmail web, Outlook, iPhone Mail
  • URL-encoded subject + body inside the mailto link
  • Activity log records the open; user marks reply manually

📖 Companion documents

  • Playbook: branding-playbook.html — 8-stage coaching guide
  • Whiteboard: branding-whiteboard.html (this page)
  • Linked from the dashboard header
  • Per-client folders: ~/Documents/Projects/{Client} Realtor Branding Project/
Future upgrades (deferred)
UpgradeWhenWhat it unlocks
Gmail OAuth + Supabase Edge FunctionActive clients cross ~10Auto-detect replies (no manual ✓ Mark); real send tracking
Supabase data persistenceMulti-device or teammate access neededReplace localStorage; same single-file shape, swap load/save
Google Forms API ingestionMultiple new clients/monthAuto-populate brandProfile from form submission
Drag-to-reorder within a laneLane fills with 5+ cardsPrioritize which client gets worked next
Per-client invoice + payment trackingFirst paying clientStripe link, deposit / final, mark paid in modal
Stripe Checkout for Brand ProProductized offering liveOne-click deposit collection at the start of the contract
Files in the repo (pro-tether-tools)
FileRole
index.htmlLauncher — 5 tiles (Headshot · Military · Dashboard · Mobile Capture · Client Branding)
pvme-branding-clients.htmlThis module — Kanban + List + Parking Lot views, modal w/ 8 sections, 11 templates, Next Steps engine, Email Thread, folder linking, all guardrails (~2,270 lines)
branding-playbook.html8-stage coaching guide — owe/need/advance per stage + 6 cross-stage principles
branding-whiteboard.htmlThis page
Other modules (pro-tethering-*) are unrelated to Client Branding
Local files outside the repo
PathRole
~/Documents/Projects/Realtor Project/Parent for every branding client folder
~/Documents/Projects/Realtor Project/Nafeesa Bashir-James/Nafeesa's project — discovery notes, shot list, deliverables
~/Documents/Projects/Realtor Project/Annie Rushing/Annie's project — same structure