OPS
Ops Hub
internal tools · comms · escalation
Internal use only · onboarding reference

Ops Hub

One place for how we run things across all three companies — the tools each team logs into, the rules for how we talk to each other and to customers, and exactly when a problem stops being "handle it yourself" and becomes an escalation. Built for new hires and a living reference for everyone else.

i How to use this

Search everything

Use the search bar at the top to jump straight to a tool, vendor, phone number, or SOP across all three companies at once.

Tickets = escalation triggers

Anything styled like a work-order slip is a real recurring issue — what it looks like, when to escalate it, and the standard response.

This isn't static

Tools, vendors and pricing change. If something here is out of date, flag it to your lead — don't just work around it silently.

!

One rule that applies everywhere in this Hub No password, API key, or account credential is ever written down in a chat, a shared doc, or this Hub. Where a tool needs a login, this Hub tells you where the credential lives (a password manager, an admin panel) — never the credential itself.

Gutter installation · repair · cleaning

Coastline Gutter Pros

Seamless gutter installation, repair and cleaning for residential and small commercial properties in the LA area. Copper, aluminum and custom systems. Licensed, bonded and insured. We do not take public/walk-in jobs.

Module summary
  • What we do: seamless gutter install, repair and cleaning — residential and small commercial. No public/walk-in jobs; everything starts from a proper lead.
  • Job minimums (net of demo): $750 standard, $850 copper, $550 cleaning up to 150ft ($900 beyond).
  • Golden rule of the day: QUO calls/texts are priority #1 — never let a lead go unanswered.
  • Estimating: always try the online estimate first; offer the 15% self-estimate discount before ever scheduling an in-person visit.
  • Quotes go by text, not email, with the total stated up front.
  • Payment: collect within 24 hours of install. Zelle, mailed check, or Stripe card link (confirm the current card fee with Celia before quoting it).
  • Escalate to Celia for unpaid balances past 24h, unhappy customers, and any discount before you offer it.

? Quick FAQ

The fast answers. Full detail is in the sections below — or use the search bar up top.

What’s the very first thing I do each shift?
Answer QUO calls and texts. They outrank everything else — a missed one gets answered the moment your current call ends.
Online estimate or in-person first?
Always online first. Only schedule an in-person visit if the client can’t send enough info, or the job is genuinely too complex to quote remotely.
How do I send a quote?
By text to the client’s phone, with the total stated up front — not by email, unless they specifically ask.
Can I offer a discount to close a deal?
Only after Celia confirms the amount. Don’t quote a discount number before she signs off.
Customer hasn’t paid — when do I escalate?
Payment is due within 24 hours of completed install. If they’re unresponsive or won’t pay, loop Celia in ASAP.
Do we repair existing gutter systems?
No — replacements only, for warranty reasons. If there’s a leak, explain we clean first to assess the full problem.

01 Services & minimums

Standard install

Minimum job size

$750 — must be reached net of demo/removal cost. Example: an $800 quote that includes a $150 demo means the actual install is $700, so $50 must be added to clear the minimum.

Copper gutters

Minimum job size

$850. Customer rate $50/ft. Internal installer rate: $25/ft + materials.

Cleaning

Minimum job size

$550 for 0–150 ft, $900 for 150+ ft.

Most homes use 5″ gutters; tile roofs or heavy-rain areas should use 6″. Full service & sizing mind map: canva.link/jw10xgrwvjo2xo5.

02 Internal tools

CRM / job board Daily

Trello-style pipeline

Every lead and job lives here as a card. Pipeline includes stages such as active estimates, review pending, issues during installation, and job completed. All lead interactions get logged as comments on the card — not remembered, not left in a text thread.

QUO Priority #1

Calls & text messaging platform

Inbound calls and texts arrive here. QUO contacts outrank every other task on the list — if a call/text is missed because you were on another call, it gets answered the moment that call ends.

Zoho Invoice

Online quote builder

Used to build the online estimate. Every quote generated online must carry the standard measurement-disclaimer note (see Estimating below).

Google Earth (satellite view)

Remote measurement tool

Used to measure gutter sections remotely for older homes where footprint data exists. Only reliable for homes that weren't recently built — for new construction, schedule an in-person estimate instead.

Stripe

Credit card payment links

Generate a payment link for credit card payers. Processing fee gets added to the quote total before sending — confirm the current fee percentage with Celia, as this has been documented inconsistently (see the note under Payment & Invoicing below).

Company calendar ("CGP")

Install scheduling

Every confirmed installation must be added to the CGP calendar the day before the job (confirm Friday for a Monday job).

🔒

Payment account details Zelle and mailing address for checks are listed under Payment & Invoicing below because they're the customer-facing payment destinations, not login credentials — there's nothing secret about where to send us money. Actual CRM/Zoho/Stripe login credentials are not published here; ask your lead how to get access provisioned.

03 Team communication rules

Daily priority order

Work through the day in this order — don't skip ahead to the "fun" tasks while higher-priority items sit unanswered.

  1. QUO contacts (calls/texts): always priority #1. We cannot afford to lose a lead to a slow response.
  2. Lead emails: once calls/texts are clear, clean out the inbox.
  3. Estimator visit reminders: every morning, remind estimators of the day's on-site visits and installs.
  4. Process pending estimates: work through online and on-site estimates; chase estimators for missing info as needed.
  5. Payments: follow up on anything outstanding — final balances first, then deposits.
  6. CRM hygiene: log actions as you do them in the CRM and the finance tracker, not in a batch at day's end.
  7. Estimator follow-through: chase estimators for anything they still owe you — visit dates, quote inputs, etc.

CRM discipline

  • Every lead interaction gets added as a comment on its card — do it as you go, not from memory later.
  • At the end of your shift, label any card that needs attention urgent with a note so the next shift can pick it up without re-asking the customer anything.

We do not take public/walk-in jobs. This is a standing rule, not a judgment call — every job originates from a proper lead intake.

04 Lead intake

Inbound call script & info to collect
"Hello, this is [Your Name] with Coastline Gutter Pros, how can I help you today?" — pause and let the customer speak.

Always collect:

  • Full name, phone number, email address
  • Service address (spell it out to confirm)
  • Type of service: install / replacement / cleaning
  • Number of stories, roof type
  • How they heard about us (Google, Google Maps, Yelp, etc.)
Call flow: installation branch

Step 1 — Clarify the need. Step 2 — Confirm the exact address.

  • Existing gutters in that section? If so, they need to be removed first.
  • Downspouts needed? How many?
  • Know exact measurements? If not and the house isn't new, check satellite view on Google Earth and have the client confirm by text which sections are wanted — then build the online quote with the standard measurement-disclaimer note.
  • If it's a new house, satellite data won't be reliable — schedule an in-person estimate instead.
  • Confirm style/color preference and send the gutter color/style guide.

Step 3 — Explain we'll send a preliminary online quote first, before sending a crew out:

"Before we send our crew out, we'll first provide you with a preliminary online quote. This helps make sure we're on the same price range and that everything looks good to you before we move forward. For this, we'll send you the estimate based on the details you've shared, along with satellite view measurements and image markups if needed. Once you've reviewed it, if you're comfortable with the range, we can go ahead and schedule."

Add the new lead and track progress in the CRM before moving on.

Call flow: repair branch
"When you say repair, is it a small section, or the whole system?"
  • If there's a leak or general issue and a repair is requested, explain we need to clean the gutters first to check for the full extent of the problem.
  • We do not repair existing systems — replacements only, for warranty reasons.
  • Ask for measurement details plus photos/video. Try to build an online estimate from what they send; if that's not possible, quote the estimate fee for an in-person visit.
  • Explain the $850 minimum (installation only, calculated net of demo) and ask for photos/video.

05 Estimating & follow-up

Online estimate — always try this first
  • Get the address and confirm satellite sections with the client. Confirm downspout needs and placement.
  • Build the estimate using satellite tools to measure and mark up.
  • Add this note to every online quote: "Please note that the measurements provided are based on online estimations and may vary upon actual on-site measurement."
  • Text the client to confirm color (send the color chart if needed), style, and material.
Self-estimate discount — 15% off

This is our biggest selling point: we're more affordable because we don't send a salesperson out. Offer it before scheduling any in-person visit.

"Before we schedule an in-person visit, would you be able to send us a few photos and a short video of your gutters? This allows our team to prepare for the estimate and send the right person. About 90% of our estimates we can actually work out online directly — and if we can do yours online, we'll give you 15% off the total."

Request from the client: photos of all gutter sections (close-up and wide), a short video walkthrough of the roofline, approximate measurements if they have them, number of stories, roof type, and any access concerns.

Rule: if that's enough to build the quote remotely, complete it online and apply the 15% discount. Only schedule an in-person estimate if the client can't provide enough info, or the job is genuinely too complex for a remote quote.

Sending quotes — text, not email

We're moving away from emailing estimates. Send the PDF (link or attachment) directly to the client's phone, with a short message stating the total up front. Don't send by email unless the client specifically asks for it.

"Hi [Name], here's your estimate from Coastline Gutter Pros! By the way, your total comes to $[XXX]. Here's the PDF for a full breakdown. Let us know if you have any questions!"
Day-of / in-person estimate

Only when absolutely necessary (client insists) and/or a $50 estimate fee is approved. Once the online estimate is approved and a pre-install visit is requested, we take a $100 pre-install deposit — deducted from the total if they close with us. That $100 is only refundable if the in-person measurement varies more than 15% from the online one.

Follow-up message templates

No response after estimate:

"Hi [Name], just checking in on the estimate we sent. Let me know if you had any questions!"

Waiting on other quotes:

"Totally understand you're shopping around. If there's anything you'd like us to revisit or adjust, let me know."

Customer says our minimum is too high:

"We completely get that! Just to share context, our minimum helps ensure we send a licensed crew with all the right tools to get it done right."

Discount / counter offer:

"We might be able to offer [a small credit/discount] depending on scope — would that help?"

Any discount offered must be confirmed with Celia first — don't quote a number before she signs off.

06 Installation SOP

Before install 1 day prior

Confirm client address, arrival time and access details. Confirm the installer is available and has the materials for the job ready. Confirm the job is on the CGP calendar. Confirm preferred payment method (Zelle, mailed check, or credit card — note the 3% + $0.10 processing fee for card).

Day of install

Notify the customer of their arrival window. Confirm all materials are ready before the crew heads out.

Post-install same day

Check with the crew that the job went well. Once confirmed, check in with the client — if happy, request a review and collect payment, then move the card to review-pending. If unhappy, do not ask for a review; move to "issues during installation," resolve it immediately (loop in Celia if needed), then collect payment and move to job completed once resolved.

07 Payment & invoicing

Zelle

admin@coastlinegutterpros.com

Check

Mail to: 4325 Zaca Pl, Los Angeles, CA 90065. Ask Alex to check the mail for these.

Credit card

Send a Stripe link. Add the processing fee to the quote value first — the maximum credit card payment we accept is $2,500 (fee included).

!

Card fee — confirm the current number before quoting it Source documents disagree: the general FAQ and the pre-install step both say 3% + $0.10, while the payment section says 3.5% + $0.10. Don't guess — confirm the live rate with Celia before telling a customer a number.

If the client's Zelle has hit its daily limit

  • Option 1: break the Zelle payment across the following days.
  • Option 2: deposit at a Chase bank branch.

Follow-up if unpaid

"Hi [Name], just a quick reminder regarding your invoice. Let us know if you need help with the payment process."

Unpaid balance escalation window

High
Escalate when: payment isn't collected within 24 hours of installation being completed, or the client is unresponsive.
Response: if the client is unresponsive or won't send payment, loop Celia in ASAP — don't let it sit past the 24-hour window.

08 Reviews & customer feedback

Only request a review once you're confident the outcome was positive — never right after resolving a complaint.

"Hi [Name], one small favor—if you could leave a quick 5-star review, it would mean a lot! Here's the link: g.page/r/CX6aVUFd_PT3EBM/review"

09 FAQs / troubleshooting

How long does installation take?
Normally 3–4 hours, up to half a day depending on job size.
Do you accept credit card / check?
Yes to both. Credit card carries a processing fee (confirm current rate — see the note above). Checks mail to 4325 Zaca Pl, Los Angeles, CA 90065.
My Zelle has a daily limit — what now?
No problem — split the payment and send the remaining balance once the limit resets.
Is your gutter seamless? Does it come with color?
Yes, seamless gutters. They come pre-painted — the color chart and styles are in the gutter guide.
Do you offer cleaning and gutter guards?
Yes to both. Cleaning is always required before installing gutter guards.
Is there a warranty?
5-year workmanship warranty on any full gutter system we install. Repairs or partial installs are not covered under warranty.
Why is the minimum so high?
We use licensed, insured crews with the right tools and setup. The minimum covers base cost and protects quality.
Do you install copper gutters? What size do I need?
Yes — customer rate $50/ft. Most homes use 5″ gutters; tile roofs or heavy-rain areas should use 6″.

Self-assessment

Complete this after working through the module. Multiple-choice questions are graded instantly; short-answer questions are sent to the team for review. Enter your name and email so your responses can be returned to you with feedback.

multiple choiceA call and a text both come into QUO while you’re finishing another call. What’s the correct priority?

Correct.
Marked incorrect — review this one.

multiple choiceWhat is the standard gutter installation minimum, calculated correctly?

Correct.
Marked incorrect — review this one.

multiple choiceA client asks for a quote. What’s the preferred way to send it?

Correct.
Marked incorrect — review this one.

multiple choiceWhen can you apply the 15% self-estimate discount?

Correct.
Marked incorrect — review this one.

multiple choiceHow long after a completed installation should payment be collected?

Correct.
Marked incorrect — review this one.

multiple choiceA customer is unhappy after installation. What do you do?

Correct.
Marked incorrect — review this one.

multiple choiceA client’s Zelle has hit its daily limit. What’s a valid option?

Correct.
Marked incorrect — review this one.

multiple choiceBefore offering any discount to a hesitant customer, you must:

Correct.
Marked incorrect — review this one.

short answerIn your own words, explain why we always try an online estimate before sending someone out — and how you’d pitch the 15% self-estimate discount to a client.

short answerA customer disputes their balance and stops responding to texts. Describe the exact steps you’d take and what you’d document before escalating.

Mobile auto glass repair & replacement

BCB Auto Glass

BCB Auto Glass is part of the BCB group, running Auto Glass of LA (AGLA), SFV Auto Glass and Del Mar Auto Glass across CA / AZ / WA. Always identify yourself to the client as "LA Auto Glass", not BCB. A sister umbrella, XPRO, runs Bay Area brands separately. Full docs live on the internal wiki.

Module summary
  • Identify yourself as ‘LA Auto Glass’ to clients — never ‘BCB’. We run Auto Glass of LA, SFV and Del Mar.
  • Core tools: Omega EDI (CRM/system of record), Google Sheets Jobs Tracker (update columns L–P on booking), WhatsApp (techs), Podium (client SMS), Stripe (payments), ClickUp (warranty only).
  • The moment a lead lands: text the client from the LA Auto line, then confirm tech → order part → confirm appointment → share photos → update tracker.
  • Order parts within 24h of the job, from the tech’s preferred warehouse when reasonable. Push dealership parts for 20–30% off list.
  • Insurance jobs = two appointments: glass replacement first, ADAS calibration second (handled by our team).
  • Never say ‘no availability’ or ‘fully booked.’ Acknowledge urgency, use ‘checking parts’ as a buffer, offer next-day priority.
  • Escalate to David when parts can’t be found or a tech is fully booked; escalate part-price gaps over $20 to Alex/Celia.

? Quick FAQ

The fast answers. Full detail is in the sections below — or use the search bar up top.

What name do I use with clients?
Always ‘LA Auto Glass’ (AGLA) — not BCB.
Where does the dollar price go when I message the technician?
Nowhere — don’t send the price to the tech unless the client is paying cash. It’s omitted from the standard job note.
A client demands a specific time today and we can’t hit it. What do I say?
Never say we’re unavailable. Blame parts/logistics, say the part’s arriving tomorrow, and offer first-thing next-day priority with 1–2 windows.
Where do warranty issues get tracked?
Only in ClickUp — not Omega, not the Job Tracker.
The tech’s preferred part is $35 more than the sales-team price. Can I order it?
No — a gap over $20 needs Alex/Celia approval first. Up to $20 is fine. Also weigh added travel cost.
What’s different about insurance jobs?
They’re always two separate appointments: glass replacement first, ADAS calibration second (our team handles calibration).
An insurance virtual card comes in for much less than expected. What do I do?
If it’s less than 25% of the expected payout, flag it in team chat and contact insurance for a correction before processing anything.

01 Internal tools

Omega EDI Primary CRM

Lead & job system of record

Xpro CSR uploads every new lead here. Scheduling checks it for requested date, part number (under "items"), and job details. You may also see line items like SRI (labor) and HAH (adhesive) — neither of those gets ordered as a physical part.

Google Sheets — Jobs Tracker

Scheduling working doc

New leads appear in the Jobs section. Columns L–P must be updated the moment a job is booked: arrival window confirmed, technician assigned, supplier/warehouse pickup location, and notes.

WhatsApp

Primary technician channel

Default channel for sending job details to techs. If no reply in 10–15 minutes, call. There's also a dedicated Back Office – LA Auto group for after-hours handoffs.

Podium owneroperated login

Client-facing SMS

All client texts go out from here, including the saved dispatch template sent the moment a lead comes in. Podium lead-delivery keys live in Cloudflare Pages env vars per site — rotating one means updating and redeploying every project, not just one.

Stripe

Debit/credit payment links & insurance invoicing

Used for standard client payment links and for processing insurance virtual-card payments (see Payments below).

ClickUp Warranty only

Warranty tracking

Warranty issues are tracked only in ClickUp — not in Omega, not in the Job Tracker. Don't duplicate warranty notes elsewhere.

BCB Glass Ops dashboard

Laravel + Filament, hosted on Cloudways · live since June 23, 2026

Runs intake → schedule → assign tech → collect payment → pay tech → review texts for the LA, SFV and Del Mar entities. Access is role-based — give people the lowest role that does their job:

RoleCan do
super_adminEverything, including granting roles, templates, API keys, timing, ROAS
adminOperations + entities/employees/warehouses + delete jobs. No templates, APIs, timing, or ROAS.
dispatchOperations only — intake, scheduling, jobs, payments
financeBank Transactions ledger only (match/flag/confirm reconciliation)

Only a super_admin can grant elevated roles, managed under Admin → Employees. Per-location phone numbers, review links, and Zelle/Venmo details live under Admin → Entities.

wiki.bcbautoglass.com

Full internal documentation

Company overview, systems map, lead flow, the 9-site marketing fleet, GBP local-SEO SOP, and best practices for git/deploys and secrets. Editing requires a GitHub account with access to the wiki repo.

🔒

Secrets & access — the one rule No credential ever goes in a committed file, a chat log, or the wiki. Dashboard integrations (SMS, Google Ads, Plaid, Stripe) live encrypted in the dashboard under Admin → Integrations & API Keys. Server config lives only in the server's own environment file. Supplier account numbers below are identifiers, not secrets — the passwords that go with them live in the team's password manager, not in this Hub.

02 Team communication rules

Contact order

Always try WhatsApp first. No reply in 10–15 minutes → call the technician. If José doesn't answer → call another technician. Don't let a job sit waiting on one unanswered message.

Language

José, Alex and Jason communicate best in Spanish — use it with them.

Route timing

Technicians are only told about a job once the day's route is finalized — never send jobs ahead of time. This avoids a tech assuming a job is "theirs" before scheduling is locked.

Multiple jobs, one tech, one day

Confirm job #1 first and wait before confirming #2 or #3. If job #1 runs late, job #2 can be reassigned without the first tech feeling like work was pulled from them.

After-hours / incomplete jobs

Still in progress at end of shift → post in the Back Office – LA Auto WhatsApp group, tag Celia, Alex and David Loo, and list what's pending (payment, review request, remaining work). Completed after hours → whoever's first in after 8:00 AM owns reaching the customer, collecting payment, and any follow-up.

Timezones

Everything in the dashboard is stored in UTC and shown/scheduled in Pacific time. If reminders go out an hour off, the timezone config broke — flag it to Alex.

Never say "no availability" or "we're fully booked." Acknowledge urgency, use "checking parts" as a buffer, and offer next-day priority as the fallback. See the urgent-request script below.

03 Scheduling workflow

Roles: Xpro CSR handles lead intake and uploads to Omega EDI. The LA Auto scheduling team confirms parts, communicates with the technician, confirms the arrival window, and updates the tracker.

Step 1 — Lead intake & the immediate client text

Xpro CSR gathers year/make/model, repair type, VIN/part # if available, name, phone, address + ZIP, and any special notes ("call 20 min before"), uploads to Omega EDI, and notifies the scheduling team.

The moment a lead lands, text the client from the LA Auto Podium line using the saved template:

"Hi! This is the dispatch team at AGLA. We're coordinating your installation and are working on getting our team out to you as soon as possible. To make sure we come fully prepared, could you send over some photos of the glass that needs replacement? Thank you!"

That text also includes a disclosure that broken glass may have caused hidden damage to the regulator, latch or lock, which isn't always visible up front and isn't covered by the glass-replacement service.

Then, in order: 1) call the technician to confirm availability + preferred part location · 2) order the part · 3) confirm the appointment with the client (call directly if urgent — within 1–1.5 hours) · 4) confirm part pickup location + job details with the tech and share the client's photos in the WhatsApp group · 5) update the Job Tracker and Omega with appointment details.

Step 2 — Confirm technician availability

Call the technician to confirm they can take the job, that the part matches what they see in the client's photos, when they can pick up the part, and the day/time they can be on-site (aim for same day).

Step 3 — Check part availability & order

Identify the nearest warehouses based on job location and the technician's other jobs that day, to keep their route efficient. Call IGC and/or Mygrant Compton for availability, price, and to place a will-call pickup order. Choose the supplier on lowest cost, availability, and proximity to the job site or the tech's route.

Order the part within 24 hours of the job. For dealership parts, always push for at least 20–30% off list price — if offered 20%, ask if they can do 25–30%.

!

Insurance jobs are always two separate appointments Glass replacement first, ADAS calibration second (handled by our own team). The technician only does the glass on visit one. If the client asks about calibration, they should be referred back to us.

Step 4 — Confirm appointment & payment method with client

Default arrival windows are 3 hours: 9–12, 10–1, 11–2 … up to a last window of 3–6 PM.

"Hi NAME! Your total amount due is $000, you can send payment via Zelle to admin@autoglassofla.com. If you'd prefer to pay with debit card or credit card (this has a 3% processing fee) instead, just let us know and we'll prepare a payment link for you."

Always send confirmation to the technician once the client agrees — overcommunicate rather than assume.

If you can't confirm a technician/time within 20 minutes of a new lead alert, buy time with the BCB-scheduling-delay Quo template rather than going silent:

"Hi {{FIRST_NAME}}, I wanted to give you a quick update. Your replacement glass is available, but it's currently at one of our other warehouse locations. We're already working on transferring it over, and everything is moving forward as planned. We're just confirming the exact arrival time and will have an update for you shortly. I'll keep you informed every step of the way, and as always, feel free to text me anytime if you have any questions."
Step 5 — Send job details to the technician

Primary method: WhatsApp group. No response → call the tech → still nothing → call someone else. Send this exact set of fields:

Customer Name:
Date / Time for appointment:
Phone Number:
Address + ZIP:
Car Year/Make/Model:
Part Needed: (e.g., FB22496YPNN, Back Glass)
Location of Part on Vehicle: (Front / Back / Side)
Quote Price: only if client is paying CASH
Notes: (e.g., "Must call 20 minutes before")
Pickup Location: (ready for pickup at IGC / Mygrant)

Do not include the job's dollar price in the note to the technician unless the client is paying cash.

Step 6 — Update the Job Tracker & Omega

Update columns L–P immediately after booking: arrival window confirmed, technician assigned, supplier/warehouse pickup location, and notes (tech notes, part notes, delays, customer comments). Update the appointment date/time in Omega EDI too. If the customer reschedules or cancels, tell the technician immediately, confirm the next available time, and update the CRM + tracker right away.

Step 7 — Collect payment
  • Debit/credit: process via Stripe. Debit carries no added fee (1% absorbed); credit adds 3%. Include a photo of the repaired area and the vehicle details when possible.
  • Cash: tell the technician the exact amount the client owes, then follow up with the technician until they Zelle us the full amount.
  • Venmo: not a standard option — only offer it if the client explicitly asks. If so, they can pay the owner directly at @alex-borkin.
Urgent / specific-time appointment requests

Goal: acknowledge urgency, buy time to coordinate, and control the scheduling conversation without losing the client.

Step 1 — immediate response (within 2–5 minutes):

"Hi [Client Name], thanks for reaching out — I see you requested a specific time today, we're on it. I'm currently checking part availability to make sure we can complete this within your requested timeframe. I'll get back to you shortly with an update."

Step 2 — internal coordination: check technician availability, location proximity, and job duration feasibility. Don't confirm a time yet. Prioritize existing routes and efficient scheduling.

Step 3A — if the time works:

"Good news — we're able to accommodate your requested time. I'll lock this in for you at [time]. You'll receive a confirmation shortly."

Step 3B — if it doesn't: blame the constraint on parts/logistics, never on scheduling capacity.

"I just got confirmation — the part needed for your vehicle isn't available for that exact timeframe today. We've gone ahead and ordered it, and it will be arriving tomorrow morning. We can prioritize you first thing tomorrow at [offer 1–2 time windows]. Let me know what works best for you."

Step 4 — lock it in once the client agrees: confirm time, assign technician, send confirmation.

"Perfect — we've got you scheduled for [date/time]. Our technician will reach out when they're on the way."

If the client pushes back further:

"I completely understand the urgency — if anything opens up sooner today, I'll reach out right away and move you up."

04 Supplier accounts

Use the warehouse the technician prefers when reasonable — it's usually the most route-efficient option. See the part price-difference rule below before overriding that.

SupplierAccountNotes
IGC LAAcct #771 · BCB Auto GlassAlways call IGC LA, then ask them to place the order at the specific warehouse location the technician prefers. Login is on file in the team password manager.
Mygrant Glass Co.Acct C038903-001 · BCB Auto Glass LLCBilled weekly. If a refund is requested within the billing period, it's typically applied as a bill discount rather than a processed reimbursement — don't expect a separate refund transaction.
Pilkington North AmericaAcct #946441552 County Hwy G4, San Jose, CA 95131 · (800) 282-1986
PGW Auto Glass LARef 877-929-2526 (Xpro Gateway)317 W Victoria St, Gardena, CA 90248 · (888) 774-2886
O'ReillyAcct #2838208 (temporary)4325 Zaca Pl, Los Angeles, CA 90065 · payment by phone via Nico or Celia
Lexus of GlendaleBCB Auto Glass LLCPayment by phone via Nico or Celia
Kearny Mesa Hyundai ServiceAcct #H4325 · BCB Auto Glass LLCPayment by phone via Nico or Celia
Audi PasadenaAuto Glass of LAPayment by phone via Nico or Celia
🔒

Usernames/passwords for supplier portals are not published in this Hub — they live in the team password manager. If you need access, ask your lead to provision it.

Part price-difference threshold

Compare the technician's preferred warehouse price to the price from the sales team (David's team). A difference up to $20 is fine, no approval needed. More than $20 higher → don't order yet, escalate to Alex/Celia for review. Also weigh whether a different warehouse adds enough technician travel to offset any savings — the goal is minimizing total job cost (part + travel/time), not just part price.

Cancelled jobs — part returns

If a job is lost/cancelled after the part was already ordered: instruct the technician to return it to the pickup warehouse, share our account info for that warehouse, verify with the technician that the return is in progress, then follow up with the warehouse to confirm receipt and that our account wasn't charged.

05 Technicians

TechnicianPhoneNotes
José Aguirre — main technician+1 (310) 425-6282Spanish speaking
Jason Aguirre — José's son+1 (562) 441-2812Handles payments, often more responsive
Alex — second main technician+1 (818) 385-7491
Miguel — secondary technicianLimited availability
!

1099 / W-9 requirement New technicians can be assigned initial jobs while onboarding, but after 3 completed jobs we must collect their W-9/1099 information before assigning more work. Keep documentation current for all active techs. Ricardo and Daniel are currently refusing to provide this — confirm willingness before assigning either of them any future job, and remove from the active roster if they continue to refuse.

06 Insurance virtual card payments Time-sensitive

Trigger: Alex sends a virtual card via the WhatsApp group or ClickUp. Process immediately on receipt — this is priority work, not something to batch later.

1. Verify the amount

Compare the card amount to the expected job payout in Omega (total job amount minus deductible). Within expected range → proceed. Less than 25% of expected → flag in team chat and contact insurance for a correction/reissue before processing anything.

2. Process in Stripe (AGLA)

Billing → Invoicing → New Invoice. Customer: Mercury Casualty Company. Line item: "Auto glass repair – Claim CAPA-XXXXXX," exact amount (no partials unless approved), quantity 1. Select Auto Charge Customer and enter the virtual card's number, expiration, and CVV, then finalize.

3. Confirm fees

Make sure no unexpected Stripe fees were deducted. If they were, screenshot the transaction and flag it internally — these should typically be avoided or accounted for up front.

4. Record & close

Mark as Paid in Omega/CRM, attach proof (screenshot of the Stripe payment), and send it to the group chat with Alex.

07 Quality control checklist

✓ Customer details

Match the CRM record.

✓ Vehicle & part

Details and part number verified against the job.

✓ Supplier confirmed

Availability and price confirmed before ordering.

✓ Technician confirmed

They've explicitly accepted the job.

✓ Arrival window

Agreed directly with the customer.

✓ Job tracker updated

Columns L–P current before you move on.

📷

Photos matter for warranty. Technicians must take thorough completion photos so we have something to compare against if a warranty claim comes in — and when a warranty request does come up, ask for photos before doing anything else. Upload job-finished photos to the shared Drive folder. We offer a lifetime warranty against leaks for both the part and the labor.

Review request link: maps.app.goo.gl/SUhpD7EEfDHwFZC46 — same rule as everywhere else: only ask when you're confident the outcome was positive.

08 BCB-specific escalation

Part unavailable at main warehouses

Medium
Response: try alternate IGC locations across LA before escalating further.
Escalate to David if none of the alternates come through.

Technician fully booked

Medium
Response: check with Jason for availability, or reschedule the client.
Escalate to David if neither resolves the conflict.

See the company-wide Escalation & Issues section for the full 22-category reference, universal escalation rules, and the record template — several of those categories (parts/quality control, OEM vs. OEE, technician pricing, Sentry incidents) are written from BCB's day-to-day operations.

Self-assessment

Complete this after working through the module. Multiple-choice questions are graded instantly; short-answer questions are sent to the team for review. Enter your name and email so your responses can be returned to you with feedback.

multiple choiceHow should you identify the company to a client?

Correct.
Marked incorrect — review this one.

multiple choiceWhen do you include the job’s dollar price in the note sent to the technician?

Correct.
Marked incorrect — review this one.

multiple choiceWhere are warranty issues tracked?

Correct.
Marked incorrect — review this one.

multiple choiceA client requests a specific time today that isn’t possible. What’s the right approach?

Correct.
Marked incorrect — review this one.

multiple choiceHow soon before the job should a part be ordered?

Correct.
Marked incorrect — review this one.

multiple choiceThe tech’s preferred warehouse part costs $35 more than the sales-team price. What do you do?

Correct.
Marked incorrect — review this one.

multiple choiceAn insurance-approved job involves glass replacement and ADAS calibration. How is it scheduled?

Correct.
Marked incorrect — review this one.

multiple choiceAn insurance virtual card arrives for less than 25% of the expected payout. What’s the correct step?

Correct.
Marked incorrect — review this one.

multiple choiceWhich columns of the Jobs Tracker must be updated right after booking?

Correct.
Marked incorrect — review this one.

short answerWalk through, in order, everything you do in the first few minutes after a new LA lead comes in — from the client text to updating the tracker.

short answerA technician has completed 3 jobs but is refusing to provide W-9/1099 documentation. Explain the policy and how you’d handle assigning them future work.

Maintenance coordination for a property management portfolio

The Property Advisors

The Property Advisors is a full-service residential & commercial property management company. We serve as their Maintenance Team — coordinating repair and maintenance requests between tenants and the approved vendor list on their behalf.

01 Company & core contacts

Grant Paules

Company owner, The Property Advisors

+1 (626) 818-5458
Grant@thepropadvisors.com

Maintenance team line

OpenPhone number

(213) 463-5409
maintenance@thepropadvisors.com

Internal reporting

Twice-weekly report goes to

Celia — every Wednesday and Friday.

What Property Advisors covers

Residential

Marketing properties and screening tenants, collecting rent and managing leases, coordinating repairs and ongoing maintenance, handling tenant concerns and evictions when necessary, and ensuring compliance with local housing law.

Commercial

Leasing and managing retail/office/industrial units, overseeing vendor contracts (landscaping, janitorial, security), coordinating maintenance and capital improvements, enforcing lease terms, and owner financial reporting.

Module summary
  • Our role: we’re the Maintenance Team for The Property Advisors, coordinating tenant repair requests with approved vendors — owner is Grant Paules.
  • Main tool is AppFolio; portal requests auto-create work orders, phone/email requests must be logged manually. All logins live in Bitwarden.
  • Triage every request: Emergency (same day), Urgent (1–2 days), Normal (3–7 days).
  • Vendor selection: use the Service Providers sheet — hierarchy ‘1’ = try first, and check the property-serviced column. Rodrigo is the go-to for odd/hard-to-classify jobs.
  • Tenant comms: stick to the reported issue, never suggest upgrades (maintain existing, replace only if broken), and don’t re-ask for info they already gave.
  • Always follow up with the tenant one week after assignment to confirm resolution.
  • Special/renovation requests go straight to Grant; report twice-weekly (Wed & Fri) to Celia.

? Quick FAQ

The fast answers. Full detail is in the sections below — or use the search bar up top.

A phone request just came in. Does AppFolio log it automatically?
No — only tenant-portal requests auto-create a work order. Phone and email requests you log manually.
How do I pick which vendor to use?
Use the Service Providers sheet: hierarchy ‘1’ is first choice, and check the property-serviced column — not every vendor covers every property. Unsure or odd job? Rodrigo, or text Grant.
A tenant wants a fixture ‘upgraded.’ What’s our policy?
Maintain existing items; replace only if actually broken. Don’t suggest upgrades. If it’s a replacement/renovation request, get photos and send to Grant to decide.
Where are the logins kept?
All AppFolio, email and OpenPhone logins are in Bitwarden — nowhere else.
How is an emergency defined and handled?
Anything that can cause harm, damage, or make a unit uninhabitable — no heat/AC in extreme weather, flooding, gas smell, etc. Assign immediately, call the vendor, notify the tenant.
When do I follow up with the tenant?
One week after the work order is assigned, to confirm the issue was resolved.
Do I have to report anything regularly?
Yes — a report to Celia every Wednesday and Friday covering texts/calls/emails managed, work orders added and assigned, follow-ups, and special requests.

02 Internal tools

AppFolio Main platform

Property management CRM & work order system

Where every maintenance request lives, from creation through status tracking to close-out. See the full quick guide below.

AppFolio Portal

Tenant-facing view

Used to test and simulate tenant requests and notifications before relying on them in production.

OpenPhone

(213) 463-5409

Text vendors directly after assigning a work order to confirm they actually received it — some vendors get overwhelmed and miss AppFolio notifications, so this extra ping matters.

Microsoft 365 email

maintenance@thepropadvisors.com

Phone and email requests must be logged into AppFolio manually — they don't auto-create a work order the way the tenant portal does.

Service Providers Google Sheet

Vendor master list

Source of truth for the vendor directory below. If a new vendor gets used, add them here as well as in AppFolio.

Internal CRM (agency-side)

Cross-company lead tracking

Any lead from Property Advisors gets added here too, for follow-up tracking. Tag it "prop advisors" if another vendor is handling the job, or tag it with the handling company + "Grant" if we're the vendor doing the work.

🔒

Logins: all AppFolio, email, and OpenPhone logins are stored in Bitwarden — not written down anywhere else, including here.

03 Team & tenant communication rules

Tenant communication

Stick to the reported issue

Don't expand scope or ask about unrelated items (garbage disposal, extra fixtures) unless the tenant raised them.

No redundant questionnaires

If the tenant already gave the details in the original request, don't send a follow-up form asking for the same thing again.

Clarify only when necessary

Only ask follow-ups that are critical to determine whether the issue is truly broken vs. functioning, and what type of technician is needed.

Never suggest upgrades

Policy: maintain existing items, replace only if actually broken. Don't imply a replacement or improvement unless confirmed not working.

Resolution, not exploration

The goal is confirming what's broken and whether it's already fixed or needs dispatch — nothing more.

Escalation requirement

If you're unsure about messaging or scope, consult your supervisor before contacting the tenant — don't guess and send.

Working on Grant's own properties

If any of our companies do work directly for Grant (not just coordinating a third-party vendor), let Brian or Marco know so photos/schematic proposals can be prepared for him, and loop Celia in — pricing for Grant's own jobs is being reconsidered and shouldn't be quoted ad hoc.

04 Urgency triage

Emergency

Same day
Can cause harm, property damage, or make the unit uninhabitable if not resolved immediately.
No heat/AC in extreme weather · major leak or flooding · broken water heater · sewer backup with no other toilet · sparking or power-outage electrical issue · gas smell (call the gas company too) · broken exterior door lock · fire or structural damage
Action: assign immediately, call the vendor right away, and notify the tenant.

Urgent

1–2 days
Needs prompt attention but isn't immediately dangerous.
Clogged sink/toilet with another usable one · fridge not working · broken window (security risk, no immediate danger) · rodents/wasps inside the unit · leaky faucet or minor water damage · smoke detector chirping or needing replacement
Action: assign within a day, coordinate the vendor, keep the tenant updated.

Normal / routine

3–7 days
Inconveniences that don't affect safety, health, or basic living conditions.
Broken cabinet door · interior paint touch-ups · lightbulbs out in shared areas · minor wall/floor cracks · garage remote not working · broken blinds or screen door
Action: group and batch if possible, assign based on vendor availability.

05 Handling a request

Request came through the tenant portal
  1. Review the submitted info. If it's an upgrade/replacement request, get photos from the tenant and send them to Grant — he decides whether it truly needs replacing or just cleaning.
  2. Check the tenant's preferred availability (note it may be outdated — treat it as a reference only).
  3. Select a service provider from the approved vendor list. If unsure, text Grant with details on the issue and unit. Use Rodrigo (handyman) for uncommon or hard-to-classify issues.
  4. Call the vendor, explain the issue, and give them the tenant's phone number and address to coordinate directly. Assist with scheduling if needed, and explain urgency.
  5. Assign the vendor to the work order.
  6. Follow up with the tenant 1 week later to confirm the issue was resolved.
Request came by phone or email
  1. Collect the tenant's full name, property address + unit number, and issue details.
  2. Identify (or figure out) how urgent it is.
  3. Request photos if necessary.
  4. Log it in AppFolio as a new work order — mark it internal, assign a vendor (or leave blank if unknown), and if it's a new vendor, add them to the Google Sheets vendor list too.
  5. Call the service provider, give them the details, and ask them to coordinate directly with the tenant. Assist if needed.
  6. Follow up with the tenant 1 week later to confirm completion.
Special / non-repair requests (renovation, scope changes)

For anything that isn't a standard repair — "remove a wall," "replace window," "new flooring" — collect the tenant's full name, property + unit, a description of the request, and current photos, then send everything directly to Grant Paules at Grant@thepropadvisors.com. Don't try to route these through the normal vendor-assignment flow.

Vendor selection rules: the Hierarchy column in the vendor list — anyone marked "1" is the first person to try. The Property Serviced column matters — not every vendor covers every property. Vendors with hierarchy 1 are the ones Grant relies on most.

06 AppFolio quick guide

Creating a new work order manually
  1. Go to Maintenance > Work OrdersAdd Work Order.
  2. Fill in property + unit, category (plumbing, electrical, etc.), description (copy the tenant's report), priority (Normal / Urgent / Emergency), and confirm contact info accuracy. Assign a vendor or leave unassigned.
  3. Save.
  4. If the tenant sent photos by text or email, attach them at the bottom of the work order.
  5. Once a vendor is assigned, share the photo with them so they arrive prepared.
💬

Always text the vendor from the OpenPhone number after assigning, to confirm they actually received the work order — AppFolio notifications get missed.

Work order status meanings
StatusMeaning
OpenSubmitted, not yet assigned or handled
AssignedAssigned to a technician or vendor
In ProgressWork has started
On HoldPaused — e.g. waiting on parts or tenant availability
CompletedWork finished, pending final confirmation
ClosedFully resolved and confirmed

Keep statuses current — everyone downstream relies on them being accurate, not eventually accurate.

Assigning the right help & notes
  • Only assign approved vendors already in AppFolio contacts (see the Service Providers sheet).
  • Leave internal notes before assigning. Tenants are auto-notified of most updates.
  • Use the Notes section to log progress ("vendor contacted," "scheduled for Friday"), attach shared photos/documents, and text vendors via OpenPhone to confirm receipt.
  • Follow up with the tenant 1 week after assignment to confirm resolution.

07 Vendor directory

Every approved service provider. Priority 1 rows are the go-to vendor for that trade — try them first. "All" in Property Serviced means no restriction; anything else means that vendor is limited to the listed properties. Use the search bar at the top to filter this table by name, trade, or property.

VendorCategoryProperty servicedPriorityPhoneContact viaNotes
Gruest, RodrigoGeneral / all tradesAll1(818) 356-6877TextGo-to for most things — often overloaded, confirm timing before assigning.
Abrego's Cleaning ServiceCleaningAll1(323) 742-4580Call
American Cleaning Maintenance ServicesCarpet cleaning / floor sealing / trash haulingAll1(818) 378-8332Call
Clean Right, IncCarpet cleaningCourtney Terr(661) 949-2900Call
Carpet TymeNew carpetAll(805) 495-0809CallUsually vacant apartments only — get approval first.
V & A Flooring IncFlooringAll2(818) 843-4773Callvandaflooring@gmail.com · used at Courtney Terr for carpet; say they cover many other jobs too.
Delena, PanMonthly landscapingPatrican(626) 893-3711Text
Leon, JoseMonthly landscapingVia Palacio / Sinclair Pl(661) 816-7470Text
Mendoza, AlbertoMonthly landscapingSkouras(818) 939-6061Text
Ruedas, YolandaMonthly landscaping(818) 664-6467Call
Solis, JoseMonthly landscapingLa Peer(310) 346-1307Text
Vasquez, RogelioMonthly landscapingDockweiler(323) 377-6203Text
Damian Gardening ServiceMonthly landscapingSalceda(661) 309-2170Callrdamianc79@gmail.com
Gabriel GardeningMonthly landscapingCourtney Terr(661) 916-6601Call
Green Onion LLCMonthly landscaping / tree trimmingFranklin / Van Ness1(818) 428-0446Callmarcelolaz36@gmail.com
Leo's Landscaping & MaintenanceLandscaping / lot cleaningVictory(818) 760-4574Call
Sandoval, MartinLandscaping clearing / newAll(626) 329-6646Text
Lopez Tree and Landscaping IncLandscaping / tree trimmingAsk3(626) 217-8035CallOn the higher end — use only if no one else can do it.
Oksas, AnthonyMonthly poolVia Palacio / Sinclair Pl(661) 212-6209Call
Cena's Pool Service and RepairMonthly poolLos Amigos(818) 281-4991TextMarc818cena@hotmail.com
Hot Tropic Pool & SpaMonthly poolCourtney Terr(661) 488-1099Text
LA Pool Services IncMonthly poolFranklin / Van Ness(213) 393-9393Calllapoolservices@gmail.com
Nissi Plumbing Inc.Plumbing (general)All1(818) 203-7674Callnissiplumbinginc@gmail.com
L.A. Hydro-Jet & Rooter Service, Inc.Hydro jettingAll(800) 750-4426CallUse only if Nissi can't snake the line.
LeadingEdge Plumbing & Rooter, Inc.Specialized / complex plumbingAll3(888) 525-3234Callinfo@leadingedgeplumbing.com
Sewer Inspections & RepairsDrain issuesFranklin / Van Ness5(818) 568-0051Call
Western Supreme Rooter, Inc.Complex plumbingAll5(626) 448-6455CallCan do inspections and pipe liners.
Circulating Air, Inc.HVACAll1(818) 983-0775Callservice@circulatingair.com
Andy's AC RepairHVACAll2(818) 913-2033CallOften beats Circulating Air's price/replacement quotes.
Lindsey's Heating and ACHVACAll3(626) 794-1191Call
Nicolas Electric GroupElectricianAll2(818) 458-2285Call
AA Electrical Services IncElectrical / panelsAll3(818) 426-6810CallHigher pricing — complex jobs / emergencies only.
Modern ApplianceAppliance repairAll2(818) 200-6737Call
Twin Appliances Inc.Appliance repairAll1(323) 758-2442Textservices@twinappliancesinc.com
Elias FotosAppliance repairFranklin / Van Ness / La Peer(818) 563-4407CallOlder appliances at those buildings only.
B & B Lock and Security, Inc.Locksmith / gates / handrails / weldingAll1(626) 576-2340CallVan is the owner.
Total RelockLocksmithAll1(323) 219-3929Call
Foothill Lock & KeyLocksmithColo Robles(626) 798-0886Call
Real Lock & KeyLocksmithAll(626) 567-9881Call
Precision Iron WorksGates / fence / handrails / weldingAll1(714) 595-4144Callcustomerservice@precisionironworks.co
LA City TechnologiesAccess control / intercom / camerasAll1(877) 711-2100Call
Jack Access Control Inc.Access control intercomAsk5(818) 402-8131CallAsk before using.
San Marino Security SystemsAlarm / securityAsk(626) 285-7778Callinfo@sanmarinosecurity.com
Post Alarm SystemsSecurity / patrolFranklin(800) 654-7678CallTrespassing / patrol service.
Best Choice Painting Co.PaintingAll1(213) 386-3272TextContact: James.
AC PaintingPainting / small projectsAll2(323) 378-2093Text
Fume A Pest & Termite ControlPest controlAll1(818) 757-4555Call
Morales Exterminating CO., INCTermitesAll1(626) 572-7363Call
Exclude Pest Exterminating CoPest controlOpp(310) 215-1111Callexclude@excludepest.com
Walsh's Pest ControlMonthly pestColo Robles(626) 359-4712Call
Harry's Glass Shop, Inc.New glass / commercial doorsAll1(626) 796-4625Calljerry@harrysglassshop.net · ask for Jerry.
Highland Park Glass CoWindows / glass repairFranklin / Van Ness1(323) 254-3444Callhighlandparkglassco@gmail.com · always confirm his availability.
We ScreenWindow screensAll(626) 827-8337Call
Budget BlindsWindow coverings / blindsOcean Park(310) 294-3538Callsrasekh@budgetblinds.com · high-end blinds.
Bathtub Refinishing & Fiberglass ExpertReglazing — shower/sink/countertopAll1(323) 396-1030TextText photos of the areas needing work.
AAA Refinishing CorpReglazing — shower/sink/countertopAll3(800) 456-1492CallTry Bathtub Refinishing & Fiberglass Expert first; old fixtures only, get Grant's photo approval first.
Immediate Fire Protection Inc.Extinguishers / fire alarms / annual certAll1(323) 448-8469Callalejandra@immediatefire.com · always sends a quote before work — follow up if it doesn't arrive.
Pioneer Fire ProfessionalsAnnual certsAll(818) 785-3106Call
Alliance Elevator CompanyElevator repairFranklin / Van Ness1(323) 428-4807Callinfo@allianceelevatorco.com
Mission Paving and Sealing, Inc.Lot striping / pavingAll(626) 452-8200Call
JE Garage DoorsGarage doorsTampa(818) 713-0212CallProvided via the HOA.
E.M. ServiceHandymanAll / Ask2(818) 590-8647Callaalegar@aol.com · basic jobs only.
A & G SignsProperty signageAll(626) 794-3336Call
Coastline Gutter ProsGutter installation / repair / cleaning1(323) 452-1809Calladmin@coastlinegutterpros.com · also one of our own three companies — see the CGP hub for their internal SOPs.

No vendors match that search.

08 Reporting

Send a report to Celia every Wednesday and Friday covering:

Number of texts managed

Number of calls managed

Number of new emails managed

Number of work orders added to AppFolio manually

Number of work orders managed & assigned to a vendor

Number of 1-week tenant follow-ups completed

Number of special requests / other situations managed — with details if any came up

Self-assessment

Complete this after working through the module. Multiple-choice questions are graded instantly; short-answer questions are sent to the team for review. Enter your name and email so your responses can be returned to you with feedback.

multiple choiceA maintenance request comes in by phone. What must you do in AppFolio?

Correct.
Marked incorrect — review this one.

multiple choiceIn the vendor list, what does a hierarchy value of ‘1’ mean?

Correct.
Marked incorrect — review this one.

multiple choiceA tenant asks whether they can have a working cabinet replaced with a nicer one. What’s the policy?

Correct.
Marked incorrect — review this one.

multiple choiceWhere are all logins stored?

Correct.
Marked incorrect — review this one.

multiple choiceWhich of these is an Emergency (same-day) issue?

Correct.
Marked incorrect — review this one.

multiple choiceAfter assigning a work order, when do you follow up with the tenant?

Correct.
Marked incorrect — review this one.

multiple choiceA tenant requests something outside standard maintenance, like ‘remove a wall.’ What do you do?

Correct.
Marked incorrect — review this one.

multiple choiceFor an uncommon or hard-to-classify issue, who is the default go-to?

Correct.
Marked incorrect — review this one.

multiple choiceHow often do you send a report to Celia, and on which days?

Correct.
Marked incorrect — review this one.

short answerA tenant reports a leaking faucet and also casually mentions their garbage disposal ‘could be better.’ Explain how you’d handle the request and why.

short answerDescribe how you’d choose a vendor for a plumbing emergency at a specific property, including what you’d check before assigning.

Applies across all three companies · internal use only

Escalation & issues

A practical record of the operational problems, escalation patterns, quality failures, staff issues, customer/payment situations, supplier problems, and system failures that come up repeatedly. Use this as your "what can go wrong / when to escalate" reference — not to expect failure, but to know what deserves attention, what gets documented, and when something stops being handled informally.

i

Scope note This consolidates issues drawn from real operational history across the companies. It's written as an onboarding/SOP reference, not a chronological log — individual incidents should still be handled per current company policy and verified before being treated as a disciplinary record.

Module summary
  • Purpose: know what deserves attention, what to document, and when a problem stops being handled informally and gets escalated.
  • Never invent a price, ETA, part availability, policy interpretation, or customer promise.
  • Document patterns, not single incidents — with dates and examples, not memory.
  • Protect the customer experience first: communicate delays before the customer has to ask.
  • Preserve evidence for every escalation: screenshots, photos, timestamps, invoices, messages.
  • When a system fails, judge impact first: informational, recoverable, workflow-blocking, order-blocking, or data-loss risk.
  • Every escalation states: WHAT, WHEN, WHO/WHAT is affected, IMPACT, WHAT’S BEEN DONE, WHAT’S NEEDED NEXT, and WHO OWNS IT.

? Quick FAQ

The fast answers. Full detail is in the sections below — or use the search bar up top.

A customer keeps asking for a certainty I can’t confirm (price/ETA/part). What do I do?
Separate confirmed facts from possibilities. Give the next checkpoint or update time instead of inventing certainty.
An automation broke and a time-sensitive job is stuck. What’s first?
Manually complete the time-sensitive customer/dispatch work first, then investigate the automation.
A vendor portal shows a different amount than our actual records. How do I handle it?
Preserve both records, identify the authoritative source, and escalate to the vendor/account rep with evidence before reconciling.
Each individual rule-break seems small. Do I still escalate?
Yes — repeated SOP non-compliance gets escalated even when each incident seems minor, because repeated exceptions create real operational risk.
What are the seven things every escalation must identify?
What happened, when, the customer/job affected, the business impact, what’s already been done, what’s needed next, and who owns it.

Universal escalation rules

Never make up a price, ETA, part availability, policy interpretation, or customer promise.

Never approve a technician's extra charge simply because they ask for it — verify the approved pricing/process first.

Document repeated behavior as a pattern with dates and examples, rather than relying on memory.

Protect customer experience first: communicate delays before the customer has to ask.

Separate confirmed facts from possible options when communicating externally.

Preserve evidence for escalations: screenshots, photos, timestamps, invoices, supplier messages, error messages, and relevant task/CRM records.

When a system fails, determine impact first: informational, recoverable, workflow-blocking, order-blocking, or data-loss risk.

If an automation fails, manually complete time-sensitive work first, then investigate the automation.

When a vendor portal conflicts with an actual financial record, preserve both and identify the authoritative source before reconciling.

Escalate repeated SOP non-compliance even when each individual incident seems small — repeated exceptions create operational risk.

Every escalation should identify: WHAT happened, WHEN, CUSTOMER/JOB affected, BUSINESS IMPACT, WHAT HAS ALREADY BEEN DONE, WHAT IS NEEDED NEXT, and WHO OWNS IT.

📋 Escalation record template

Escalation record

Copy this shape for any escalation
Date / time
Customer / job / account
Person or system involved
Issue
Expected SOP / standard
What actually happened
Impact (customer/financial/ops)
Actions already taken
Evidence attached
Current status
Next action
Owner
Escalation level
Management decision / resolution
Follow-up required

22 The reference — issue by category

Every ticket below follows the same shape: what it looks like, when to escalate it, and the standard response. Search at the top filters these by keyword.

01 · Customer payment / collection escalation

High
Example: a customer balance of $566.50 (including a 3% card fee) went unpaid from August 6 despite repeated calls/texts, until the customer blocked the company.
Escalate when: payment is overdue after normal follow-up, the customer blocks communication, disputes the balance, or refuses to respond.
Response: document the invoice/balance, contact dates, payment link sent, and all collection attempts. Stop repeated outreach once communication is blocked and route to management for the next approved step.

02 · Technician pricing / unauthorized add-ons

High
Example: a technician attempted to add $40 distance on one job, $35 on another, and $20 (described as $10 molding + $10 distance) on a third.
Escalate when: a technician requests or charges a fee not clearly authorized by pricing/SOP.
Response: don't approve ad-hoc charges just because the technician asks. Verify the job, approved pricing, geographic policy, and pre-approval. Record repeated violations and escalate to management.

03 · Technician performance / operations

Medium
Example: a technician repeatedly pushed for exceptions and extra charges despite CSR pushback, creating extra operational work.
Escalate when: the same issue repeats after correction, a technician doesn't follow pricing/process instructions, or CSR/dispatch has to repeatedly intervene.
Response: document the pattern, not just one incident. Route repeated non-compliance to management; any change to job priority/assignment goes through an approved management decision only.

04 · Parts availability / quality control

Medium
Example: for a vehicle with very limited part availability, the first windshield located had a small chip and was rejected for not meeting quality standards; another option was located and pickup coordinated.
Escalate when: a required part is unavailable, supplier inventory is unreliable, the available part is damaged/defective, or the promised install timeline may be affected.
Response: contact multiple suppliers, verify condition before committing, document availability and ETA, never install a part that fails quality standards, and proactively update the customer.

05 · Customer communication during part delays

Medium
When a part is delayed or hard to source, the customer should be updated before they have to chase us.
Escalate when: part sourcing creates a material delay, ETA changes, or the originally promised timeline is no longer reliable.
Response: explain what's been checked, what's being coordinated, what's still uncertain, and when the next update will come. Never promise a delivery/install time that hasn't been confirmed.

06 · Technician photo / job verification

Medium
Photo confirmation is a real operational control, not a formality — jobs shouldn't be closed out without it.
Escalate when: required job photos are missing, unclear, inconsistent with the job, or can't substantiate completion.
Response: don't treat the job as fully verified until required evidence is received. Request corrected photos and escalate repeat failures.

07 · OEM vs. OEE / part quality decisions

Medium
Correctly identifying what's actually being installed — OEM vs. OEE — matters for customer expectations.
Escalate when: a part is represented as OEM/OEE incorrectly, customer expectation differs from what's available, or documentation is unclear.
Response: verify part source/type before quoting or representing it to the customer. Don't let ambiguous terminology become a customer-facing promise.

08 · CSR / staff performance

High
Performance issues that are visible, repeated, or affecting customers need to be documented, not just noticed.
Escalate when: performance problems repeat, affect customer service, create operational rework, or require management intervention.
Response: document specific behaviors and their operational impact, give clear corrective direction, track recurrence, and escalate personnel decisions to management.

09 · Recruiting / staffing status

Low
A recruiter search needs to be paused promptly once a role is filled.
Escalate when: hiring status changes such that the recruiter should no longer keep sourcing.
Response: promptly notify the recruiter, pause/close the active search, and document the current candidate status to prevent duplicate work.

10 · Software / portal data not matching billing

Medium
Example: a vendor portal statement was described as not current, requiring a screen-share call with the vendor to demonstrate the discrepancy against the actual most recent charge.
Escalate when: portal data conflicts with actual billing/credit-card records, a statement is stale, or financial reconciliation can't be completed from the portal.
Response: preserve screenshots, obtain the authoritative transaction/statement, compare dates and amounts, and escalate to the vendor/account rep with evidence.

11 · Production incident: error misgrouping

Low
Example: an issue intended to represent a 429 rate-limit was instead grouped with a 401 session-expiry regression event that turned out to be self-recovering and non-order-blocking.
Escalate when: an error is incorrectly grouped, severity changes, an issue becomes order-blocking, or recovery stops working.
Response: distinguish authentication/session errors from rate-limit errors, verify whether orders are actually blocked, document impact, and keep the incident classification accurate.

12 · Customer portal polling / tab visibility

Low
Known mitigations: mount/save deduplication, and pausing polling when a browser tab is hidden.
Escalate when: polling creates duplicate activity, unnecessary requests, rate limiting, or unexpected behavior.
Response: check whether the tab is active, whether duplicate requests are occurring, and whether the mitigation is working, before treating it as a customer/order-blocking incident.

13 · Image upload size limit

Low
Example: an oversized image (~124 MP) was rejected on upload, caught and logged rather than crashing the app.
Escalate when: uploads exceed image limits, the error isn't contained, or the application crashes.
Response: capture the dimensions/error, confirm whether the event was caught safely, verify user impact, and distinguish a handled validation failure from a production outage.

14 · Email / form delivery & submission issues

High
Partial form submissions and SMTP delivery issues have shown up in lead/customer intake workflows.
Escalate when: leads may be lost, forms submit incompletely, notification emails fail, or CRM/automation data is missing.
Response: test the form end-to-end, check submission records, verify email delivery, preserve the lead source/time, and manually recover any affected lead.

15 · Automation / integration failures

High
Automations across API integrations, EDI, and workflow tools have needed troubleshooting, including cost and reliability issues.
Escalate when: an automation stops creating/updating records, duplicates records, drops information, or causes customer/dispatch delays.
Response: identify the trigger, action, affected record(s), timestamp, and whether the issue is isolated or systemic. Manually complete time-sensitive customer/dispatch work while it's investigated.

16 · Lead intake / routing failures

High
Lead-handling SOPs route intake through the CRM to the correct team channel by service line.
Escalate when: a lead isn't routed, is routed to the wrong service/team, sits unassigned, or is missing key intake information.
Response: recover the lead immediately, record the source, assign the correct owner, and identify where in the routing chain the failure occurred.

17 · Ad / platform policy misclassification

Low
An ad can get flagged or reviewed as a policy issue, prompting a rework of headlines, descriptions, or audience setup.
Escalate when: an ad is rejected, restricted, incorrectly classified, or repeatedly triggers policy review.
Response: don't just resubmit unchanged. Identify the specific claim/wording/creative/audience element likely causing the classification, revise conservatively, and document the approved version.

18 · Audience / customer data setup

Low
Questions can arise around audience setup, identifier type, and how uploaded contact data gets used for advertising audiences.
Escalate when: customer data is uploaded without a defined audience process, identifiers are unclear, or staff are unsure what the platform does with the data.
Response: use the approved audience/data SOP, confirm permitted identifiers and consent/privacy requirements, and never improvise customer-data uploads.

19 · Translation / customer-facing terminology

Low
Example: for driving permits/cards in Spanish, "permiso físico" was the preferred wording over "tarjeta," because "tarjeta" can imply a different document entirely.
Escalate when: a translation changes legal/administrative meaning, creates ambiguity, or a literal translation isn't natural for the target market.
Response: prioritize meaning and local terminology over literal translation. Flag legal/administrative terminology for review before publishing.

20 · Customer service / promise management

Medium
This shows up most in parts availability and delayed-install situations, but the principle is universal: don't overpromise an uncertain outcome.
Escalate when: the team can't confirm a part, appointment, ETA, price, or outcome, but the customer expects certainty.
Response: communicate confirmed facts separately from possibilities; give the next checkpoint/update time rather than inventing certainty.

21 · Internal communication / handoffs

High
Information gets lost between CSR, admin, technician and management — and every other issue on this list gets worse when a handoff isn't documented.
Escalate when: the next person can't tell what was promised, what was ordered, who owns the next step, or what evidence exists.
Response: every handoff should contain current status, next action, owner, deadline/ETA, customer promise, and supporting evidence.

22 · Financial / payroll / bonus calculation

Medium
Example: a twice-yearly bonus (June and December, $600 max) needed to be prorated based on working days for an employee with a mid-cycle start date.
Escalate when: compensation depends on a start date, working-day proration, contract language, or a maximum/eligibility rule.
Response: use the contract, exact employment dates, approved workdays, and a documented calculation. Have management/finance verify before payment.

The point of this list These examples aren't meant to teach anyone to expect failure. They're meant to teach what deserves attention, what should be documented, and when a problem stops being handled informally and gets escalated instead. The goal is consistent decision-making across the team, not everyone relying on their own individual judgment call.

Self-assessment

Complete this after working through the module. Multiple-choice questions are graded instantly; short-answer questions are sent to the team for review. Enter your name and email so your responses can be returned to you with feedback.

multiple choiceA customer wants a firm install time you can’t yet confirm. What’s the correct response?

Correct.
Marked incorrect — review this one.

multiple choiceAn automation fails on a time-sensitive dispatch. What do you do first?

Correct.
Marked incorrect — review this one.

multiple choiceA technician asks to add a distance charge that isn’t in the approved pricing. You should:

Correct.
Marked incorrect — review this one.

multiple choiceA vendor portal statement conflicts with your actual credit-card record. What’s correct?

Correct.
Marked incorrect — review this one.

multiple choiceHow should repeated behavior problems be documented?

Correct.
Marked incorrect — review this one.

multiple choiceWhen a required job photo is missing or can’t substantiate completion, you should:

Correct.
Marked incorrect — review this one.

multiple choiceSeveral small SOP violations have happened. What’s the right call?

Correct.
Marked incorrect — review this one.

multiple choiceWhich of these belongs in every escalation record?

Correct.
Marked incorrect — review this one.

short answerPick any escalation category from this module and write a short example of how you’d document it using the escalation record template.

short answerExplain the difference between a handled validation failure and a real production outage, and why classifying it correctly matters.

BCB Auto Glass · wiki.bcbautoglass.com, mirrored into the Hub

BCB Glass Wiki

Every system, SOP, and flow for the glass business — lead flow, the 9-site fleet, the ops dashboard, the group scheduling process, Google Business Profiles, and the global git/secrets rules. Each page below matches a page on the wiki; use the search bar up top to jump straight to any rule, supplier, or technician.

01 Start here

How to use & edit this wiki

Where the wiki lives, how to log in, and how to add or edit pages and sections.

This wiki is the single source of truth for how we run the glass business — SOPs, best practices, and flowcharts. It lives at wiki.bcbautoglass.com and is generated from a Git repository, so every change is versioned and nothing gets lost.

How it works

  • The wiki is a static site (Astro Starlight) in the bcb-wiki-new GitHub repo under the OwnerOperated organization.
  • Pages are plain Markdown files under src/content/docs/.
  • Pushing to main automatically rebuilds and publishes the site (Cloudflare Pages, ~60 seconds).
  • Flowcharts are written as Mermaid code blocks right inside the Markdown — they render as diagrams on the page.

Editing pages (no coding required)

Option 1 — Pages CMS (quick browser edits):

  1. Go to app.pagescms.org and log in with GitHub.
  2. Open the bcb-wiki-new repo. You'll see every wiki page listed.
  3. Edit in the visual editor and hit Save — it commits for you, and the site republishes in about a minute.
!

Anyone who should edit the wiki needs a (free) GitHub account with access to the repo. Add people under the repo's Settings → Collaborators.

Option 2 — "Edit page" link: every page has an Edit page link in the footer that opens the file on GitHub — edit and commit right in the browser.

Option 3 — Claude assistants (the dedicated editor's workflow):

For team members editing the wiki regularly, we have a guided workflow:

  • The BCB Wiki Assistant Claude Project (on claude.ai) interviews you about the change, drafts the markdown in the correct format, and produces a handoff block.
  • Claude Code, running locally in your BCBWIKI/bcb-wiki/ folder with a CLAUDE.local.md safety-rail file, saves the change and pushes it.
  • The safety rails restrict edits to src/content/docs/ — config, components, and site structure cannot be touched.

If you want this setup, ask your tech contact. They'll clone the repo to your machine, install Claude Code, drop the safety-rail file in place, and hand you a HANDOFF.md with the daily workflow.

Adding a page

Create a new .md file in the right section folder (via Pages CMS, GitHub, or the Claude workflow):

SectionFolder
Start Heresrc/content/docs/start-here/
Lead Flowsrc/content/docs/leads/
Marketing Websitessrc/content/docs/websites/
Ops Dashboardsrc/content/docs/ops-dashboard/
Google Business Profilesrc/content/docs/google-business-profile/
Best Practicessrc/content/docs/best-practices/

Every page needs this at the top (Pages CMS fills it in for you):

copy block
---
title: My page title
description: One line that shows up in search.
---

New pages appear in the sidebar automatically. To add a whole new section, create the folder and add one line to the sidebar list in astro.config.mjs — this is a developer task, not a wiki-editor task.

Adding a flowchart

Add a fenced code block with the language mermaid:

copy block
```mermaid
flowchart TD
  A[Customer submits form] --> B[Email + text goes out]
  B --> C{Booked?}
  C -- Yes --> D[Schedule the job]
  C -- No --> E[Follow up]
```

That renders as:

Flowchart · Mermaid source
flowchart TD
  A[Customer submits form] --> B[Email + text goes out]
  B --> C{Booked?}
  C -- Yes --> D[Schedule the job]
  C -- No --> E[Follow up]

House rules

  • No passwords or API keys on this wiki, ever. Credentials live in the server .env, encrypted in the dashboard DB, or in a gitignored CLAUDE.local.md — never here.
  • Keep pages task-shaped: someone should be able to follow a page top-to-bottom and get the job done.
  • If you fix a process, fix the wiki page in the same sitting.
Company overview

The BCB group, XPRO Bay Area operations, the brands, and where everything lives.

We operate auto glass repair & replacement businesses across California, Arizona, and Washington, organized under two umbrellas plus a holding-company brand.

The two groups

GroupWhat it coversBrands
BCB GroupCA / AZ / WA locations run through the BCB Glass Ops dashboardAuto Glass of LA, SFV Auto Glass, Del Mar Auto Glass, Auto Glass of Scottsdale, Auto Glass of Bellevue
XPROBay Area operationsGateway Auto Glass, Walnut Creek Auto Glass, A Plus Auto Glass, Best Service Auto Glass

BCB Auto Glass Group (bcbautoglass.com) is the multi-state holding-company landing page that ties the brands together. This wiki lives on a subdomain of it: wiki.bcbautoglass.com.

Operating entities (ops dashboard)

The BCB Glass Ops dashboard runs day-to-day operations for three entities:

  • LA — Auto Glass of LA
  • SFV — San Fernando Valley
  • DelMar — Del Mar

Each entity has its own phone/text number, Google review link, and payment details (Zelle/Venmo), all configured in the dashboard under Admin → Entities.

The systems at a glance

SystemWhat it doesWhere
Marketing websites (9)Bring in leads via quote formsCloudflare Pages — site fleet
Lead deliveryEmail + Podium text + lead storage the moment a form is submittedCloudflare Functions — lead flow
BCB Glass Ops dashboardIntake → schedule → assign tech → collect payment → pay tech → review textsLaravel + Filament on Cloudways — overview
Omega EDI (CRM)Group-wide lead intake, run by Xpro CSR, feeding into the dashboardScheduling SOP
Google Ads / ROASWeekly per-location ad spend vs booked revenue & profitInside the ops dashboard
Bank ledger (Plaid)Chase transactions pulled daily, reconciled weeklyInside the ops dashboard

For how they connect, see the systems map.

Who's who

  • Alex — owner/operator across all businesses.
  • Celia Calle — ops dashboard handoff contact (dashboard went live June 23, 2026).
  • Contractor techs — do the installs; paid daily via the dashboard's End-of-Day Summary.
The big-picture systems map

One flowchart that ties every system together — from ad click to money in the bank.

Everything we run, on one page. Follow the money: ads → website → lead → job → payment → reconciliation.

Flowchart · Mermaid source
flowchart TD
  subgraph AC[1 · Acquisition]
    direction TB
    ADS[Google Ads<br/>3 location accounts under one MCC] --> SITES
    ORG[Organic / GBP] --> SITES
    SITES[Marketing websites<br/>9 brand sites on Cloudflare Pages]
  end

  SITES -->|Quote form submit| NOTIFY

  subgraph LD[2 · Lead delivery]
    direction TB
    NOTIFY["/api/notify Cloudflare Function"] --> EMAIL[Email to shop inbox<br/>via Resend]
    NOTIFY --> PODIUM[Podium contact + welcome text<br/>first name only]
    NOTIFY -.-> LEADDB[Lead storage<br/>webhook upsert by lead_id]
  end

  EMAIL --> OPS
  PODIUM --> OPS

  subgraph OD[3 · Operations — BCB Glass Ops dashboard]
    direction TB
    OPS[Intake: lead becomes a job] --> SCHED[Schedule + assign tech]
    SCHED --> WORK[Work complete<br/>payment preference gate]
    WORK --> PAY[Record payment]
    PAY --> DRIP[Review drip texts]
    WORK -.-> WARR[Warranty visit<br/>if issue reported]
  end

  PAY --> EOD

  subgraph MO[4 · Money]
    direction TB
    EOD[End-of-Day tech payout] --> CHASE[Chase bank + credit card]
    CHASE -->|Plaid daily pull| LEDGER[Bank ledger<br/>weekly reconciliation]
    ROAS[ROAS report<br/>ad spend vs booked revenue and profit]
  end

  PAY --> ROAS
  ADS -.->|Daily metrics pull| ROAS

The four layers

  1. Acquisition — Google Ads and organic traffic land on one of the 9 marketing sites. Each site's business data (phone, hours, service areas) lives in one config file.
  2. Lead delivery — a form submit instantly fires an email to the shop inbox and a Podium welcome text, and stores the lead. No Slack, anywhere. Details: lead flow.
  3. Operations — the ops dashboard takes the job from intake through scheduling, completion, payment, tech payout, and review requests.
  4. Money — every dollar is accounted for: Plaid pulls Chase transactions daily, the team reconciles weekly, and ROAS ties ad spend back to booked profit per location.

02 Lead flow

The canonical lead flow

Exactly what happens the moment a customer submits a quote form — and the rules that must never break.

When a customer submits a quote form on any glass marketing site, this — and only this — happens:

Flowchart · Mermaid source
flowchart TD
  FORM[Customer submits quote form] --> FN["/api/notify Cloudflare Function<br/>runs on the site itself"]
  FN --> EMAIL[Email to the shop inbox<br/>sent via Resend]
  FN --> PC[Podium contact created<br/>status: new lead]
  FN --> PT["Podium welcome text<br/>uses FIRST name only"]
  FORM -->|Webhook, upsert by lead_id| DB[Lead stored in the sales dashboard]
  EMAIL --> TEAM[Team follows up]
  PT --> TEAM

The rules (locked with the owner)

  1. There is NO Slack anywhere in this flow. Alerts are email + Podium, period. The dashboard's Slack hook is a deliberate no-op — don't design anything around Slack.
  2. Name is always ONE line ("First Last") in every payload — even when the form UI has separate First/Last fields, the payload sends a combined name.
  3. The Podium welcome text uses the first name only (notify.js splits the combined name).
  4. Alerts vs storage are separate jobs: alerts = the site's /api/notify Function (Resend email + Podium); storage = the dashboard webhook. Neither depends on the other.
  5. Zapier is retired. The sites went through a Zapier → notify cutover; the notify.enabled flag keeps a reversible fallback path, but the target state is notify-only.

Single-step vs two-step forms

  • BCB sites (SFV, Scottsdale, Bellevue, Del Mar, AGLA): single-step form with one "Full Name" field. One submit fires the whole flow above.
  • XPRO sites (Walnut Creek, Gateway, A Plus): two-step form — intentionally different, do not collapse it. See two-step forms for the partial/complete logic.

Where the pieces live

PieceWhere
Quote formQuoteForm.astro component in each site repo (config from site.ts)
Notify Functionfunctions/api/notify.js in each site repo
Resend + Podium credentialsCloudflare Pages env vars, per project
Lead storage endpointSales dashboard web-lead webhook (origin-allowlisted)

Gotchas that have bitten us

  • Cloudflare env vars only bind on a NEW deployment. Setting/changing a Pages env var does nothing until you redeploy (an empty commit works). If notify "silently does nothing," check this first.
  • Origin allowlist lives in TWO places on the dashboard side: the config default and the prod .env override. Editing only the config is a silent no-op if the env var is set.
  • Stale Podium tokens per CF project: each Pages project carries its own Podium token. A token minted before a scope fix will 403 on contact creation while the welcome text still sends. Fix: copy the current refresh token + client credentials from a working project, remove any static access-token override, redeploy.
XPRO two-step forms

How the partial/complete two-step quote form works, and the SOP for rolling it out to a site.

The XPRO sites use a two-step quote form — step 1 captures contact info, step 2 captures vehicle/insurance details. It's intentionally different from BCB's single-step form; don't collapse it.

Flowchart · Mermaid source
flowchart TD
  S1[Step 1: name, phone, email] -->|submit| P1["Fires PARTIAL<br/>(client-generated lead_id)"]
  P1 --> E1[Email #1 to shop inbox]
  P1 --> POD[Podium contact + welcome text]
  P1 --> UP1[Dashboard lead CREATED<br/>keyed on lead_id]
  S1 --> S2[Step 2: vehicle, VIN, insurance, comments]
  S2 -->|submit| P2[Fires COMPLETE<br/>same lead_id]
  P2 --> E2[Email #2 with vehicle + insurance details]
  P2 --> UP2[Dashboard lead UPDATED<br/>same lead — no duplicate]
  P2 -.->|"No second Podium text"| POD

The logic

  • Step 1 (partial) fires immediately — the lead is real as soon as we have a name and phone. Email + Podium contact + welcome text + dashboard lead, all at once.
  • Step 2 (complete) sends a second email only (vehicle/insurance details) and updates the same dashboard lead by lead_id. No second Podium text — the customer already got one.
  • A complete arriving with no prior partial creates a full lead. Posts are fire-and-forget, so order isn't guaranteed — the dashboard merges payloads only on complete so a late partial can't regress the data.
  • The dashboard never updates a lead a rep has already claimed/closed, or anything older than a daylead_id is client-generated and replayable, so the public endpoint must not mutate worked leads.

Form fields (preserve all of them)

  • Step 1: first, last, phone (intl-tel-input, E.164), email + honeypot field.
  • Step 2: city/ZIP, repair type, year, make, model, VIN/plate, uses-insurance, insurance company, comments.
  • Payloads carry lead_id, submission_status (partial/complete), form_name, and page metadata — plus the combined one-line name.

The dashboard captures the extras (VIN, insurance company, uses-insurance) and shows a Partial / Complete "Form" badge on the lead.

Rollout SOP (per site)

Walnut Creek shipped first (end-to-end verified 2026-07-07). Gateway and A Plus are near-verbatim copies. For each site:

  1. Dashboard first: confirm the site's domains (apex + www + its staging host) are in the web-lead origin allowlist — both the config default and the prod .env override.
  2. Port QuoteForm.astro + step-aware functions/api/notify.js + the salesDashboard / notify blocks in site.ts from the Walnut Creek repo. Delete the old quote-form.js / form-handler.js.
  3. Set Resend + Podium env vars on the site's Cloudflare Pages project, then redeploy (env vars only bind on a new deployment).
  4. On the staging preview: submit step 1 → confirm email + Podium text + dashboard lead. Submit step 2 → confirm second email + the same lead enriched (not a duplicate).
  5. Owner approves → merge stagingmain (production cutover; Zapier stops receiving).
  6. Cleanup: delete test leads from the dashboard; after the full fleet is rolled out, remove the *.pages.dev / staging hosts from the origin allowlist.

03 Marketing websites

The site fleet

All 9 marketing sites plus the holding-co page — repos, domains, and which flavor each one is.

One repo per location, all under the OwnerOperated GitHub account, all deployed on Cloudflare Pages.

GroupRepoBusinessDomainFlavor
bcbautoglassBCB Auto Glass Groupbcbautoglass.comStatic single index.html
XPROgatewayautoglassGateway Auto Glassgatewayautoglass.comStandard Astro
XPROwalnutcreek-websiteWalnut Creek Auto Glasswalnutcreekautoglass.comStandard Astro
XPROaplusautoglassA Plus Auto Glassaplusautoglass.comStandard Astro
XPRObsag-astroBest Service Auto Glassbestserviceautoglass.comCustom Astro (no site.ts)
BCBagla-website-astroAuto Glass of LAautoglassofla.comCustom Astro (HTML snapshots)
BCBsfvautoglassSFV Auto Glasssfvautoglass.comStandard Astro
BCBScottsdale-Auto-GlassAuto Glass of Scottsdaleautoglassofscottsdale.comStandard Astro
BCBbellevue-auto-glassAuto Glass of Bellevueautoglassofbellevue.comStandard Astro
BCBDel-Mar-Auto-GlassDel Mar Auto Glassdelmarautoglass.comStandard Astro

The three flavors

Standard Astro (most sites) — Astro + Tailwind v4, static output. All business data is in one file: src/config/site.ts — phone, address, hours, service areas, brand colors, webhooks, TrustIndex review-widget IDs, Google Maps embed. Edit there, never hardcode. Homepage sections live in src/components/sections/*.astro, legal pages in src/components/pages/ + src/pages/, site chrome in src/layouts/BaseLayout.astro, assets in public/.

Custom Astro (two exceptions):

  • bsag-astro — rebuild of an old Next.js export. No site.ts: copy, phone, prices, webhook, GTM and TrustIndex IDs live directly in the .astro files (src/pages/index.astro, src/layouts/Base.astro, src/components/QuoteForm.astro). Only the homepage and /warranty exist; old subpages 301 to /.
  • agla-website-astro — uses site.ts for core business data, but most pages are pre-generated HTML snapshots whose inner blob keeps a baked-in copy of the data. When changing business info, check both places.

Static HTMLbcbautoglass is a single index.html, no build step. Edit the HTML directly.

Where things run

  • Cloudflare Pages auto-builds on every push (npm run build, output dist/, Node 20).
  • Push to staging → preview URL (*.pages.dev). Push to mainproduction.
  • See deploying a site change before touching main.
SOP: editing a marketing site

How to change phone numbers, hours, prices, copy, or images on any of the marketing sites.

Changing business info (phone, hours, address, service areas)

On a standard site, one file holds everything: src/config/site.ts.

  1. Open the site's repo, switch to the staging branch.
  2. Edit the value in src/config/site.ts — phone, address, hours, service areas, brand colors, webhook URLs, TrustIndex IDs, Maps embed all live there.
  3. Never hardcode a phone number or address in a component — if you find one hardcoded, that's a bug; move it to site.ts.
  4. Push staging, check the preview URL, then follow the deploy SOP to promote to main.

The exceptions

  • bsag-astro — there is no site.ts. Edit the .astro files directly (src/pages/index.astro, src/layouts/Base.astro, src/components/QuoteForm.astro).
  • agla-website-astro — edit site.ts and check the pre-generated HTML snapshot pages, which keep a baked-in copy of business data in their inner blob.
  • bcbautoglass — plain index.html, edit directly.

Changing page copy or sections

  • Homepage sections: src/components/sections/*.astro — one file per section.
  • Legal pages: src/components/pages/ + src/pages/.
  • Header/footer/site-wide chrome: src/layouts/BaseLayout.astro.

Images & assets

Put files in public/ and reference them by absolute path (/images/...). Compress before committing — these are marketing sites; page speed matters for Ads quality score.

Quote form / lead delivery changes

Anything touching the quote form or notify Function must preserve the canonical lead flow — one-line name, first-name-only Podium text, no Slack. Test on the staging preview with a real submission before promoting, then delete your test lead from the dashboard.

Golden rules

  • Local first — never edit anything on production servers directly.
  • Work on staging, verify the preview, promote to main. Those are the only two branches — never create others.
  • Never build or commit dist/ or node_modules/ — Cloudflare builds from source.
SOP: deploying a site change

The staging → preview → approval → production flow for the marketing sites.

Every marketing site deploys the same way. Pushing to main is a live production deploy — treat it accordingly.

Flowchart · Mermaid source
flowchart TD
  A[Make the change on the staging branch] --> B[Push staging]
  B --> C[Cloudflare Pages builds a preview<br/>site-name.pages.dev]
  C --> D{Preview looks right?<br/>Forms tested if touched?}
  D -- No --> A
  D -- Yes --> E{Customer-facing change?}
  E -- Yes --> F[Get explicit owner approval]
  E -- "Internal/trivial" --> G
  F --> G[Merge staging into main and push]
  G --> H[Cloudflare builds and deploys PRODUCTION]
  H --> I[Spot-check the live site]

The rules

  1. Two branches only: main + staging. Never create feature/fix/throwaway branches — they drift and cause mistakes. Delete strays on sight. main is the source of truth; staging is always a clean copy of it plus the change being verified.
  2. Verify on the preview first (*.pages.dev), or locally with npm run build && npm run preview. Never push to main unverified.
  3. Production pushes are approval-gated. "Push" or "deploy to staging" never implies production. When in doubt, ask.
  4. Cloudflare runs npm run build (output dist/, NODE_VERSION=20). Never commit dist/ or node_modules/.
  5. Env-var changes need a redeploy. Cloudflare Pages Functions only bind new env vars on a fresh deployment — push an empty commit if there's nothing else to ship.

Verb glossary (so nobody miscommunicates)

You sayIt means
"push" / "push live"Commit, push, and deploy per this SOP
"deploy"Deploy only — the code is already pushed. If the environment is ambiguous, ask; never assume production.

After deploying

  • Spot-check the live page you changed.
  • If the quote form was touched: submit a test lead end-to-end (email + Podium text + dashboard lead), then delete the test lead from the dashboard.

04 Ops dashboard

Ops dashboard overview

BCB Glass Ops — what it does, who can do what, and the ground rules.

BCB Glass Ops is the internal dashboard that runs day-to-day operations for the three BCB entities — LA (Auto Glass of LA), SFV (San Fernando Valley), and DelMar (Del Mar). It went live on Cloudways on June 23, 2026.

The job it does: intake WhatsApp/SMS leads → schedule → assign a contractor tech → collect payment → pay the tech → send transactional + review texts.

Roles — who can do what

RoleCan do
super_adminEverything, including granting admin/finance roles, templates, API keys, timing, ROAS
adminOperations + entities/employees/warehouses + delete jobs. No templates, APIs, timing, or ROAS.
dispatchOperations only — intake, scheduling, jobs, payments
financeThe Bank Transactions ledger only (match/flag/confirm reconciliation). No ops, settings, or ROAS.

Only a super_admin can grant elevated roles. Accounts are managed under Admin → Employees.

The main areas

AreaWhat lives thereWiki page
OperationsJobs board, calendar, intake, incoming texts, Reviews, WarrantyJob lifecycle
Operations → Parts to OrderScheduled jobs with a part still not orderedJob lifecycle
Operations → CalibrationADAS calibration partner pipeline (windshield jobs only)ADAS calibration jobs
Operations → Follow UpsShared dispatch to-do list, per-job or unattachedFollow Ups
End-of-Day SummaryDaily tech payoutsTech pay
Tech BalancesRolling cash each tech owes usTech pay
Bank TransactionsChase ledger + weekly reconciliationMoney & reconciliation
Accounts ReceivableJobs awaiting payment / unconfirmed paymentsMoney & reconciliation
ROASWeekly ad spend vs booked revenue & profit per locationMoney & reconciliation
A job's own pageMoney, Insurance, Notes feed, Follow-ups, and Timeline, all on one page, plus an Actions menu (Schedule, Reschedule, Cancel, Hold, Warranty, Payment, Notes)Job lifecycle
Admin → EntitiesPer-location phone, review links, Zelle/Venmo details
Admin → Integrations & API KeysSMS provider, Google Ads, Plaid credentials (encrypted)Messaging
Message TemplatesEvery automated text, editableMessaging

Ground rules

  • Times: everything is stored in UTC and displayed/scheduled in Pacific time. If reminders ever go out an hour off, the timezone config broke — flag it to Alex/Claude.
  • Entity data matters: review-request texts refuse to send until the entity's Google review URL is set, and Zelle/Venmo payment texts refuse until the entity's payment details are set (Admin → Entities). If a text "won't send," check there first.
  • Credentials (SMS providers, Google Ads, Plaid) are stored encrypted in the database and edited only via Admin → Integrations & API Keys — never in code, never on this wiki.
  • Stack, for the technically curious: Laravel 12 + Filament 4, MySQL, hosted on Cloudways. Deploys are covered in deploying the dashboard.
SOP: BCB group scheduling process

How Xpro CSR, the BCB scheduling team, suppliers, and field technicians work together — from lead intake through payment, across the whole BCB group.

This is the group-wide scheduling SOP — it runs through Xpro CSR and Omega EDI on top of, not instead of, the normal BCB Glass Ops dashboard flow, for every BCB entity (LA, SFV, DelMar, and beyond). Lead intake happens in Omega first; scheduling still finishes in the dashboard (Step 1 below). Some details below (supplier accounts, technicians) are shown for the LA market as the reference example — other markets follow the same process with their own local suppliers and techs (see the Technician Directory for San Diego's supplier list).

!

Always identify yourself using the correct customer-facing entity name (e.g. "LA Auto Glass," "SFV Auto Glass," "Del Mar Auto Glass") — never as Xpro or a generic name. This came directly from customer feedback.

1. Purpose

Keep a consistent, efficient workflow between Xpro CSR, the BCB scheduling team, suppliers, and field technicians — from lead intake to technician scheduling and CRM updates.

2. Roles

Xpro CSR

  • Handles lead intake.
  • Collects vehicle + customer info.
  • Uploads all lead data to Omega EDI (CRM).
  • Alerts the BCB scheduling team when a new lead is ready.

BCB scheduling team

  • Reviews new lead details in Omega EDI and the Google Sheet Jobs Tracker.
  • Confirms part availability and pricing with suppliers.
  • Communicates job details to the technician.
  • Confirms the arrival window with the customer.
  • Updates the job tracker.

3. Systems & tools

  • Omega EDI (CRM) — lead & job details.
  • BCB Dashboard — where scheduling is finalized (see job lifecycle).
  • Google Sheets — Jobs Tracker — columns L–P must be updated after booking. Can also be used as a backup to check info from the sales team before asking them directly.
  • Quo — communication with technicians.
  • Podium (Xpro login).
  • Recal Tracker — the ADAS calibration reference spreadsheet — used to check whether a recal has been scheduled and where it stands.
  • Stripe — processing debit/credit card payments.

Supplier accounts (IGC, Mygrant, Pilkington, PGW, O'Reilly, Lexus of Glendale, Kearny Mesa Hyundai, Audi Pasadena — the LA market's suppliers) are listed in parts ordering & suppliers below. Per Secrets & access, no login password ever goes on this wiki — portal logins live with the team's password manager; ask Alex/Celia for access.

Workflow steps

Step 1 — Lead intake by Xpro CSR

  1. Xpro CSR gathers:
    • Year / Make / Model
    • Repair type (front windshield, back glass, side glass)
    • VIN or part # if available
    • Customer name & phone number
    • Address + ZIP code
    • Any special notes (e.g. "call 20 min before")
  2. CSR uploads this info into Omega EDI.
  3. CSR notifies the BCB scheduling team via WhatsApp that a new lead is ready.
  4. Scheduling team confirms all details are in the message: car make/model/year, part number, quote value, requested date/time if any, full name, phone number, address, entity name.
  5. Proceeds to do lead intake in the dashboard.
  6. Xpro Team sends the lead's name to the group and asks if it's possible to take on — always respond YES immediately. We have 10+ techs in LA who could do it; we'll make it work.
!

If the client requests a specific time or urgency, that scenario isn't fully documented yet — flag it to Alex/Celia rather than guessing.

Insurance jobs

For every insurance-approved job, there are always two separate appointments:

  1. Auto glass replacement
  2. ADAS calibration (handled separately)

The technician completes only the glass replacement on the first visit. Calibration is scheduled and handled by our team as a second appointment — if the client asks about calibration, they should be referred back to us. Explain up front that the job happens in two phases (glass, then calibration); see also ADAS calibration jobs.

  • Once the glass job is completed, tag @Tulio in the WhatsApp group and request coordination of the recalibration. Track progress in the Recal Tracker; if there's no progress in 48h, follow up.
  • Try to collect payment after the glass job is completed and before the recal. If the client asks to wait until the recal to pay, that's fine.
  • If the job requires both recalibration and glass replacement, coordinate the glass replacement first, then hand off to David's team to coordinate the calibration as the second appointment.

Step 2 — Confirm technician's availability

Call the technician to confirm:

  • Whether they can take the job.
  • That the part number Xpro provided actually fits the car/issue they see in the lead's photos.
  • When they can pick up the part.
  • What day/time they can be at the job site — aim for same-day.

Step 3 — Check part availability & order parts

  1. Identify the nearest warehouses based on the job location and the technician's other jobs that day, so the pickup lines up with their route.
  2. Call or check supplier portals to confirm availability, price, and place the pickup order (will-call).
  3. Choose the supplier based on lowest cost, availability, and proximity to the job site or the tech's route.

Timing rule: place the part order within 24h of the job. Example: job scheduled Monday for Friday → call Thursday to order. If a weekend or holiday falls in between, place the order and then call again Monday morning to verify it's still on will-call (ready for pickup).

Supplier contacts:

SupplierAccountNotes
IGCAccount #771 / Account Name: BCB Auto GlassOrders online or by phone. Always call IGC LA, then ask to place the order at the specific location the technician prefers.
Mygrant Glass Co.BCB Auto Glass — Acct# C038903-001Orders online or by phone. Account is billed weekly under BCB Autoglass LLC — a refund requested within the billing period may not show as a separate transaction; instead Mygrant discounts it off the next bill rather than processing a refund.
Pilkington North America IncAccount #94644, name BCB Auto Glass1552 County Hwy G4, San Jose, CA 95131 · 1-800-282-1986
PGW Auto Glass LAAccount reference 877-929-2526 (Xpro Gateway)317 W Victoria St, Gardena, CA 90248 · +1 888-774-2886
O'ReillyXpro account # (temporary): 2838208Account address: 4325 Zaca Pl, Los Angeles, CA 90065. Payment made over the phone by Nico or Celia.
Lexus of GlendaleAccount name: BCB AUTO GLASS LLCPayment made over the phone by Nico or Celia.
Kearny Mesa Hyundai ServiceAccount name: BCB AUTO GLASS LLC, Account #H4325Payment made over the phone by Nico or Celia.
Audi PasadenaAccount name: Auto Glass of LAPayment made over the phone by Nico or Celia.

For every order: note the pickup location for the technician.

!

Dealership parts — always verify we're getting at least 20–30% off list price. Always push for more, even after they quote a discount: "Hey, any chance you could do 30% or 25%?"

Finding the part number: check Omega under Items for that lead, or the job tracker's column K — "part#". Omega may also show SRI (labor) and HAH (the adhesive used) — neither of those needs to be ordered.

Technician notification & routing policy

As volume grows and more LA technicians come on board, routes need careful management to avoid confusion, inefficiency, or conflicts between techs.

  1. Technicians are only informed of a job once the daily route is finalized. We don't send jobs ahead of time — this stops techs from assuming a job is already theirs before scheduling is locked in.
  2. Route assignments are optimized first, then communicated. The scheduler designs the most efficient route by location, timing, and part availability; only then do jobs go out to technicians.
    • If a technician is running late and won't make their next appointment on time, always try to find an alternative tech with availability to honor the original scheduled time. Only if that's impossible, ask the client to reschedule.
  3. The goal: stay flexible, avoid upsetting techs with schedule changes, reduce the risk of overpromising/underdelivering, and keep routes efficient and balanced across all technicians.

After-hours / incomplete job follow-up

  • Installation still in progress or not fully complete at end of shift: leave a follow-up assigned to the shared pool (see Follow Ups) to take care of it. If payment still needs to be collected, send Celia a WhatsApp before the end of your shift so she can monitor it. List the pending actions clearly — payment collection, review request, any remaining work.
  • Job completed after hours: leave a follow-up. The first team member in after 8:00 AM is responsible for reaching out to the customer, collecting payment, and closing out any remaining follow-up steps.

Step 6 — Update Job Tracker and Omega

Update columns L–P after the job is scheduled — typically:

  • Arrival window confirmed
  • Technician assigned
  • Supplier & warehouse pickup location
  • Notes (tech notes, part notes, delays, customer comments, etc.)

Keep this consistent with what was actually shared with the technician and the customer. Also update the appointment date/time with the customer in Omega EDI.

If the customer reschedules or cancels: let the technician know as soon as possible. If rescheduled, confirm the next available time. Update the CRM + job tracker immediately.

Step 7 — Ask for payment

  1. Debit/credit card: process a link through Stripe.
    • Debit: no processing fee added (it's only 1%).
    • Credit: add 3% extra to the amount for processing fees.
    • Include a picture of the repaired zone when possible, plus the vehicle detail (year, brand & model, glass repaired).
  2. Cash: let the technician know exactly how much the client owes, then follow up with the technician until they Zelle us the full amount.

Venmo: not a standard payment option — only offer it if the client explicitly asks. In that case they can send payment directly to the owner's Venmo (@alex-borkin); mention it only when requested or truly necessary.

9. Escalation procedures

Escalate to Celia when:

  • Part unavailable at the main warehouses → try alternate IGC locations across LA.
  • Technician fully booked → check Jason's availability, or reschedule.
  • Urgent issue → call.
  • Client request (not urgent) → tell the client it's been escalated and we'll follow up within 24h; create a ClickUp card for Celia to manage.

11. Upload job-finished photos

Upload every job-finished photo the tech sends into the shared job photos Drive folder.

12. Cancelled jobs

When a job is completely lost or cancelled after the part has already been ordered:

  1. Instruct the technician to return the part to the warehouse they picked it up from, and share our business account info for that specific warehouse.
  2. Verify with the technician that the return is in progress.
  3. Follow up with the warehouse to confirm the return was received and that our account wasn't charged.

13. Part price difference threshold

Generally use the warehouse the technician recommends — it's usually the most efficient choice and avoids extra travel charges.

Before placing the order:

  • Compare the technician's selected warehouse price against the price the sales team (David's team) provided.
  • A difference of up to $20 is acceptable — no additional approval needed.
  • If the technician's preferred part is more than $20 higher than the sales-team price, do not order immediately — escalate the discrepancy to Alex/Celia for review and approval first.
  • Factor in whether switching warehouses would add technician travel charges that offset any savings on the part itself.

Goal: minimize the total job cost (part + technician travel/time), not just the part price.

Client non-payment SOP

Goal: attempt collection consistently, document every attempt, and escalate to Celia before it becomes a bigger issue.

StageWhenActionEscalate to Celia?
1. Payment dueDue dateConfirm invoice/payment statusNo
2. First attempt1 business day overdueContact client by phone/text/emailNo
3. Second attempt2–3 business days overdueFollow up again + ask for a specific payment dateNo
4. Third attempt5 business days overdueStronger collection message + callYes — notify Celia
5. Escalation7+ business days overdueCelia decides the next actionYes
6. No response / refusalAfter repeated attemptsStop casually chasing; escalate for a decisionImmediately

The key rule: don't keep contacting the client indefinitely without telling Celia. After 3 unsuccessful payment attempts with no payment or meaningful response, notify Celia. An "attempt" means an actual contact — call, text, or email — and every attempt must be logged.

What to report when escalating:

  • Client name
  • Invoice/job number
  • Amount owed
  • Original due date
  • Number of attempts, with dates/times and method (call/text/email)
  • Whether the client responded, and what they said
  • Any promised payment date
  • Screenshot/documentation if relevant

Automatic escalation after 3 failed attempts applies to: no response, unanswered calls, ignored messages, or a client who keeps saying they'll pay but doesn't.

Other cases:

  • Client disputes the invoice — refer back to the quote sent before the appointment (sent a couple of times); they agreed to move forward on that quote.
  • Client claims the work was defective — mark the job "Warranty / need fixing," collect photos and details, and send them to the technician to schedule a warranty visit (see Warranty jobs). Let the client know we're working on it and keep them updated.
  • Client refuses to pay — get the details; if it's not a warranty claim, escalate to Celia immediately.
  • Client says they already paid — check the bank account and/or Stripe to verify. If there's no reference, ask for payment proof and wait 24h to see if it clears. If it still doesn't show after 24h, ask them to check with their bank and try again.
  • Client requests a discount/credit to resolve the balance — deny in most cases; if they push, the fallback is waiving the credit-card processing fee, not the balance itself.

Immediate escalation (no waiting for the 3-attempt threshold):

  • Client threatens a chargeback/dispute or any legal/collections threat — if they aren't visibly angry, tell them it's been escalated to a manager and we'll respond within 24h, then create a card for Celia to review. If they're threatening to act immediately, call Celia right away.

Suggested internal workflow:

copy block
Due → Attempt 1 → Attempt 2 → Attempt 3 → CELIA

After each attempt: Update CRM → set next follow-up → continue. Once it reaches Celia: Celia decides — continue collection / adjust the invoice / dispute resolution / collections / write-off / other action.

Annex — handling insurance virtual card payments (Auto Glass of LA)

Trigger: Alex sends a virtual card (via WhatsApp group or ClickUp). Priority: time-sensitive — process immediately upon receipt. Full walkthrough: Loom video.

Step 1 — Verify the payment amount

  • Compare the card amount vs. the expected job payout in Omega.
  • Expected = total job amount − deductible.
  • Within expected range → proceed.
  • Less than 25% of expected amount → flag in the team chat, and contact the insurance company to request a correction/reissue before processing.

Step 2 — Process payment in Stripe (AGLA)

  1. Log into the AGLA Stripe account.
  2. Go to Billing → Invoicing → Create new Invoice (the + icon, top right → Invoice).
  3. Customer name: the insurance carrier (e.g. Mercury Casualty Company).
  4. Line item: description "Auto glass repair – Claim [claim #]," amount = the exact amount listed (no partials unless approved), quantity 1.
  5. Select Auto Charge Customer and enter the virtual card's number, expiration, and CVV.
  6. Submit payment (finalize the invoice).

Step 3 — Confirm fees

Make sure no unexpected Stripe fees were deducted. If fees were taken, screenshot the transaction and flag it internally — these should typically be avoided or accounted for.

Step 4 — Record & close

Mark the job Paid in Omega/CRM, attach the Stripe payment screenshot as proof, and send it to the group chat with Alex.

How to make an invoice/receipt: Loom walkthrough.

Technician documentation & 1099 requirements

See the full W-9/1099 tracking table on the Technician Directory. The group-wide rule: a new technician can be used for their first jobs while documentation is pending, but after 3 completed jobs we must have their W-9/1099 info before assigning more work. If a technician keeps refusing to provide it, remove them from the active technician roster.

Job lifecycle

A job from intake to completed — scheduling, payment gate, cash handling, reviews, and the warranty branch.

Flowchart · Mermaid source
flowchart TD
  LEAD[Lead arrives<br/>web form / WhatsApp / SMS] --> INTAKE[Intake: create job<br/>quote, vehicle, insurance flag]
  INTAKE --> SCHED["Schedule + assign tech<br/>(a tech MUST be assigned first)"]
  SCHED --> REM[Automated reminder texts]
  REM --> WC{Mark work complete}
  WC -->|Unpaid job| GATE[Payment preference gate<br/>required choice]
  GATE -->|Zelle / Venmo| TXT1[Text with payment details<br/>from the entity settings]
  GATE -->|Credit card| TXT2[Stripe payment link texted]
  GATE -->|Cash| CASH[No text — tech collects]
  TXT1 --> PAY[Record payment]
  TXT2 --> PAY
  CASH --> PAY
  PAY --> WELL{"How did the job go?<br/>(required on record payment)"}
  WELL -->|Thumbs up| DRIP[Review drip starts]
  WELL -->|Thumbs down| SKIP[No review texts]
  PAY --> DONE[Job completed]
  DONE -.->|Customer reports an issue| WARR[Warranty claim]
  WARR --> WVISIT[Schedule return visit<br/>unpaid, defaults to original tech]
  WVISIT --> WRES[Mark resolved]

Key rules

  • A technician must be assigned before a job can be scheduled, completed, or have a payment recorded.
  • Marking work complete on an unpaid job forces a payment-preference choice — Zelle, Venmo, credit card, or cash. The matching text fires automatically (Zelle/Venmo texts pull the entity's payment details; credit card creates/re-sends a Stripe link; cash sends nothing). Completion itself is never blocked by a text failing.
  • Recording a cash payment immediately adds that cash to the tech's balance (they're holding our money). See tech pay.
  • "How did the job go?" on the record-payment dialog is required: 👍 starts the review drip; 👎 skips it quietly.
  • Receipts are on-request only — a paid job's actions menu has Send receipt; nothing goes out automatically.
  • Customer names auto-normalize ("JOHN SMITH" → "John Smith") everywhere, including texts — no need to fix capitalization by hand.

Jobs board tabs

The Operations → Jobs board organizes every job into tabs: Needs scheduling, On hold, Scheduled, Work done, Paid, All jobs, plus an Insurance tab (see Insurance jobs below). A new lead lands in Needs scheduling with status pending schedule and sits there until booked. A job whose requested day is today or already past is flagged urgent on that tab, and also posts in the 7am Telegram digest.

Scheduling a job

  1. Open the job from Needs scheduling and click Schedule (from the actions menu, or as a row action on the board).
  2. Set the date, time window, and technician — a technician must be picked before the job can be scheduled at all. Their base pay is applied automatically once picked, fixed to their rate on file — it's never typed in by hand.
  3. Pick the warehouse — required unless the job is Labor only (the customer already owns the glass). Choose one of the shop's own warehouses, or "Other" and type the supplier's name.
  4. Resolve any warning the form shows — see Checks at the schedule step.
  5. Submit. The job moves to Scheduled, the customer gets a time-confirmation text, and the technician gets one text with every job detail — address, time, vehicle, part number, and warehouse.

For jobs where the technician still needs to agree on a time, use Schedule w/ AI instead of the manual form — it texts your ranked list of techs in order and books the first accepted slot, following the same warehouse, deadline, and part checks as manual scheduling.

Checks at the schedule step

The schedule form can stop you, or ask you to confirm past a warning, in four cases — none appear unless the job actually triggers them:

  • Before-a-time deadline — the customer asked for the job done by a named hour. Booking a slot that finishes too late shows a warning with the latest safe arrival time. You can still book it, but must tick an override box and give a reason — that override is logged.
  • Part number vs. glass position mismatch — the part number on file names a different piece of glass than the "Glass position" field says (e.g. a windshield part on a job marked "door"). This blocks scheduling until you fix one of the two fields, or tick an override box with a required reason. Either way it's logged.
  • OEM parts deposit — triggers only when the chosen warehouse is a dealer or an unlisted "Other" supplier, since OEM parts are non-refundable once ordered (see Deposits below for the amounts). Short on deposit needs an override checkbox and a reason.
  • Distance pay — this is the only place distance pay can be granted. A toggle asks whether this is expected to be a distance-pay job, and takes an amount capped at $50. If the technician already has another job that same day, the form challenges you to confirm it's really needed before you can grant it.

After a job is booked

  • Order the part — go to Operations → Parts to Order, or use Order part on the job. Enter the part's real cost — optional at intake, but required here. If the warehouse is "Other," also mark it prepaid once you've paid the supplier; an unpaid "Other" part sits on hold.
  • Reschedule or cancel, if plans changeReschedule keeps the job booked and re-checks every warning above against the new date/time. Cancel appointment returns the job to Needs scheduling, texts the customer, and asks whether a part needs to be returned.
  • Mark work complete — see Key rules above for the payment-preference gate. Payment options are Zelle, Credit card, Venmo, Cash, or Check; an already-paid job just sends a plain wrap-up text instead.
  • Record the payment — each payment recorded adds its own line, so a deposit plus a later balance both show (see Deposits). Cash goes onto the technician's running balance right away.
  • The review request opens on its own the moment work is marked complete — see the review drip.

Scheduling hold

Use a hold when a lead can't be booked today because you're waiting on the customer — they need to check a schedule, approve a quote, or hear back from their insurer. A held job leaves the Needs scheduling tab but stays in the pipeline; nothing about the job is canceled by a hold alone.

Put a job on hold (works whether it's unbooked or already Scheduled):

  1. Open the job's actions menu → Put on scheduling hold. If the job was already Scheduled, this cancels that appointment first — same as a manual cancel, including the customer text and the parts-pickup question — then places the hold.
  2. Type a reason — required. The form suggests common ones, but free text works too. A hold with no reason isn't allowed.

Take a job off hold:

  1. Open the job on the On hold tab, or from the job's own page — it shows an "On hold" badge with the reason and how many days it's been sitting.
  2. Take off hold — optionally note what the customer said (not required).
  3. Schedule the job — it returns to Needs scheduling right away. Booking it directly also clears the hold on its own.

A held job posts in every daily Telegram digest under "On hold" until it's released, booked, or marked lost — so it's never silently forgotten. Re-holding an already-held job just updates the reason and restarts the day count.

Insurance jobs

  • Flag is_insurance at intake (or later in the job's Money section). On an insurance job the quote = the customer's deductible — recorded through the normal payment flow.
  • The insurer's payment is a separate fact, recorded via Record insurance payment in the job's actions menu. It does not gate job completion.
  • The jobs board has an Insurance tab; its badge counts jobs still awaiting the carrier.
  • Note: ROAS revenue counts only the deductible on insurance jobs (by design, for now).

Deposits

Collect a deposit before the job is worked (before ordering/paying for a part, or before dispatching for labor/inspection-only work) in these cases:

CaseDeposit
OEM glass job — always, no exceptions. These parts are non-refundable once ordered, so we can't absorb a cancellation.Non-insurance: 50% of job total. Insurance: 100% of the deductible.
Labor-only job — see Job acceptance below.$150 flat.
Inspection-only job, or any job that's still unclear/exploratory$150 flat.
Client feels "fishy" — gut call, e.g. hesitant to commit, inconsistent story, pressure to skip normal stepsSame as an OEM glass job: 50% of job total (non-insurance) or 100% of the deductible (insurance).

Tracking deposits in the dashboard: mark each deposit as its own payment on the job's Money section — a job that collects a deposit and then a final payment will show two payments on the job page. Record each one at the time it's actually collected; don't wait and log them together after the fact.

Stripe payments no longer need to be marked paid by hand. The dashboard auto-records a Stripe payment as soon as Stripe receives it. This automatic tracking only applies to Stripe — Zelle, Venmo, and cash payments (deposits included) still need to be recorded manually, the same as before.

Adjusting confirmed amounts

Tech payments and part payments are usually entered as an estimate first (a quoted part price, a planned labor amount). Once the real number is confirmed — the part's actual price at the moment we pay for it, or the actual amount paid to a tech — always go back and adjust the recorded amount on the job to match. Profit, ROAS, and tech payouts are all calculated from these numbers, so a stale estimate throws all of it off.

Parts — price verification

Always verify the part's real price at the moment we pay for it, not before:

  1. If the confirmed price is more than $20 higher than the quoted part cost, check an alternative provider before paying.
  2. If every provider is running higher, calculate the job's profit: total quote − labor cost − part cost.
  3. If that profit comes out to roughly $150–$200 or lower, flag the job to David's team and consider requoting the client.

For LA Auto Glass specifically, see the fuller supplier/warehouse-selection process in the BCB scheduling SOP.

Warranty jobs

Post-completion "customer reports an issue" flow, under Operations → Warranty. Use this when a customer reports a problem after the work is done — the glass leaks, whistles, or something feels wrong. The return visit is unpaid to the customer, and unless extra pay is added, unpaid to the tech too — it never touches the original job's money.

  • The job must already be work-completed or completed. As soon as a claim is reported, open the job's actions menu → Warranty / fix needed, and write down what the customer reported — before any further investigation. This is what flags the claim in the dashboard and lets the team track and follow up on it correctly; do not wait until the issue is diagnosed to log it.
  • The new claim then appears on Operations → Warranty as open, waiting to be booked.
  • Schedule visit — same date/time/window/technician fields as a normal job; it defaults to the original tech. One automatic, deliberately generic text goes to the customer once it's booked — the word "warranty" never reaches the customer. If the tech needs extra pay for the visit, toggle it on and set an amount here.
  • Mark complete requires a 👍/👎 on how the visit went — this is informational only, it does not start a new review request.
  • Notes and Cancel are also available on the Warranty page, for editing the issue or dropping a claim entirely.
  • Warranty visits show on the Operations calendar in purple.
  • Warranty claims should be evaluated based on whether the reported issue is related to the installation or represents new damage occurring after the job. If the customer reports surface damage such as scratches after installation, document the customer's photos and the original post-installation photos before determining whether a warranty visit is appropriate.
  • Do not automatically assume the glass or installation is defective based only on a customer's description or photo. If the reported issue is unclear, have a technician inspect it when appropriate.
  • If a warranty cannot be extended because the new damage is outside the original warranty coverage, the limitation should be explained to the customer before scheduling any warranty work.

Standard operating procedure

Once a claim is logged, the goal is to resolve it at the ops level whenever possible, without looping in leadership:

  1. Photos are the default evidence for every job. Techs send photos of the completed work, and customers are asked to send photos when they report an issue.
  2. Compare the two sets of photos with the assigned tech to determine whether the issue originated with the installation or occurred afterward.
  3. If the issue is on our end, the tech returns to resolve it under warranty, at the tech's own cost — this is the standing agreement with our technicians and does not require sign-off from David's team.
  4. Nico and Laura are empowered to make this call themselves — open the claim, review the photos with the tech, and dispatch the return visit without waiting for approval.

When to escalate: loop in the team only when a claim involves an added cost (materials, parts, a discount, or anything beyond the tech's standard warranty coverage) or looks like more than a simple send-the-technician-back-to-fix-it visit. Route those to Celia rather than defaulting to David's team.

Chip repairs

Chip repairs should have the same $150+ profit goal with clear warranty information.

If the job does not meet that goal, aim to upsell a full windshield replacement, or choose not to take the job if it creates too much operational headache for the margin.

Job acceptance

Do NOT book unclear or exploratory jobs.

If the customer cannot clearly explain what needs to be repaired, replaced, installed, or performed, CANCEL / DECLINE.

Examples of exploratory requests:

  • "Come take a look and see what you can do."
  • "I'm not sure what's wrong."
  • "Maybe you can fix it."
  • "I just want someone to look at it."

Defined labor-only jobs ARE accepted.

Examples:

  • Customer already has the window regulator and needs installation.
  • Customer already has the windshield and needs installation.
  • Customer has the part and clearly knows what needs to be installed.

All labor-only jobs require a $150 deposit, regardless of:

  • vehicle age
  • job size
  • part cost
  • how simple the job appears

Key rule:

  • Defined labor-only job → BOOK + $150 deposit
  • Undefined / exploratory job → CANCEL / DECLINE

Recalibration requests after glass replacement

This applies when a customer requests recalibration after the glass has already been replaced and recalibration was not included in the original quote.

If the customer asks via text:

  • Always connect them with David's team for review.
  • Do not automatically promise or approve recalibration.

If the customer asks during a phone call:

Ask whether any sensors or warning lights are currently showing.

If NO:

  • Explain that installations are calibration guaranteed.
  • Technicians verify cameras/sensors are working correctly after installation.
  • If a sensor turns on in the following weeks/months, recalibration is provided free of charge.
  • Sensors remain covered by the lifetime warranty.

If YES:

  • Request a photo of the warning/sensor message.
  • Contact the installation technician and ask whether it could be related to the installation.

If recalibration appears necessary:

  • Consult David's team BEFORE agreeing to or scheduling recalibration.
  • Confirm whether the customer had a discounted / No-Calibration quote.
  • No-Calibration quotes are only used when explicitly communicated upfront as a lower-price option.
  • These quotes include no calibration and no sensor warranty.

If recalibration is approved:

  • Step 1: Glass installation by the installation technician.
  • Step 2: Calibration, if needed, scheduled 24–48 hours after installation and handled by a software engineer specializing in camera alignment.

ADAS calibration jobs

ADAS calibration is handled separately from glass replacement.

Insurance jobs requiring calibration:

  • First appointment: glass replacement only.
  • Second appointment: ADAS calibration.

Customers should be informed that the job happens in two phases.

Jobs requiring both recalibration and glass replacement:

  • Coordinate the glass replacement first.
  • After the glass replacement is completed, coordinate the calibration appointment.

The ADAS calibration reference spreadsheet is the source of truth for calibration details.

Status quick reference

BadgeMeaningWhere to act
Needs schedulingNo appointment booked yet.Jobs board → Needs scheduling
On holdWaiting on the customer — not being chased today.Jobs board → On hold
ScheduledAppointment booked, work not yet done.Jobs board → Scheduled
Work done — awaiting paymentJob finished, money still owed.Jobs board → that tab
Awaiting callWork just finished — first review call not logged yet.Reviews page
Open (warranty)Claim filed, visit not yet booked.Warranty page
Part vs. glass mismatchPart number and glass position disagree.Job's Money section, or the schedule form
OEM depositNon-aftermarket part, deposit short.Job's Money section
SOP: the Follow Ups module

The shared dispatch to-do list — tracking promises that must not get lost between shifts.

The Follow Ups module is a shared to-do list for the dispatch team. It stores promises that must not get lost between shifts.

Examples: "Call the customer about a late part." · "Ask the tech to send cash today."

Where it lives

  • Operations → Follow Ups (FollowUpResource) — lists every follow-up item.
  • Job view — each job page has its own Follow Ups section, showing items linked to that job.
  • Daily digests — all three daily ops messages show open follow-ups.

The data

Each item is one row in the follow_ups table.

  • job_id can be empty. Many follow-ups are about a tech, a vendor, or a supplier — they aren't linked to any job at all.
  • due_date is a plain text date (YYYY-MM-DD) — there's no special date type behind it.
  • "Overdue" means the due date is before today, where today is Pacific time, not UTC.
  • A follow-up with no due date is a normal state, not a data gap. The system sorts these last, never marks them overdue, and never includes them in the daily Telegram message.

Assignment

  • An assignee is optional. With no one assigned, the item belongs to the shared team — not to any one person.
  • Only dispatch staff can be assigned — technicians are excluded from the assignee list.
  • Any dispatch staff can close an item, even one assigned to someone else. Assignment is about ownership, not a lock.

Closing an item

  • markDone(?note, Employee) — closes the item with a result. The note is optional; most items need none.
  • cancel() — cancels the item instead of completing it.
  • Both actions are safe to repeat. A double-click doesn't overwrite anything — the system keeps the first result.

Daily SOP

Follow Ups is a living list, not a set-and-forget one. Dispatch should:

  1. Check it at the start of shift — pick up anything left open from the previous shift.
  2. Add new items as promises come up through the day (a callback owed, something to ask a tech, a vendor to chase).
  3. Review it again at least a couple more times during the day — don't wait for the end of shift to find out something slipped.
SOP: paying techs (End-of-Day)

The daily End-of-Day payout, rolling cash balances, and tech-fronted parts.

Two paired tools under Admin: End-of-Day Summary (pay techs daily) and Tech Balances (rolling cash each tech owes us).

A technician's base pay is applied automatically the moment they're picked at scheduling — it's fixed to their rate on file, never typed in by hand. Distance pay is the one exception: it's granted separately, only at the schedule step, capped at $50 — see checks at the schedule step.

The model in one picture

Flowchart · Mermaid source
flowchart TD
  CASHPAY[Tech collects CASH on a job] -->|Immediately at recording| BAL[Tech's cash balance goes UP<br/>they owe us that cash]
  JOBS[Tech completes jobs today] --> OWED[Labor owed for the day<br/>plus any tech-fronted parts]
  OWED --> EOD{End-of-Day: Mark paid}
  BAL --> EOD
  EOD -->|"payout = max(0, owed − balance)"| PAYOUT[We pay the tech the difference]
  EOD -->|"balance = max(0, balance − owed)"| NEWBAL[Balance pays itself down]
  HANDBACK[Tech hands cash back] --> CLEAR["Clear balance (Tech Balances page)"]

Example: tech's balance is $100 (cash they collected), today's labor is $120 → we pay $20 and the balance clears to $0.

Daily SOP — End-of-Day Summary

  1. Open Admin → End-of-Day Summary (defaults to today; you can step back days).
  2. One row per tech who completed a job that day — jobs count, pay owed, their cash balance, to pay, and a Paid/To-pay badge.
  3. Click a row (View jobs) to see the per-job breakdown — a Work line plus a Parts (tech paid) line when the tech fronted parts. It reconciles to the Pay-owed column.
  4. Hit Mark paid per tech. That settles the day: pays labor net of their cash balance, stamps the jobs tech-paid, and writes an audit row.

Notes:

  • We pay techs for jobs they complete — customer payment does NOT gate the payout.
  • Settled techs stay visible (marked Paid), so stepping back a day or two is safe.
  • There is no per-job "mark tech paid" — payouts only happen through End-of-Day.

Cash balances — Tech Balances page

  • Cash a tech collects rides onto their balance the moment the payment is recorded — not at settle time. Editing a payment amount or switching to/from cash adjusts the balance (never double-counts, never goes below $0).
  • Tech Balances shows every tech with a balance > 0. When a tech physically hands cash back, use Clear balance there.
  • Every movement (cash collected, EOD payout, balance clear) writes an audit row, so any balance can be explained job-by-job.
  • We never refund customers out of a tech's pocket — refunds go out by Zelle from us.

Tech-fronted parts

Normally we buy parts. When a tech pays out of pocket:

  1. On the job's Money section, tick the "Tech paid" checkbox next to that part in the parts list — no re-typing amounts.
  2. The part cost is reimbursed on top of labor at End-of-Day and shows as its own Parts line in the breakdown.
  3. Margin/ROAS never double-count it — the part cost was already a job cost; it's just flowing through the tech.
Technician Directory

Central reference for field technician contacts, capabilities, pricing, service areas, and dispatch preferences.

Central reference for field technician contacts, capabilities, pricing, service areas, and dispatch preferences. Use this page to look up who covers a market, what they charge, and how they should be prioritized for dispatch.

Technician Information

Los Angeles

TechnicianPhoneServicesService AreaStandard PriceLong Distance PricePremium Models PriceTesla PriceNotes
Jose310-425-6282SunroofAll$110$10–$20$130$2502-man job $220. Too far: Van Nuys, Hollywood.
Alex818-385-7491SunroofAll$110$10–$20$110$2002-man job $250. Cybertruck $500. Too far: Orange County.
Daniel747-367-9000Chip repairAll$115$30$200$225Chip repair $85–$100/chip.
Adrian323-420-4514Chip, Sunroof, CalibrationAll$120$10–$20$150$150Does Brightdrop. Too far: Santa Monica, Glendale, Santa Clarita, Encino.
Victor909-723-0255Chip, Sunroof, CalibrationAll$120$20$190$1902-man job $270. Chip repair $55. Too far: Santa Clarita.
Salomon323-422-9987Riverside, Orange County$125$20–$30$200$2002-man job $250. Too far: Santa Monica, Glendale, Santa Clarita, Encino.
Renato940-443-7825Chip, SunroofLives in San Fernando — covers All$125$200$2002-man job $200. Has a tool to remove windshields without breaking them.
Jesus424-901-3973Chip repairSouth LA$130$20$190$2252-man job $250. Cybertruck $300. Chip repair $75. Too far: SFV, Santa Clarita, Encino, Pacoima, Woodland Hills, Calabasas.
Aaron626-759-5074SunroofAll$130$10–$20$200$2002-man job $250. Too far: Santa Monica, Anaheim, Van Nuys, Reseda.
Ricardo415-678-8885Chip, SunroofValley$140$40$250$200Does Brightdrop.
Antonio818-747-1459Chip, SunroofPacoima SFV, Sylmar$150$40$250$2002-man job $300. Cybertruck $300. Does Brightdrop. Chip repair $85. Too far: Glendale, Van Nuys.
Sergio818-791-3097Chip, SunroofValley$180$20$220$2502-man job $250. Chip repair $80. Too far: Pasadena.
Phillip626-416-7960Chip, Sunroof, CalibrationAll$225$0$225$2252-man job $225. Does Brightdrop. Chip repair $85. Too far: Santa Clarita, Calabasas.

San Diego

TechnicianPhoneServicesService AreaStandard PriceLong Distance PricePremium Models PriceTesla PriceNotes
LauraMonse (English) 951-525-2271 · Laura personal (Spanish) 619-649-5347Chip, SunroofSan Diego$120–$160$180$260$260–$450Worked with her and Oscar. Laura's personal line often goes unanswered — go through Monse first.
Henry619-587-7298Chip, SunroofSan Diego$120$20$190$225Worked with him.
Nick619-460-2443Chip, Sunroof, CalibrationSan Diego$250$250$300$300
Oscar619-649-5346Chip (unconfirmed)San Diego$130Worked with him.
Dominik619-588-2900Chip, Sunroof, CalibrationSan Diego$200$250$300$300
Auto Glass Specialists858-293-1401Chip, Sunroof, CalibrationSan Diego$300$300$400$400Company/shop, not an individual tech.
Lalo323-494-1683South Gate / San Gabriel Valley$130$150Not a San Diego-area tech — keep in mind if dispatching locally.
David949-231-2993Chip, Sunroof, CalibrationOrange County, North Tustin$150$35 extra (Riverside, LA, Long Beach)$250$25027 years experience, handles warranty claims, works Mon–Sat. Chip repair $85.

Glass suppliers & warehouses (San Diego / LA region)

SupplierAddressPhone
Mygrant14235 Lomitas Ave, La Puente, CA 91746626-333-5222
Mygrant10220 Camino Santa Fe, San Diego, CA 92121858-455-8022
IGC1440 S Signal Dr, Pomona, CA 91766909-622-7000
IGC787 W Mill St, San Bernardino, CA 92410909-386-9237
IGC410 Vance St, Santa Ana, CA 92701714-835-4700

Phoenix

TechnicianPhoneServicesService AreaStandard PriceLong Distance PricePremium Models PriceTesla PriceNotes
TBDTBDTBDTBDTBDTBDTBDTBDTBD

Technician Documentation & 1099 Requirements

  • When a new technician is used for 3 jobs, obtain a completed W-9 from the technician.
  • If the W-9 is missing after the 3-job threshold, flag it for review before assigning additional work.
  • If a technician keeps refusing to provide their W-9/1099 info after being asked, remove them from the active technician roster rather than continuing to assign them jobs.
  • Blank W-9 form: irs.gov/pub/irs-pdf/fw9.pdf
  • Completed W-9 forms are filed in the AGLA Techs W9 forms Drive folder: drive.google.com/drive/folders/1wpfdS7u2xugOFLskm904J1qGv1_vqwEZ

SSNs/TINs are never recorded on this wiki — they live only in the W-9 forms themselves, inside the Drive folder above. Look them up there, not here.

Status by tech

TechnicianAreaZelle account name on fileW-9 statusNotes
AaronLAAaronTechOn file — Aaron Gomez
RicardoLARicaro TechRequested
DanielLADaniel FelixRequested
Anthony A. AguirreLAJose AguirreOn file — Jose AguirreW-9 is from Jose's son, Anthony.
AlexLAAlex GarciaOn file — Alex Garcia
AdrianLAAdrian techNot on file
VictorLAVictor TechNot on file
SalomonLASalomon CamposNot on file
RenatoLARenato TechNot on file
JesusLAJesus techNot on file
AntonioLAAntonio TechNot on file
SergioLANot on file
PhillipLANot on file
Laura Silva / OscarSDOscar TechNot on file
HenrySDHenry TechNot on file
LaloSDNot on file
DavidSDNot on file

Dispatch Priority & Reliability Ranking

This section requires team input from Alex/Celia/Nico.

Los Angeles

MarketTechnicianPriorityNotes
Los AngelesTBDTBDTBD

San Diego

MarketTechnicianPriorityNotes
San DiegoTBDTBDTBD

Phoenix

MarketTechnicianPriorityNotes
PhoenixTBDTBDTBD
SOP: adding a new technician

How to create a new tech in Admin → Employees — fields to fill in, what to skip, and the calendar-color trick.

New techs (and any other staff) are created under Admin → Employees → New Employee.

Steps

  1. Go to Admin → Employees → New Employee.
  2. Under Job functions, check Technician. This unlocks the Tech Details panel on the right (entity, pay rates, scheduler settings) — leave it unchecked and that panel stays hidden.
  3. Leave Can login off. Techs don't need dashboard access — only staff who log in need a password and a role.
  4. Fill in, in this order:
    1. Name
    2. Phone
    3. Calendar color — see below, this one takes an extra step.
    4. Tech Details → Fixed cost per job (their standard flat rate) and Luxury car rate (flat rate paid instead of the fixed cost when a job is marked luxury).
    5. Zelle payout name — exactly as it appears in Chase (e.g. "Zelle payment to Jose Aguirre" → enter "Jose Aguirre"). This is what auto-matches their End-of-Day payouts on the bank ledger — get it right or reconciliation won't match automatically.
  5. Leave End-of-day summary texts and AI scheduling texts off for most new techs. Only turn these on if the tech has specifically been set up for nightly pay-summary texts or AI-negotiated scheduling — don't enable by default.
  6. Set Entity (location) under Tech Details to whichever location the tech works for.
  7. Click Create (or Create & create another if you're adding several in a row).

Picking a calendar color

Each tech's calendar color needs to be unique so appointments are visually distinguishable — but the create form doesn't show you which colors are already taken.

Before picking a color:

  1. Open the Employees list (or the scheduling calendar) in another tab.
  2. Scan the existing techs' calendar colors.
  3. Pick a color that's visibly different from all of them — don't reuse a near-duplicate shade (e.g. two similar blues). When in doubt, go with a color further around the color wheel from whatever's already there rather than a lighter/darker variant of an existing one.

If the dashboard ever grows a "list all used colors" view, use that instead of eyeballing the Employees list — check the Technician Directory or Employees list for the current roster first.

What to leave alone

  • Preferred language, Active (defaults to on), and job functions other than Technician — only touch these if the tech specifically needs them.
  • Don't turn on Can login for a tech unless they've been explicitly approved for a dashboard account and role (see roles).
SOP: AI scheduler ("Schedule w/ AI")

How the AI scheduling tool negotiates a job's time slot with technicians over text — session setup, ranking, negotiation, booking, and dispatcher controls.

"Schedule w/ AI" negotiates a job's time slot with technicians over text, one at a time, instead of a dispatcher calling/texting each tech by hand. It only ever settles the date/time and which tech — everything else about the job (distance pay, warehouse changes, other schedule checks) stays with a person.

The flow

Flowchart · Mermaid source
flowchart TD
  START["Dispatcher clicks 'Schedule w/ AI'<br/>(job view or Send Welcome screen)"] --> SETUP[Review/edit window, time type,<br/>warehouse, tech order, mode]
  SETUP --> BUILD[System builds ranked tech list<br/>opted-in only, filtered by day-part load & conflicts]
  BUILD --> TEXT[Text top technician an offer]
  TEXT --> REPLY{Technician reply}
  REPLY -->|Accept| BOOK
  REPLY -->|Counter — fits window| BOOK
  REPLY -->|Counter — doesn't fit| RETRY["Ask same tech once more"]
  RETRY -->|Still no fit| NEXT[Move to next technician]
  REPLY -->|Decline| NEXT
  REPLY -->|Question, before any yes| PAUSE[Stop — dispatcher steps in]
  REPLY -->|Question, after a yes| BOOK
  REPLY -->|Emoji / ambiguous| CONFIRM["Read the meaning back<br/>before booking"]
  CONFIRM --> BOOK
  NEXT --> TEXT
  BOOK{"Still open?<br/>Not already scheduled by a person?"}
  BOOK -->|Pass| WRITE[Write tech/date/time via normal scheduling]
  WRITE --> CARDTXT[Text tech full job card]
  WRITE --> CUSTTXT[Text customer time confirmation]
  WRITE --> TG[Post one alert to Telegram]
  WRITE -.->|No warehouse set| ASKWH["Ask tech which warehouse, after booking<br/>never blocks or cancels the booking"]

1. A dispatcher starts a session

Open a job → Schedule w/ AI. This button lives on the job view and on the Send Welcome screen. Before starting, the dispatcher reviews/edits:

  • Date/time the customer wants — pulled from intake, editable.
  • Time type — exact time, part of day, after a time, before a deadline, or any time (see The four time types).
  • Warehouse for the part — can be left empty.
  • List of technicians to contact, in order — drag to reorder.
  • Mode:
    • Simulate — no real texts send.
    • Approve — a person must click send on each text.
    • Live — the system sends texts on its own.

2. The system builds the technician list

  • Only technicians opted in for AI texts are contacted.
  • A technician is skipped if they already have two jobs in the same part of the day (morning/afternoon/evening), or if they're busy on a job at the same exact time.
  • Technicians with room in their day are ranked first.
  • Two separate rank lists exist — normal cars and luxury cars. The system uses whichever list matches the job's vehicle.

3. The system texts technicians, one at a time

The top-ranked technician gets a text offering a time slot. If they don't reply in time, the system moves to the next technician on the list. Possible replies:

ReplyWhat happens
AcceptMoves to booking (step 4).
Counter, fits the customer's windowBooks it at the countered time.
Counter, doesn't fitAsks the same technician once more. If still no fit, moves to the next technician.
DeclineMoves to the next technician.
Question, before any technician has said yesStops and hands off to a dispatcher, in most cases.
Question, after a technician already said yesDoes not cancel the booking — books the time and answers the question later.
Emoji / ambiguous reply (e.g. 👍)Treated as a weak yes — the system reads the meaning back to the technician before booking.

Warehouse pushback: if a specific warehouse is already set on the job, the first text tells the technician the pickup location. If the technician pushes back, the system replies once with a firm answer — it does not change the warehouse without a person's help.

4. The system books the job

Before booking, it re-checks the job is still open and that no person has already scheduled it elsewhere. If both checks pass:

  1. Writes technician, date, and time to the job through the normal scheduling process.
  2. Texts the technician the full job card — customer name, phone, address, time, vehicle, part number, warehouse.
  3. Texts the customer the normal time-confirmation text.
  4. Posts one alert to the Telegram group so a person can check the booking.

If no warehouse was set going in, the system asks the technician which warehouse to use after booking — that question never blocks or cancels the booking.

5. Dispatcher controls during a session

The AI Scheduling page shows texts live as they happen. A dispatcher can:

  • Pause / resume the session
  • Skip the current technician
  • Cancel the session
  • Take over and finish the booking by hand

The four time types

TypeMeaning
ExactThe technician must match the exact time.
Flexible / part of dayAny time in that window works.
After a timeThe job can start at or after the named hour.
Before a deadlineWork must finish by the named hour — the system only offers times early enough to make the deadline.

What the AI scheduler does NOT do

  • Distance pay never comes up. The AI never asks about it and never books it. A dispatcher can add distance pay after the AI books the job, up until the job's start time — this keeps the negotiation focused on the time slot only.
  • Only the two-jobs-per-part-of-day check runs inside the AI scheduler's search. Other checks — part-vs-glass mismatch and the OEM parts deposit — are not checked inside the AI scheduler's own flow. They still show up later if a dispatcher opens the manual Schedule or Reschedule screens for the same job.
SOP: money — reconciliation, AR & ROAS

The weekly bank reconciliation, Accounts Receivable checks, and the ROAS report.

Bank ledger (Plaid → Chase)

Chase checking + credit-card transactions are pulled automatically every morning into the read-only Bank Transactions ledger (Admin area). Balances show at the top — checking, credit-card owed, and net cash position. Cash never appears here by definition — it's tracked through tech balances.

Weekly SOP — reconcile the bank

Goal: every Chase transaction gets accounted for. The auto-matcher does most of the work; the team confirms and fills gaps.

Flowchart · Mermaid source
flowchart TD
  PULL[Daily automatic pull + auto-matcher] --> TAB[Open Bank Transactions<br/>Needs review tab]
  TAB --> SUG{Suggested match shown?}
  SUG -- Yes --> OK["Confirm it (one click)"]
  SUG -- No --> MAN[Match manually:<br/>job payment / part purchase / tech payout / misc]
  OK --> ZERO{Badge at zero?}
  MAN --> ZERO
  ZERO -- No --> TAB
  ZERO -- Yes --> DONE[Week reconciled]
  1. Open Bank Transactions — it lands on the Needs review tab (badge = open items).
  2. Confirm each suggested match (✓). Suggestions only appear when there's exactly one candidate, so they're safe to trust — but glance at them.
  3. Match the rest manually: pick the kind —
    • Job payment — incoming Zelle/CC → the job's customer payment
    • Part purchase — vendor charge → the job(s) it was for (one charge can cover several)
    • Tech payout — outgoing Zelle → that day's End-of-Day payout (matched on the net amount)
    • Misc — Google Ads, card autopay, bank fee, transfer, refund, other
  4. Repeat until the badge hits zero. Unmatch undoes any mistake.
!

Obvious recurring items (Google Ads charges, Chase card autopay, fees) are auto-matched with no review needed. If a new glass supplier shows up, ask Claude to add it to the parts-vendor keyword list so their charges auto-suggest.

Accounts Receivable (admin-only)

Admin → Finance → Accounts Receivable shows two buckets — work through both regularly:

  • Awaiting payment — work is complete but no payment recorded. Action: Record payment. Stripe payments don't need this — the dashboard auto-records them the moment Stripe receives the charge, deposits included. This only applies to Stripe; Zelle, Venmo, and cash are still recorded by hand.
  • Collected · unconfirmed — a non-cash payment (Zelle/Venmo/Stripe) was recorded but hasn't been verified against the bank yet. It clears automatically when the bank reconciliation matches it, or hit Confirm received if you've verified it by hand.
  • Cash is always considered confirmed (the tech-balance system tracks it).

ROAS report

Weekly per-location: Ads spend + leads vs booked revenue & profit (revenue = job quote; profit = quote − part cost − tech pay; attributed to the week the job was created; lost/canceled excluded). Ad metrics pull automatically every morning from Google Ads.

Caveats to remember when reading it:

  • Insurance jobs understate revenue — the quote is just the deductible; the carrier's payment isn't counted (by design, for now).
  • If ad metrics stop updating, the Google OAuth token likely expired — flag to Alex/Claude.
Messaging & review drip

How automated texts work — providers, templates, the review drip, receipts, and STOP handling.

How texting works

  • Every outgoing text goes through one outbox — messages are queued, sent by a background worker, and idempotent: an automated step can never double-send.
  • The active SMS provider is chosen at runtime in Admin → Integrations & API Keys:
    • Quo / OpenPhone — primary. Their inbox is deep-linked from jobs (the "Call" button).
    • Podium — sends from the Podium location's own number (also used by the website lead flow).
    • RingCentral — available as an alternative.
  • Inbound texts land in Operations → Incoming Texts.
  • Outgoing texts can be paused globally; outside production everything logs instead of sending — so tests never text real customers.
  • STOP: if a customer texts STOP (or is manually opted out), their live review drips are canceled and unsent messages are dropped automatically.

Message templates

Every automated text is editable under Message Templates — reminders, payment requests (Zelle/Venmo), review drip, receipt, warranty visit. Templates use merge variables like {first_name}, {google_review_url}, {amount_paid}. Templates that require a variable refuse to queue until it's available (e.g. review asks won't send until the entity's Google review URL is set under Admin → Entities).

The review drip

Started by the 👍 answer to "How did the job go?" when recording payment. State machine, managed on Operations → Reviews (the nav badge = drips waiting on a call):

Flowchart · Mermaid source
flowchart TD
  PAY[Payment recorded + thumbs up] --> T1[Text 1: review request — sent now]
  T1 --> T2[Text 2: follow-up — next day, 10:00 AM]
  T2 --> CALL{Manual step: call the customer<br/>then Log call on the Reviews page}
  CALL -- Voicemail --> T3[Voicemail follow-up text — sent now]
  CALL -- Connected --> CHOICE{Send after-call text?}
  CHOICE -- Yes --> T4[After-call text]
  CHOICE -- Not interested --> END1[Drip canceled]
  T3 --> T5[Final text — 7 days later]
  T4 --> T5
  T5 --> END2[Drip completed]
  ANY[Customer leaves a review<br/>at any point] --> TY[Mark Review left →<br/>thank-you text, drip ends]

Working the Reviews page

  • Log call (after text 2): choose voicemail (fires the voicemail text) or connected (choose after-call text or "not interested").
  • Review left: any time you spot a new review from a customer, mark it — sends the thank-you text and ends their drip.
  • Pause / Resume / Cancel per customer as needed.
  • 👎 jobs are kept on record but never text the customer.
  • Skip for later instead of logging the first call is fine — it just leaves the job waiting.
  • If nobody logs a call by 7pm the same day, the system logs it as 👍 for you and starts the text sequence anyway — a busy afternoon never loses the review request.
  • Calibration jobs are the one exception: the review request waits until ops confirms the calibration, not until the windshield install itself is complete. See ADAS calibration jobs.

Receipts

On-request only. A paid job's actions menu → Send receipt → preview → texts the receipt template with the amount, method, and date. Repeatable if the customer asks again.

SOP: deploying the dashboard

How BCB Glass Ops ships — push to master IS the deploy. Plus the quick failure decoder.

The ops dashboard deploys completely differently from the marketing sites — don't mix the two models up.

The model

Flowchart · Mermaid source
flowchart TD
  DEV[Make the change<br/>Claude Code, cloud clone] --> COMMIT[Commit on master]
  COMMIT --> PUSH[Push to origin master]
  PUSH --> GHA[GitHub Action runs the full deploy<br/>code + migrations + caches + queue restart]
  GHA --> HEALTH[Automatic health check on the login page]
  HEALTH --> LIVE[Live on Cloudways]
  • One branch: master. That's it. No staging, no main, no feature branches — this is an internal tool with no preview tier. This rule is absolute, even for automated agents: if a session lands you on any other branch, switch back to master before committing.
  • Push = deploy. The GitHub Action ships every push to master (or run it manually from the Actions tab: "Deploy to Cloudways").
  • Always push live. The owner doesn't review dashboard changes before they ship — commit and push without asking.
  • Commit before deploying — the deploy ships the committed state; uncommitted changes don't go live.
  • The deploy never deletes server files — files removed from git stay on the server until removed by hand.
  • Fallback if the Action is down: ./deploy.sh from a dev machine (dry-run by default; --live to ship), or Cloudways' "Deployment via Git → Pull" + the artisan commands by hand.

Ground rules that keep prod healthy

  • Timezone: the app stores UTC and displays Pacific. Never change the app timezone — reminders will go out an hour off.
  • Cache/sessions/queue all run on the database — Redis is intentionally not used, and file-based cache breaks under the server's permission model. Don't "optimize" this.
  • Texts only really send in production with sending unpaused; everywhere else they log.

Quick failure decoder

SymptomCause / fix
Blank page / 403Webroot not pointed at public/
500 on every pageMissing APP_KEY or bad .env — check the Laravel log
DB errorsDB credentials wrong in .env
Assets brokenRe-publish assets + clear caches (filament:assets, optimize:clear)
Texts never sendQueue worker down, or message provider set to log
Reminders an hour offApp timezone was changed from UTC — change it back
Webhook "invalid signature"Re-paste the signing secret in Admin → Integrations & API Keys
Plaid "Connect Chase" won't openRedirect URI not allow-listed in the Plaid dashboard, or wrong environment for the keys
Bank ledger empty after connectNo credentials saved, bank item in error status, or queue worker down

05 Google Business Profile

Google Business Profile — optimization & maintenance

The GBP SOP — one-time foundation setup, plus the weekly and monthly cadence that keeps every profile ranking.

Every location's Google Business Profile (GBP) is a top local-ranking lever. Set the foundation once, then keep the weekly and monthly cadence — consistency is what moves the map pack.

!

NEVER touch business hours, website, phone number, or address on a live profile. Edits to these four fields are what commonly trigger a Google review and risk getting the profile suspended. If one of these looks wrong, flag it — don't edit it yourself.

One-Time Setup (Foundation)

Done once, but reviewed periodically.

  1. Business description — 750–1000 characters. Naturally include main services + location keywords (e.g. "LA Fence Experts provides affordable fence installation and repair in Los Angeles County"). Avoid keyword stuffing.
  2. Cover photos & logo — upload a clean, square, high-resolution logo. The cover photo should represent the brand/service (finished projects, team photo, storefront). Add 5–10 more photos of work, team, and customers (with consent). Always use different photos per GBP — even when two profiles are in the same industry, never reuse the same photo across them; Google can flag the duplication and it risks hurting both profiles' SEO.
  3. Services & products — minimum 10 services and 10 products, each with detailed descriptions, photos, and pricing where possible. Optimize with local + service keywords.
  4. Booking section — enable the appointments/booking link if applicable; point it at the calendar, CRM, or booking form.
  5. Categories — choose 1 primary category (the most profitable), then add 2–3 secondary categories covering additional services.
  6. Business hours — set accurate hours, including holiday/special hours, at initial setup only. Do not edit hours on a live profile afterward — see the warning above.
  7. NAP consistency (Name, Address, Phone) — must match the website, citations, and every online directory at setup. Keep formatting identical everywhere (e.g. "St." vs. "Street"). Phone and address are never edited on a live profile (warning above) — if a mismatch turns up later, flag it instead of editing it directly.

Weekly Tasks (Engagement)

Consistency is key.

  1. Upload photos & videos — add 3–5 new photos and at least 1 video each week. Geotag media with the service location (city/area). Focus on before/after work, the team in action, and customer testimonials. Use different photos on every GBP, even for profiles in the same industry — never upload the same photo to more than one profile.
  2. Respond to reviews — reply to all reviews within 48 hours using keyword-rich responses ("Thanks for choosing us for your Pasadena fence installation!"). Encourage more reviews by sending customers direct review links.

Monthly Tasks (Growth)

Long-term authority building.

  1. GBP posts (keyword/location rich) — post 1–2 times per week, reviewed monthly to keep the cadence consistent. Mix offers, updates, educational posts, and case studies. Always include a CTA + location/service keywords. Schedule with the Postamatic Chrome extension from the Owner Operated Google account.
  2. Citations — add or update the NAP on 10–20 new directories monthly (local business directories, industry-specific sites, Yelp, Angi, Houzz, Thumbtack, etc.). Formatting must be identical everywhere.
  3. Audit the profile — check for changes made by Google or users (they sometimes edit info). Refresh photos and the cover image, and review analytics.

Good practice examples

Quick ✅/❌ reference for the sections CSRs write copy for most often.

Business description

  • "LA Fence Experts provides affordable fence installation and repair in Los Angeles County, including Pasadena, Glendale, and Burbank. Our licensed crews install wood, vinyl, and chain-link fencing, plus fast repairs for storm and wear damage. We back every install with a workmanship warranty and same-week estimates."
  • "We are the #1 best fence company in LA! Fence fence fence installation fence repair fence Los Angeles fence Pasadena fence Glendale!" — keyword stuffing reads as spam and can suppress ranking instead of helping it.

Services & products

  • "Vinyl Fence Installation — Durable, low-maintenance vinyl fencing installed in 1–2 days, serving Pasadena and the greater San Gabriel Valley. Includes a 10-year material warranty."
  • "Fence stuff" or a service with no description at all — thin/blank listings don't help local ranking and look unfinished to customers comparing profiles.

Photos

  • ✅ Real before/after shots of a completed job, geotagged to the job's city, a technician actively working, a happy customer next to the finished work (with their consent).
  • ❌ Stock photos, a screenshot of the website, or the exact same photo set uploaded to a sister GBP in another city — duplicate images across profiles are a red flag to Google.

Review responses

  • "Thanks so much, Maria! We're glad our Pasadena crew could get your fence replaced so quickly. Reach out anytime if you need anything else." — genuine, names the customer, naturally works in the service + city.
  • "Thank you for your 5 star review of our fence installation and repair services in Pasadena Glendale Burbank Los Angeles." — reads like a bot stuffing keywords, not a reply to a person.

GBP posts

  • "Storm season is here — if your fence took wind damage this week, we're offering free repair estimates in Pasadena through Friday. Tap below to book a same-week visit." — timely, has a clear CTA, reads like a real update.
  • ❌ A generic "We do fence installation and repair!" post with no offer, date, or CTA, reposted unchanged month after month.

AI prompts for CSRs

Ready-to-copy prompts CSRs can paste into the team's AI assistant to draft GBP copy. Always fill in the bracketed details, and read the output before posting — treat it as a strong first draft, not a finished, approved copy.

Business description

copy block
You're an SEO expert who specializes in optimizing Google Business Profiles for local service
businesses. Write a Google Business Profile business description for [Business Name], a
[industry/service type] company serving [city / service area, list neighborhoods if relevant].

Requirements:
- 750–1000 characters
- Naturally include our main services: [list services]
- Naturally include our service area/location keywords: [list cities/neighborhoods]
- Written in a natural, human tone — no keyword stuffing, no "#1 best" claims
- End with a soft call to action
- No quotation marks, no emojis, no generic filler like "we are a leading company"

Services & products descriptions

copy block
You're an SEO expert writing Google Business Profile service and product listings for
[Business Name], a [industry/service type] company serving [city / service area].

For each service/product listed below, write a description between 150–300 characters that:
- Naturally includes the service name plus one or two location keywords
- Highlights a specific, concrete benefit to the customer (not generic praise)
- Sounds human and conversational, not robotic or stuffed with keywords

Return the output as a list, one description per line, matching this order:
[paste the list of services/products]

GBP posts

copy block
You're an SEO expert writing a Google Business Profile post for [Business Name], a
[industry/service type] company serving [city / service area].

Write a [offer / update / educational / case study] post that:
- Naturally mentions [service] and [city/area] as keywords
- Includes a clear call to action
- Stays under 1500 characters
- Sounds friendly and local, not salesy or generic

Context for this post: [describe the offer, update, or story]

Review responses

copy block
You're an SEO expert writing a reply to a Google Business Profile customer review for
[Business Name], a [industry/service type] company in [city].

Here is the review: "[paste the customer's review text]"

Write a reply that:
- Is under 350 characters
- Thanks the customer by name if one is given
- Naturally mentions [service performed] and [city/area] as keywords
- Sounds warm and genuine — not templated, not robotic, no keyword stuffing

06 Best practices

Git, branches & deploys

The global rules — two deploy models, branch discipline, and what "push" vs "deploy" means.

We run two deploy models. Knowing which one you're in prevents 90% of mistakes.

Changing a marketing website?

Flowchart · Mermaid source
flowchart TD
  A1[Branches: main + staging ONLY] --> A2[Work on staging → verify the preview]
  A2 --> A3[Owner approval for customer-facing changes]
  A3 --> A4[Merge to main = PRODUCTION deploy]

Changing the ops dashboard?

Flowchart · Mermaid source
flowchart TD
  B1[Branch: master ONLY] --> B2[Commit + push = deploy]
  B2 --> B3[No approval gate — internal tool, always push live]

The rules

  1. Marketing sites: exactly two branches — main + staging. Never create any other branch (no feature/fix/throwaway branches). They drift and cause mistakes; delete strays on sight. main is the source of truth; staging is always a clean copy of it.
  2. Ops dashboard: exactly one branch — master. Push to it and it deploys. Absolute rule, including for automated agents.
  3. Pushing a marketing site's main is a live production deploy — verify on the staging preview first, and get explicit approval for customer-facing changes. "Push to staging" never implies production.
  4. The dashboard is the opposite — always push live, no review step. It's internal.
  5. GitHub is the source of truth. All repos live under the OwnerOperated account. Local clones live under C:\Users\alexb\Glass projects\.
  6. Local first — never edit production servers directly. Everything goes through git so the repo stays authoritative.
  7. Never commit build output — no dist/, no node_modules/. The platforms build from source.

Verb glossary

VerbMeaning
"push" / "push live"Commit, push, and deploy per that project's rules
"deploy"Deploy only — the code is already pushed. If the environment is ambiguous, ask — never assume production.

Working with Claude Code

  • Open Claude in the specific repo's folder so its rules file (CLAUDE.md) auto-loads — never work from the home directory.
  • On launch, a sync-check reports whether the local clone is [UP TO DATE] or [BEHIND] the remote — never work on a stale copy.
Secrets & access

Where credentials live, where they never go, and who gets access to what.

The one rule

No credential ever goes in a committed file, a chat log, or this wiki. If you're about to paste a password, an API key, or a token somewhere — stop and check this page.

Where secrets live

Kind of secretWhere it belongs
Dashboard integrations (SMS providers, Google Ads, Plaid, Stripe)Encrypted in the dashboard DB — edit via Admin → Integrations & API Keys
Server-level config (DB password, app key)The server's .env file only
Site lead-delivery keys (Resend, Podium)Cloudflare Pages env vars, per project — remember: env-var changes need a redeploy to take effect
Anything a repo needs locallyA gitignored CLAUDE.local.md in that repo (auto-loads for Claude, never committed)

The committed CLAUDE.md in each repo = operational rules only, never credentials. That split means the safe half is in git and the sensitive half never leaves the machine/server.

Access

  • Wiki: viewing should be gated with Cloudflare Access (email-based login) once live — it's an internal manual. Editing requires a GitHub account with access to the bcb-wiki repo.
  • Dashboard: role-based — super_admin / admin / dispatch / finance. Give people the lowest role that does their job (dispatchers get dispatch, bookkeeping gets finance). Only a super_admin can grant elevated roles. See the roles table.
  • GitHub: repos are private under OwnerOperated. Collaborators get added per-repo.

Rotating / fixing credentials

  • Dashboard webhook signature errors → re-paste the signing secret in Admin → Integrations & API Keys.
  • Podium tokens are per Cloudflare Pages project — when rotating, update every site project and redeploy each one (env vars bind only on a new deployment).
  • If Google Ads metrics stop pulling, the OAuth refresh token likely expired — regenerate and re-save in Integrations.