Larchmont Builds LLC / Internal build spec / v1

The marketing system, reverse engineered from a funnel that already ran.

Most contractor marketing plans are written from opinion. This one is written backwards from eight delivery days of real lead data on a contractor in the same county, selling to the same buyer, through the same channel. Every build below exists because a number said so.

Registered WA contractor LARCHBL744BK Stack GoHighLevel + Meta + GBP + existing beacon Status Spec. Nothing shipped.

00 / Where the evidence comes from

Read this first or the numbers will mislead you.

The funnel data behind this document is not Larchmont's. It is Elite Northwest Flooring's: 8 delivery days, $252.42 of Meta spend, 10 leads, 7 booked, 3 estimates run, 3 quotes sent, $0 closed. Snohomish County, homeowner buyer, Facebook lead form.

It transfers because the shape transfers. Same county, same buyer age, same channel, same job size band, same problem of a two person operation trying to answer a phone while standing on a job. It does not transfer as a forecast. Nobody can tell you Larchmont's cost per lead from someone else's account, and this document never tries.

The rule this document follows

Where a number is borrowed, it says borrowed. Where a number is Larchmont's, it says so. Where a number does not exist yet, it says UNKNOWN and names who has to produce it. There are no invented figures anywhere in here, and none should be added later.

What Larchmont already has that the reference account did not

The gap is not traffic and it is not tracking. The gap is that nothing catches the lead in the first sixty seconds and nothing carries it to a signature. That is what this builds.

01 / The finding that pays for the whole system

Seven of eight bookings happened between 1.3 and 5.2 minutes.

Not hours. Minutes. The reason is boring and mechanical: the calendar sat on the last step of the form, so the person booked themselves while they were still holding the phone.

The one lead who took 883 minutes to book is also the only booked lead who never got an estimate run. One data point, so treat it as a hint rather than a law, but it points the same direction as everything else.

Nothing else in that funnel moved the number this much, and it had nothing to do with creative.

This is the cheapest finding in the document and the most expensive to ignore. It costs no ad budget. It is a form layout and two automations. Every other build below is downstream of it.

What it means for Larchmont

The current site posts a lead to /api/lead, pings a notification, and stops. There is no calendar on the form and no automated call. A lead that arrives at 7pm on a Saturday sits until someone opens a phone. Fix the sixty seconds before spending another dollar on reach.

02 / Do not build these

The expensive things that did not work.

This section exists because every one of these will be sold to Larchmont by someone, and four of them have hard evidence against them from the reference account itself.

The thingVerdictWhat the record shows
AI texting bot as the booking mechanismFailed167 outbound messages, 6 inbound replies at 3.5 percent, zero bookings traceable to it. Meanwhile a human call inside five minutes booked 7 of 10.
A tool that scores a video and predicts viewsDo not buyCreative features explain 10 to 25 percent of performance variance, ceiling near 30 percent even with non creative variables. Anything promising a view count is selling an R squared near 0.2.
Hashtags for reachDeadHead of Instagram on record: not an important thing for reach.
Trending audio for distributionFolkloreNo documented mechanism. It survives only as a creative prompt.
Best time to postFolkloreNo methodology behind any of it and the vendors contradict each other.
Tag a friend giveawayNeverTrips engagement bait rules and giveaway conditions at once. The demotion lands on the account, not the post, and it is durable.
Reels and Stories placements at launchOffTook 17 percent of spend across both platforms and produced zero leads. Facebook feed took 77.7 percent and produced 9 of 10.
101 ad variantsNoOne ad set took 78 percent of spend and produced 100 percent of leads. A single creative produced 7 of 10. The other 100 were budget that never got a chance.
Cutting the radius to kill far leadsReversedCutting it would have removed 94 percent of quoted pipeline. The two biggest quotes were the two furthest leads.
On the ad variant count

Spend is not independent of performance here. Meta concentrated budget early, so the winner and the ad Meta fed are confounded. The honest read is not that one creative was brilliant. It is that 101 variants split a small budget so thin that most never got tested at all. Ship five to eight, let them run, then judge.

03 / Evidence to build

Every build traced back to the number that caused it.

Finding

7 of 8 bookings inside 5.2 minutes

Calendar sat on the last form step.

Build

WF-01 Speed to Lead, WF-02 Missed Call Text Back

Calendar on the form, call bridge in sixty seconds.

Finding

7 booked, 3 run, 4 lost between

Cancellations and no shows ate the middle.

Build

WF-03 Show Rate Defense

Confirm, remind, on my way, recover.

Finding

3 quotes sent, nothing moved past sent

No follow up existed after the quote.

Build

WF-05 Quote Ladder

Four touches over 21 days, then close the file.

Finding

Pixel fired only on submit

153 clicks, 10 page views, page views equalled leads.

Build

Section 06 event map and offline conversions

Feed closed revenue back, not form fills.

Finding

Every large quote came from a GC or property manager

Nothing in the ad stack targeted that buyer.

Build

Section 08 commercial lane

Separate pipeline, separate cadence, no paid social.

Finding

GBP category was set to Remodeler

Larchmont's own audit. It made the profile invisible for the money terms.

Build

Section 09 review and profile engine

Category fix first, then review velocity.

04 / The pipeline

Six stages, and the two where money actually dies.

StageEnters whenExits whenReference drop
1. New LeadForm, call, or text arrivesTwo way contact made10 in
2. ContactedLead replies or answersAppointment on the calendar10 to 7
3. Estimate BookedCalendar slot heldEddie is standing in the house7 to 3
4. Estimate RunWalkthrough doneWritten number sent3 to 3
5. Quote SentPrice deliveredSigned or dead3 to 0
6. Won / LostDecision madeClosed out with a reason0 won

Stage 3 and stage 5 are the whole game. Booking is close to solved by speed. Getting the booked person to actually be home, and getting the quoted person to actually sign, is where every dollar of the reference account died. WF-03 and WF-05 exist for exactly those two gaps and nothing else.

Loss reasons, required field

Stage 6 does not accept a close without a reason from a fixed list: price, timing, went with another bid, job cancelled, could not reach, out of area, not a fit. Free text loss reasons produce nothing you can act on twelve months later. A fixed list lets you sort a year of losses by reason and see which one is costing the most.

05 / GoHighLevel

The workflows, written so they can be built without a second conversation.

Twelve workflows. Each one names its trigger, its exact waits, and its exit. Every SMS line below has been run through the Larchmont copy gate.

Hard gate before any of this can send

A2P 10DLC brand and campaign registration has to be approved before GHL will deliver SMS at volume. Unregistered traffic gets filtered by the carriers, not by GHL, so it fails silently and looks like people are ignoring you. Register the brand, register a campaign per use case, and do not build the SMS steps until the campaign shows approved. Budget a week.

WF-01Speed to Lead

TRIGGER: Form Submitted OR Inbound Webhook from site /api/lead OR Facebook Lead Form

  1. 0 secondsCreate Opportunity in Residential pipeline, stage New Lead. Set source from UTM fields passed by the beacon.
  2. 0 secondsSend SMS to the lead. Larchmont Builds. Got your request. We are calling you now. Reply STOP to opt out.
  3. 5 secondsCall Connect to Eddie. Ring 25 seconds. Whisper message names the service and city so he answers knowing what it is.
  4. If no answer, +45 secondsCall Connect to the second number. Ring 25 seconds.
  5. If still no answer, +2 minutesInternal notification plus a manual call task due immediately. Tag lead-uncaught.
  6. On two way contactMove stage to Contacted. Remove from this workflow.

Why the call and the text fire together: the text buys credibility for the unknown number that is about to ring. Sending it after the call is a wasted message.

WF-02Missed Call Text Back

TRIGGER: Call Status is Missed, Voicemail, or Busy on any tracked number

  1. 8 secondsSend SMS from the same number that was called. Sorry we missed you. This is Larchmont Builds. What do you need done?
  2. Wait for reply, 10 minutesIf the lead replies, notify Eddie and open a conversation. Stop.
  3. No reply, +1 hourOne follow up. Tried you just now. Want me to come look at it this week?
  4. No reply, +1 dayDrop to WF-10 Long Nurture. Stop.

This is the highest return automation on the list for a contractor. Larchmont's own beacon already treats phone taps as leads, which means the call volume is real and currently unmeasured after the ring. Every missed call today is a lead that simply evaporates.

WF-03Show Rate Defense

TRIGGER: Appointment Status is Confirmed

  1. ImmediatelyConfirmation SMS plus calendar invite to email. You are set for {{date}} at {{time}}. Eddie will be there. Text this number if plans change.
  2. 24 hours beforeReminder that asks a question, because a question gets a reply and a reply confirms intent. Tomorrow at {{time}} for your walkthrough. Still good?
  3. 2 hours beforeDeparture notice. On my way. Should be there around {{time}}.
  4. If Appointment Status becomes No ShowRecovery SMS plus a manual call task. Knocked and got no answer. Want to pick a new time?
  5. If Appointment Status becomes ShowedMove stage to Estimate Run. Start WF-04.

Reference drop was 7 booked to 3 run. That is four jobs lost between a yes and a doorstep, on a funnel with 10 leads in it. This workflow is aimed at exactly that number.

WF-04Estimate to Quote SLA

TRIGGER: Opportunity stage moves to Estimate Run

  1. ImmediatelyTask to Eddie: send the written number. Due in 24 hours.
  2. +24 hours, if stage has not movedInternal reminder to Eddie only. Nothing to the customer.
  3. +48 hours, if stage has not movedEscalate. This is now the oldest thing in the pipeline.
  4. On stage move to Quote SentSend the customer note and start WF-05. Sent your price to {{email}}. Any questions, just text back.

The reference account sent a quote for 100 percent of estimates it ran, so this is a guard rail rather than a fix. It exists so the number never becomes the bottleneck once volume rises.

WF-05Quote Ladder

TRIGGER: Opportunity stage moves to Quote Sent

  1. +2 daysAsk a question about the number rather than asking for the job. Did the price make sense? Happy to walk through it.
  2. +7 daysAsk what is blocking it. Do not discount here. Still thinking on the {{service}}? Tell me what is holding it up.
  3. +14 daysEmail with the written scope attached again, subject line: About your {{service}} price.
  4. +21 daysThe close out. This one gets replies because it releases pressure. Closing out your file. Want me to leave it open?
  5. +22 daysMove to Lost with a required loss reason. Drop into WF-10.

Nothing in the reference account ever moved past Quote Sent. Three live quotes worth $37,550 sat with no sequence behind them. This is the single largest recoverable number in the whole dataset.

WF-06Review Engine

TRIGGER: Opportunity stage moves to Won AND job marked complete

  1. +1 day after completionAsk, once, by text, with the direct GBP link. Glad it turned out. Would you leave us a Google review? {{link}}
  2. +4 days, no review detectedOne reminder by email. Then stop permanently.
  3. On review receivedNotify. Reply to every review inside 48 hours.
Legal, non negotiable

No gating, no incentive, no filtering by star rating. Do not route unhappy customers to a private form and happy ones to Google. That is an FTC problem under 16 CFR Part 465 and Larchmont already had one fake proof cleanup. Ask everyone the same way, or do not ask.

WF-07Speed Report

TRIGGER: Daily at 07:00

  1. Compute median seconds from lead created to first two way contact, for yesterday.
  2. Count leads where that number exceeded 5 minutes. Name them.
  3. Send to Eddie and Andrew. One line, no dashboard to open.

The metric that governs the system gets measured daily and read in five seconds. If this number drifts above five minutes the rest of the stack stops mattering.

WF-08Commercial Intake

TRIGGER: Form Submitted on the commercial page OR contact tagged property-manager, gc, insurance

  1. Route to the Commercial pipeline, not Residential. Different stages, different clock.
  2. ImmediatelyInternal notification only. No automated SMS to a GC. Ever.
  3. +1 business dayTask: call, then send the capability one pager and W9.
  4. QuarterlyAdd to the standing check in list. These are relationships, not leads.

A property manager who gets a chirpy automated text at 8pm is a relationship you just spent. The residential machine is wrong for this buyer, which is exactly why it gets its own lane.

WF-09Emergency Water Route

TRIGGER: Form or call where service is water, flood, or mold

  1. 0 secondsSkip the calendar entirely. This buyer does not book a Tuesday.
  2. 0 secondsCall Connect immediately, all numbers in sequence, no 45 second gap.
  3. If no answer in 90 secondsEscalate to a second channel and mark the opportunity urgent.
Scope law, carried from the site legal pass

Larchmont is a contractor, not a public adjuster. No claim negotiation, and the customer pays their deductible in full. Nothing in this route may imply otherwise, in copy or in a script.

WF-10Long Nurture

TRIGGER: Added on loss, no contact, or a cold quote

  1. Every 45 daysOne text. No campaign, no newsletter, no blast. You asked about {{service}} back in {{month}}. Still on your list?
  2. On replyPull out of nurture, back to New Lead, restart WF-01.
  3. After 4 cycles with no replyStop. Tag dormant. Do not text again.

This is the only place a language model belongs in the messaging path, and only for drafting the variant, never for holding the conversation. See section 07.

WF-11Unbooked Lead Recovery

TRIGGER: Stage is Contacted for more than 24 hours with no appointment

  1. +1 dayOne text that lowers the cost of saying yes. Still want that price? Takes about twenty minutes.
  2. +3 daysManual call task, not an automation.
  3. +7 daysDrop to WF-10.
WF-12Won to Cash

TRIGGER: Opportunity stage moves to Won

  1. Write contract value and close date to the opportunity. These two fields feed section 06 and nothing works without them.
  2. Fire the offline conversion webhook to Meta CAPI with the hashed contact and the real revenue.
  3. Schedule the job. Notify the crew. Start WF-06 on completion.

Step 2 is the one nobody builds. It is also the one that eventually makes the ad account optimize toward jobs instead of form fills.

06 / Measurement

Stop optimizing toward form fills.

The reference account fired its pixel on submit and nothing else. 153 link clicks produced 10 landing page views, and landing page views equalled leads exactly. That is not a funnel, it is a single event, and Meta optimized against it for eight days.

The event map

EventFires whenCarriesWhy
PageViewAny pagevisitor id, sourceBaseline and audience building
ViewContentService or city page, 15s dwellservice, citySeparates a real reader from a bounce
InitiateCheckoutForm started, first field focusedserviceThe abandonment signal. Nobody tracks this and it is where the form dies
LeadForm submittedservice, city, sourceCurrent only event
ScheduleAppointment bookedslot, serviceThe real top of the money funnel
ContactPhone tap or text tappage, sourceLarchmont's beacon already emits this. Feed it to the pixel too
PurchaseOffline, on stage Woncontract valueSent by WF-12 through CAPI, not the browser
Sequencing warning

Adding events mid flight to a campaign that is already learning will reset that learning. Build the full event map before the first dollar, or accept a deliberate reset on a day you choose. Do not discover this halfway through a test.

Wiring it to what already exists

Larchmont's beacon already produces the harder half: persistent visitor id, first touch source, click ids, per campaign UTM links, and phone and text tap events. The missing links are three:

  1. The site's /api/lead posts to GHL by webhook as well as to the existing store, carrying the beacon's _lv_vid, utm fields and click ids into GHL custom fields.
  2. GHL writes the appointment and the closed value back to the same store, so the dashboard's source to lead panel becomes source to revenue.
  3. WF-12 sends the offline Purchase to Meta CAPI with the click id captured at first touch. Without the click id the conversion cannot be matched and the whole loop is decorative.
The click id captured on day one is what makes the closed job on day forty attributable. Capture it or the rest is theatre.

07 / The AI layer

Six builds worth making, in the order they pay.

Every one of these processes data that already exists or that the system above starts producing. None of them talk to a customer unsupervised, because the one that did produced zero bookings out of 167 messages.

1. Call intelligence. Build first.

Every inbound call gets recorded and transcribed, then mined for the objection, the service, the city, and the words the caller actually used. For a contractor the call is the lead, which means the call recording is the only unfiltered voice of customer data in the business. It writes the ad copy, it writes the FAQ, and it tells you which objection is killing stage 5. Feed the top objections into the quote ladder every month.

2. Creative defect gate. Build second.

Not a performance predictor. A mechanical check that runs before anything publishes, because predicting failure is far easier than predicting success. It fails a piece for: no written final line, first cut later than one second, wrong caption font, missing reg number on a paid piece, a claim that is not on the approved facts list, an em dash, or a banned word. It is the existing lint gate pointed at video and static instead of only at print.

3. Competitor ad monitor. Build third.

A weekly sweep of the Meta Ad Library across the service radius. It records days on air, variant count, offer, and relaunch behaviour. Those three are the only honest proxies that exist, because Meta publishes no cost per lead, spend, impressions or click through rate for commercial advertisers. Any tool claiming a competitor's cost per lead invented it. What the sweep is actually looking for is the lane nobody is running, which is how the open refinish lane got found in the reference market.

4. Quote autopsy. Build fourth.

Once thirty quotes exist with loss reasons attached, cluster them by service, job size, city, source, and reason. The output is a single sentence each month: this is the job we keep losing and this is why. It cannot run before the data exists, so it is fourth by necessity rather than by importance.

5. AI discovery monitor. Build fifth.

Assisted local discovery moved from roughly 6 percent to roughly 45 percent inside a year. That plausibly outweighs every posting tactic in this document. The monitor asks the major assistants the twenty questions a Snohomish County homeowner would actually ask, records whether Larchmont appears, and logs what got cited instead. Larchmont's AEO pages already exist for this; the monitor tells you whether they are working.

6. Nurture drafter. Build last.

Drafts the WF-10 variants so the every 45 days text is not identical for two years. A human approves the batch monthly. The model never sends, never replies, never holds a thread.

The line that keeps this honest

Anything that cannot be answered returns a refusal instead of an estimate, because a plausible number is worse than no number when you act on it. Every output carries where it came from.

08 / The commercial lane

The branch with the biggest jobs and no marketing attached.

In the reference account every large quote on file came from a general contractor or a property manager, and not one of them came from an ad. The largest was $200,500 against an average residential quote of $12,517. Nothing in the marketing stack targeted that buyer.

Larchmont is a general contractor rather than a flooring sub, so the mirror image applies. The repeat volume buyer is the property manager, the insurance restoration referrer, and the realtor with turns. Larchmont already has a partnership SOP built for exactly this and it is not wired to anything.

ChannelMechanismPaid social role
Property managersNamed list, quarterly touch, unit turn pricing sheetNone
Insurance restorationReferral relationships, response time is the productNone
Realtors, pre list repairsFast small jobs, list of what kills an inspectionNone
General contractorsPrequalification, plan rooms, certificate of insurance on fileNone

Paid social has no role in any row. This lane runs on a named list, a calendar, and WF-08. It is slower to start and it does not decay when the ad budget stops.

09 / Profile and reviews

Fix the category before anything else in this section.

Larchmont's own GBP audit found the primary category set to Remodeler, which made the profile invisible for the terms that actually carry intent. Category is the one field that moves the most, and it costs nothing to change.

  1. Set the primary category to the service that carries the most revenue, then add secondary categories for the rest. One primary, several secondary, reviewed quarterly.
  2. Service areas by city, matching the site's city pages exactly. The place name law in the copy doctrine governs which names are allowed.
  3. Reviews via WF-06, ungated, one ask plus one reminder. Larchmont currently has no verified review count, so no review number gets published anywhere until it exists.
  4. Posts continue from the existing library. No phone number and no URL in post text.
  5. Photos: real job photos only. The site photos are stock and disclosed as representative, which is fine for the site and not fine for the profile.
Standing rule

Never publish a review count, a star rating, or a job count that is not verifiable on the day it ships. That was the exact class of claim purged from the site and the SEO property. It does not come back through a side door.

10 / Paid

Small, boring, and pointed at the feed.

SettingLaunch withBecause
PlacementsManual. Facebook feed only.Feed produced 9 of 10 leads on 77.7 percent of spend. Reels and Stories produced zero on 17 percent.
Creative count5 to 8101 variants split a small budget so thin most never got a real test.
AgeDo not exclude 55+Women 65+ were the cheapest lead in the reference account at $14.03. Men 65+ produced nothing on similar spend.
RadiusWide. Price the drive in.Cutting distance would have removed 94 percent of quoted pipeline.
ObjectiveLeads, then Purchase once WF-12 feedsOptimizing on form fills buys form fills.
Every adCarries LARCHBL744BKRCW 18.27.100 requires the registration number in contractor advertising.

What a test costs before you promise one

At realistic variance for a small account, detecting a 2x effect takes roughly 46 posts, or about 28 with topic matched pairs. A 1.5x effect takes roughly 138. A 1.25x effect is not reachable.

The trap under the trap

An undersized test does not fail loudly. At fifteen per arm it reports roughly 2x whether the truth is 1.15x or 2x, because only the lucky results clear the bar, and it points the wrong way about one time in nine. That is the machinery behind every confident marketing case study. Run fewer tests, properly powered, and read nothing until the arm closes.

11 / Build order

What ships in what week, and what is already done.

Week 0 / Gates, nothing sends without these

  • A2P 10DLC brand and campaign registration submitted. This one has a lead time you cannot compress.
  • GHL sub account, numbers provisioned, pipelines and stages created, loss reason list locked.
  • Confirm the facts that go on camera and in copy: response promise wording, warranty wording, service list. Nothing aspirational.

Week 1 / The sixty seconds

  • Calendar embedded on the last step of the site form.
  • WF-01 Speed to Lead, WF-02 Missed Call Text Back live.
  • /api/lead webhook into GHL carrying visitor id, UTMs and click ids.
  • WF-07 Speed Report firing daily.

Week 2 / The middle of the funnel

  • WF-03 Show Rate Defense, WF-04 SLA, WF-05 Quote Ladder, WF-11 Recovery.
  • Full pixel event map deployed before any spend.
  • GBP primary category fixed. WF-06 Review Engine live.

Week 3 / Revenue closes the loop

  • WF-12 Won to Cash with the CAPI offline conversion.
  • GHL writes appointments and closed value back to the existing lead store.
  • Dashboard panel changes from source to lead into source to revenue.

Week 4 and beyond

  • Paid launches, small, feed only, five to eight creatives.
  • Call intelligence, then the creative defect gate, then the competitor monitor.
  • WF-08 Commercial Intake plus the named partner list.
Already built, do not rebuild

Beacon with UTM, click id and visitor id capture. Lead store and analytics dashboard. Nightly SEO bot with propose, green light, prebuilt promote. 153 page SEO property and AEO pages. GMB post library. Legal base with the registration published and TCPA consent under every form. None of it needs rebuilding. It needs wiring into the pipeline in section 04.

12 / The numbers you have to supply

Five inputs. Without them this is a machine with no gauge.

Everything above is structural and holds regardless of the figures. What it cannot do is tell you whether to scale or stop. That takes five numbers that only Larchmont has, and none of them are in this document because inventing them would be worse than leaving them blank.

InputValueWho has it
Average job value, residentialUNKNOWNEddie, last 20 invoices
Gross margin, blendedUNKNOWNEddie
Close rate, quote to signedUNKNOWNProduced by this system after 30 quotes
Current inbound call volumeUNKNOWNPhone records, this month
Verified Google review countUNKNOWNGBP, today

Once the first two exist the governing question stops being cost per lead and becomes a single sentence: how many jobs does one month of spend have to close to pay for itself. In the reference account that answer was one job in seven, and it had nothing to do with the $25.24 cost per lead everyone was staring at.

Cost per lead is the number that is easy to get. Close rate is the number that decides.