Apple Off Road — Retooling Specification
Goal (owner's words): outperform all competition within 100 miles across copy, schema, site speed & page vitals, tracking, design, and marketing fundamentals.
Version: 1.0 · 2026-07-16
Ground truth inputs: spec/research/competitors.md (verified 15-shop recon), spec/research/baseline.md (our measured baseline), project CLAUDE.md.
Scope guard: This is a conversion/marketing/tech retool of the live Night Shop design. Not a redesign. Ecommerce stays out of scope — the site's one job is quote requests for installation and build work.
1. Executive summary & competitive thesis
Current state
The new Night Shop site is technically excellent (17.5KB homepage, 47ms TTFB, static Cloudflare Pages, LocalBusiness schema live) but commercially inert: the quote form doesn't submit, there is zero tracking, one unverifiable testimonial, no pricing, no financing, no fitment tooling, and no local-SEO footprint beyond one Elkton page. It's a fast brochure.
The thesis
Nobody within 100 miles has assembled the full stack. The three real threats each hold one piece:
- No Limit (Baltimore, ~45mi) owns brand + social proof (466 reviews/4.8, celebrity builds, text-to-quote, financing, visualizer) — but is wheel/tire-led and 45 miles away.
- Rhino Linings of Delaware (Newark, ~13mi) is nearest with the deepest suspension brand roster — but off-road is diluted among bedliners, tint, and accessories.
- Mount Zion Offroad (Dover PA, ~60mi) has the biggest dedicated-shop review base (4.8/479) — but thin conversion tooling and it's an hour away.
Our play: be the only shop in the radius that combines (a) a national-tier website — fitment finder, multi-step quote flow, live review proof, published install pricing, financing math — with (b) a 10-minutes-from-I-95 Elkton install bay. The national leaders (Custom Offsets, ExtremeTerrain, TrailBuilt) prove buyers respond to fitment tools and financing — but they can't install your truck. The locals can install — but their websites are quote-only black boxes (one, Trick Trucks, with documented over-quoting complaints). We take the national playbook and bolt it to a local lift.
Three wedges, each grounded in the recon's 12 gaps:
- Transparency wedge — published "from $X installed" tiers + written re-torque guarantee, against a field that is 100% quote-only (gap #6, #12). Directly weaponizes Trick Trucks' $1,600-unneeded-lift complaint.
- Tooling wedge — fitment finder + gated quote flow + financing "$X/mo" (gaps #1, #2, #3). No local shop has any of the three together; only Intercourse (45mi, dated CMS) has booking + Synchrony.
- Proof wedge — live Google review bar + filterable real-build gallery (gaps #4, #5). Harford Tire has 5.0/353 and buries it on SureCritic; we surface ours on every page, live.
Measurable definition of "outperform within 100 miles"
We win when, verified against the named competitors:
| Dimension | Test | Beats |
|---|---|---|
| Speed | Mobile PSI performance ≥ 95, LCP ≤ 1.8s p75 | Every competitor (Wix/Shopify/tire-CMS stacks) |
| Social proof | Live ★/count review bar on every page + review schema | Harford (buried SureCritic), No Limit (static) |
| Conversion tooling | Fitment finder + 4-step quote flow + financing $/mo live | Intercourse (booking only), No Limit (text-to-quote only) |
| Pricing | ≥ 6 "from $X installed" prices published | Entire field (100% quote-only) |
| Schema | Service + FAQ + Review + Breadcrumb graph, 0 errors in Rich Results Test | All locals (LocalBusiness-or-nothing) |
| Tracking | quote_submit conversion measured end-to-end, GA4+Ads wired | Unknowable for them; non-negotiable for us |
| Local SEO | Rank page-1 for "lift kit installation {Elkton, Newark DE, Bel Air}" | East Coast Off Road (no web presence), Rhino (diluted) |
Acceptance criteria (section 1)
- Every section below ships with its own criteria met; the §12 scorecard is the roll-up.
- The homepage's primary CTA path (hero → quote flow → submitted quote → email in inbox → GA4 conversion) works end-to-end on a phone.
2. Marketing fundamentals — the 4 P's
2.1 Product — package the install work
Current state: Services exist as SEO-ish pages (lift-kit installation, wheel-and-tire packages, LED kits, suspension, parts) with no packaging, no tiers, no named offers. "Kits / Wheels / Lights / Merch" tiles all dead-end at the same generic form.
Target: A named, tiered service menu a buyer can self-select from — the way Custom Offsets productizes fitment, applied to installs. Nobody local packages installs; Rhino sells parts, No Limit sells "custom," tire shops sell tires.
Concrete changes:
- Define six core install products, each with its own page section, price floor, and quote-flow preselect:
- Level It — leveling kit, installed + alignment. Entry product; highest volume intent.
- Lift It — 2–3.5" lift kit, installed + alignment.
- Big Lift — 4–6" lift kit, installed + alignment + driveline check.
- Wheels & Tires — package: wheels + tires + mount/balance + TPMS + lug re-torque.
- Light It Up — LED bars/pods/whips, wired on a relay/switch, installed clean.
- The Full Build — lift + wheels/tires + lighting + accessories, staged as one work order.
- Every product block states: what's included, typical bay time ("in the morning, out by close" where true — owner confirms), the "from $X installed" floor (§2.2), and a Start Your Build button that opens the quote flow with that product preselected.
- Add custom fabrication as a distinct capability page (bumpers, sliders, wiring, one-offs) — this is the "we're a real shop, not an installer of boxes" differentiator vs. tire chains (Delaware Tire, Bay Area Point S, Sports Car Tire).
- The "Merch" tile leaves the homepage product grid (ecommerce is dead; it dilutes the install story). Merch link can survive in the footer if the owner wants it, pointed wherever merch actually lives.
Acceptance criteria:
- 6 named packages live on
/and on their service pages, each with included-items list and preselecting quote-flow CTA. - Custom fab has a dedicated page with ≥ 3 real fab examples (photos).
- Merch removed from the homepage conversion path.
2.2 Price — the transparent-pricing wedge
Current state: Zero prices anywhere. Old store had prices missing on a third of items; dead now.
Target: The only shop in 100 miles publishing install pricing. The recon is unambiguous: the field is 100% quote-only (gap #6), and the segment carries trust damage — Trick Trucks has a documented complaint of quoting a $1,600 lift the customer didn't need. Honest published floors turn that into our headline.
Concrete changes:
- Publish "from $X installed" floors on the six packages.
[OWNER: real numbers required — see §11 dependencies. Structure below, prices are placeholders to be replaced, never launched as-is.]- Level It — from $___ installed (kit + labor + alignment)
- Lift It (2–3.5") — from $___ installed
- Big Lift (4–6") — from $___ installed
- Wheels & Tires — packages from $___ mounted, balanced, TPMS'd
- Light It Up — from $___ installed & wired
- The Full Build — quoted, with a published example build sheet ("2021 F-150: 3.5" RC lift + 35s on Fuel wheels + 40" bar = $___ installed")
- Pair every price with the honesty frame: "Quoted before we wrench. The price we quote is the price you pay — no mid-job upsells." (Direct counter-position to the over-quoting failure mode in the field.)
- Each price row shows the financing translation "or ~$__/mo" once financing is live (§10).
- Prices live in one data file (
src/data/pricing.ts) so the owner can update via a single edit; every surface (homepage, service pages, quote flow) reads from it.
Acceptance criteria:
- ≥ 6 real published price floors live (owner-supplied, not placeholders).
- One example full-build sheet with an itemized real total.
- Site-wide grep: zero
$___placeholders indist/. - Pricing sourced from a single data file.
2.3 Place — Elkton + the Mid-Atlantic footprint
Current state: One location, correctly NAP'd in schema, "behind Apple Mitsubishi" callout, one legacy truck-lifts-elkton page. No presence targeting the towns competitors actually sit in.
Target: Own the I-95 corridor gap. Elkton sits between Rhino/Delaware Tire's Newark DE turf (13–15mi) and Harford/Bay Area/East Coast Off Road's Harford County turf (28–30mi) — and East Coast Off Road, the closest dedicated off-road installer, has essentially no web presence (recon: "beatable on nearly every search").
Concrete changes:
- City-level service pages (full spec in §9): Elkton/Cecil County, Newark DE, Bel Air MD, Wilmington DE, Middletown DE, Aberdeen/Havre de Grace, Rising Sun/North East.
- Homepage and every city page state drive-time proximity ("10 minutes from Newark, right off Pulaski Hwy/US-40, 5 minutes from I-95 exit 109") — the recon shows distance is the field's weakness (Mount Zion 60mi, No Limit 45mi).
- "Behind Apple Mitsubishi" stays prominent (real wayfinding + implies dealership-grade facility, insurance, and alignment equipment — the exact claim Duffy's trades on).
- GBP optimization (§9.3) is the other half of Place.
Acceptance criteria: rolled into §9.
2.4 Promotion — offers, financing, seasonal
Current state: No offers, no financing, no seasonal anything. One county-fair-raffle page (legacy).
Target: Only Intercourse and No Limit surface financing (gap #2); no local shop runs a structured seasonal calendar. We do both.
Concrete changes:
- Financing front-and-center (§10): "$X/mo" under every package,
/financingpage, nav presence. - Standing offer: "Free fitment check + written quote — 30 minutes, no obligation." Costs nothing, gets trucks into the lot, feeds the quote pipeline.
- Seasonal calendar (4 promos/year, one data-file toggle each, homepage banner slot):
- Spring (Mar–May): "Mud season prep" — lift + tire packages.
- Summer (Jun–Aug): "Beach & trail ready" — wheels/tires, lighting.
- Fall (Sep–Nov): "Hunting season" — lighting packages, leveling.
- Winter (Dec–Feb): "Build-season layaway/financing" — book the winter build, 0-money-down financing angle.
- Promo banner is a single
PromoBanner.astrocomponent driven bysrc/data/promo.ts(start/end dates, copy, CTA target) so switching seasons is a one-line change and never a redesign. - Every promo carries a UTM-tagged CTA into the quote flow so §8 can attribute it.
Acceptance criteria:
- Financing visible on homepage + all package rows (once program live).
- Promo banner component live with one active seasonal offer at launch.
- Promo → quote submissions attributable in GA4 (campaign param present on quote_submit).
3. Social proof
Current state: One anonymous-quality testimonial ("Tim Jones, Rockville MD") with no source. Six-photo static build strip with captions. "Certified Rough Country dealer" appears as text in the footer/chips. No review count, no stars, no schema, no guarantee. Meanwhile Harford Tire holds 5.0/353, Mount Zion 4.8/479, No Limit 4.8/466 — and per the recon, all of them fragment or bury it (gap #5).
Target: The only site in the radius showing a live "4.x★ · N Google reviews" bar on every page, backed by schema, real trucks, and a written guarantee. We don't need to out-count Mount Zion's 479 on day one — we need to out-display everyone.
Concrete changes:
- Live Google reviews bar — reviews-service pattern. Onboard Apple Off Road as a tenant of the existing
spm-reviewsCF Worker (the same system live on Apple Honda's homepage:GET /v1/{slug}/reviewsJSON +/v1/{slug}/embed, KV-cached 48h, daily cron, GBP API via the analytics service account). New tenant slugapple-offroad.[OWNER: confirm Apple Off Road's own GBP listing exists (separate from Apple Mitsubishi) and grant manager access — §11.]- Placement: slim bar directly under the hero H1 ("★ 4.x · N Google reviews · Elkton, MD" → links to the Google reviews panel), and a fuller 3-review rotating strip replacing the current single testimonial band (Bay 03).
- Fails soft: if the Worker is unreachable, the bar renders nothing (no layout shift — reserve zero height, it's an enhancement).
- Real testimonials. Replace "Tim Jones" with 3 curated verbatim Google reviews (name, star rating, relative date) pulled from the same feed — verifiable proof, not marketing copy.
- Build gallery upgrade (
/builds-gallery/): from a 6-photo strip to a filterable gallery of real customer trucks. Each entry is a markdown/JSON record: photo(s), year/make/model, lift height, wheel/tire spec, work performed, optional before/after pair. Filters: vehicle make, work type (lift/wheels/lighting/fab). Only No Limit does this locally (gap #4); ours adds the spec sheet per truck, which nobody does.- Seed content: the 6 existing build photos + recover the 4 dead homepage slider images from the Apple Off Road Facebook page (filenames are FB exports — Meta Graph API,
[OWNER/us: FB page access]), then a standing intake habit: 2 photos + spec per completed build.
- Seed content: the 6 existing build photos + recover the 4 dead homepage slider images from the Apple Off Road Facebook page (filenames are FB exports — Meta Graph API,
- Rough Country certified-dealer proof block: dedicated homepage module + the existing
/apple-offroad-is-a-rough-country-performance-dealerpage tightened — RC badge, what "certified" means for the customer (trained install, warranty honored locally, genuine parts). Beats Duffy's single-brand claim by pairing it with the multi-brand wall (§4.4). - The written guarantee (gap #12): "The Apple Off Road Install Guarantee — torque-spec'd, alignment-checked, road-tested. Free 500-mile re-torque on every lift and wheel install. If we installed it, we stand behind it — in writing." Renders as a homepage module +
/guaranteepage + one line inside the quote flow. This attacks the segment's documented failure mode (sloppy installs — the recon cites Harford's "missing parts" complaint) and no competitor publishes one.[OWNER: approve terms — this is a real service commitment.]
Acceptance criteria:
- Live review bar renders real GBP data on every page; value matches Google Maps within the 48h cache window.
- Homepage testimonial band shows ≥ 3 named, dated, real Google reviews.
- Builds gallery: ≥ 10 real builds with vehicle + spec metadata, filters functional on mobile.
- Guarantee live in 3 places (homepage, /guarantee, quote flow) with owner-approved terms.
- Review count baseline recorded at launch; §9.3 review-generation loop targets +8/month.
4. UI/UX & design — the conversion architecture
Current state: Night Shop is a strong aesthetic (near-black, zuume-edge display type, brand red #D83135, "Bay 01/02/03" stencil rhythm) with a weak conversion skeleton: hero → static 5-field form; every CTA on the site anchors to #quote; the tiles say "Shop Online — Ship to Store" (dead concept); the brand marquee is decorative; nav has no CTA differentiation.
Target: Keep the Night Shop skin, rebuild the spine: hero → Start Your Build (gated multi-step) → fitment finder → proof → book. The pattern to beat is No Limit's text-to-quote (low friction but zero qualification) and Intercourse's online booking (functional but dated) — we combine qualification AND booking in one flow, styled like a work order, which is already Night Shop's visual metaphor.
4.1 The "Start Your Build" quote flow (gap #3) — the site's core mechanism
Replace the static hero form with a 4-step gated flow. Vanilla TS (no framework), one island, state in memory + sessionStorage (survives accidental nav), renders inside the existing ns__quote work-order card.
- Step 1 — Your rig: Year / Make / Model (select inputs fed from the fitment dataset §4.2) + trim/notes free text. This is the hero-visible step — a 3-select + button card, lower friction than the current 5 required fields.
- Step 2 — The goal: multi-select cards w/ icons: Leveling · Lift · Wheels & Tires · Lighting · Full build · Custom fab · "Not sure — help me spec it." (Preselected when entered from a package CTA.)
- Step 3 — Budget & timing: budget band (radio: <$1.5K / $1.5–3K / $3–6K / $6K+ / "quote me") + timing (ASAP / this month / this season / researching) + financing interest (yes/no → feeds §10).
- Step 4 — Contact & book: name, phone, email, preferred contact (call/text/email), preferred drop-off week (date-ish select, not a hard calendar in v1), honeypot. Submit.
- Progress indicator styled as work-order stages ("SPEC → GOAL → BUDGET → BOOK"). Back navigation preserved. Each step advance fires
quote_step(§8). - Submission: POST to
/api/quoteCF Pages Function → SendGrid →OFFROAD@appleelkton.com(+ BCC Sean during testing) with a formatted work-order email containing every field; auto-response to the customer ("We'll call you within one business day"[OWNER: confirm SLA]). Same CF-Function→SendGrid pattern as bailey-leadership/frontline-gs. Turnstile on submit (invisible mode). - Thank-you state routes to
/thank-you-for-contacting-apple-off-road(exists) — rebuilt to show: what happens next (3 steps), phone number, and the guarantee. This page is the GA4 conversion surface. - The contact page's simple form (ContactBody/QuoteForm) stays for general inquiries but posts to the same Function with
form_name=contact.
4.2 The vehicle FITMENT FINDER (gap #1) — the #1 leapfrog
No shop within 100 miles has one; Custom Offsets built a national business on theirs. Ours is scoped to what an install shop needs: "What fits my truck, what does it clear, what does it cost installed?"
- Data: static JSON dataset (
src/data/fitment/*.json), compiled from the Rough Country application guide we're certified on (plus wheel-brand fitment where easy). Per vehicle (year-range/make/model): available lift/level options (height, product line), max tire size stock vs. at each lift height, notes (e.g., "requires knuckle kit"), and the matching package price floor frompricing.ts. - Scope v1: top 25 platforms by local demand — F-150, F-250/350, Silverado/Sierra 1500 & HD, Ram 1500/2500, Tacoma, Tundra, 4Runner, Wrangler JK/JL, Gladiator, Bronco, Ranger, Colorado/Canyon, Frontier, Titan, Jeep XJ/TJ.
[OWNER: sanity-check the platform list against what actually rolls into the bay.]Dataset is additive — a platform is one JSON file. - UX:
/fitment/page + embedded module on lift/wheel service pages. Three selects → instant results card: "Your 2021 F-150 — stock clears up to 33s. With our 3.5" Lift It package (from $X installed): 35s. With the 6" Big Lift (from $Y): 37s." → CTA "Quote this exact setup" → enters the quote flow at Step 2 with vehicle + implied goal prefilled. - Every use fires
fitment_usewith vehicle params (§8). - Client-side only, zero network calls, works offline once loaded. Budget: ≤ 15KB gz JS + lazy-loaded JSON per make.
- Honesty rule: the finder shows ranges from the manufacturer's application guide and says "final fitment confirmed at your free fitment check" — it's a qualifier and appointment-driver, not a promise.
4.3 Homepage information architecture (revised bay order)
- Hero — H1 (§5) + live review bar + quote flow Step 1 card. Keep the wheels hero image, add fetchpriority (already present).
- Trust chips row — Certified Rough Country Dealer · Free 500-mi re-torque · Financing available · Behind Apple Mitsubishi.
- Packages (Bay 02) — the 6 products with "from $X installed / ~$Y/mo" (replaces "Shop Online — Ship to Store" tiles; kills the dead ecommerce framing).
- Fitment finder teaser (Bay 03) — "What fits your truck?" inline 3-select module.
- Proof (Bay 04) — 3 live Google reviews + link to all.
- Builds (Bay 05) — existing gallery grid, now linking into the filterable gallery.
- Guarantee + RC certification (Bay 06) — the two trust modules.
- HQ / find us (Bay 07) — existing Shop Headquarters section (map embed optional, static image preferred for CWV).
- Closer — "You're Up Next." (keep — it's good) → quote flow.
4.4 Functional brand wall (gap #9)
The marquee stays visually, but every logo becomes a link: wheel brands → builds gallery filtered to that brand (or the wheel-tire service page anchor), Rough Country → the certified-dealer page. Add title/aria-label per link. Rhino's brand roster is a text list; No Limit's is decorative — ours becomes navigation.
4.5 Mobile-first & accessibility
- All flows designed at 390px first; quote flow steps fit one viewport with the keyboard open (test iPhone SE + mid-range Android).
- Sticky mobile action bar (mobile only, appears after hero scroll):
[📞 Call][Start Your Build]. Buyers search on phones (gap #7) and the phone number is currently desktop-nav-only styling. - Nav: current design has no mobile menu spec'd in this doc's scope — verify hamburger/disclosure exists and is operable via keyboard; add if missing.
- WCAG 2.1 AA: color contrast on brand-red-on-black checked (≥ 4.5:1 for text — the red #D83135 on near-black passes for large text only; body-size red text gets a lighter tint token), visible focus rings on all interactive elements, quote-flow steps announced via
aria-live, all form fields labeled (already good), touch targets ≥ 44px. - Keep the no-reveal-animation invariant from CLAUDE.md — content renders immediately, always. Any new module (review bar, fitment results) must render without JS-gated visibility.
Acceptance criteria (section 4):
- Quote flow: 4 steps, mobile-complete in < 60s by a first-time tester, submits to SendGrid, fires all §8 events, Turnstile-protected.
- Fitment finder live with ≥ 25 platforms; select→result < 100ms; prefills quote flow.
- Homepage restructured to the 9-bay order; zero "Shop Online" framing remains.
- Brand wall: 100% of logos are functional links.
- Sticky mobile call/build bar live.
- Axe/Lighthouse a11y score ≥ 95 on
/, quote flow, fitment page; keyboard-only run-through of the full quote flow passes. - Interceptor visual verification on real Chrome (mobile + desktop) for every changed page before deploy — per house rules.
5. Copy
Current state: Serviceable but generic ("Premier… Parts & Installation Center", "Contact us today for a free quote"). No pricing language, no guarantee language, no local specificity beyond Elkton, testimonial reads fabricated.
Target voice — three notes struck everywhere:
- Installation authority. "Fitted and installed in our own bays, not shipped in a box" (keep — best line on the site). We are wrenches, not a warehouse.
- Honest pricing. "Quoted before we wrench. No mid-job upsells." — the anti-Trick-Trucks position, stated plainly, never naming competitors.
- Elkton local. Route numbers, drive times, "behind Apple Mitsubishi," Cecil County pride. Written like the owner talks, not like an agency.
Headline formulas (use, don't decorate):
- Service pages:
{Service}, Installed in Elkton — from ${X}(benefit + place + price). - City pages:
Lift Kit Installation Near {City} — {N} Minutes from {Landmark/Route}. - Proof modules: number-led —
★ 4.x from N Google reviews,500-mile re-torque, free, every install.
CTA language: One primary verb system, sitewide: "Start Your Build" (flow entry) / "Quote this setup" (fitment finder) / "Call the shop — 410-398-1600" (secondary everywhere). Kill "Request My Quote"/"Get a quote →" variants; consistency is the conversion feature.
Page-by-page direction:
| Page | H1 / direction |
|---|---|
/ |
H1: "Lift Kits, Wheels & Tires — Installed Right, in Elkton." Sub: "Certified Rough Country dealer. Published install pricing. Free 500-mile re-torque on every build." Hero keeps the eyebrow-stencil styling. |
| Lift installation | "Lift & Leveling Kits, Installed — from $X." What's included, the 3 lift tiers, fitment module, alignment-included proof, FAQ block (feeds §6 schema). |
| Wheels & tires | "Wheel & Tire Packages, Mounted, Balanced, Done — from $X." Brand wall functional links land here. |
| LED / lighting | "LED Lighting, Wired Like the Factory Should Have." Relay/switch/loom quality angle — attacks box-store butcher jobs. |
| Suspension | Merge story with lift page; keep URL for SEO, cross-link hard. |
| Builds gallery | Spec-sheet captions: "2022 Gladiator — 3.5" RC lift, 37s on Fuel, 40" bar." Let the trucks talk. |
| RC dealer page | "What a Certified Rough Country Dealer Means for Your Truck" — warranty honored here, trained installs, genuine parts. |
/guarantee |
The full guarantee text + why it exists ("lifts fail at the torque wrench, not the box"). |
/financing |
"$X/mo" math, how it works in 3 steps, apply CTA (§10). |
| City pages | §9 template — unique local intro, never spun boilerplate. |
| About | The shop's story + the Apple Auto Group backing (real facility, real alignment racks, been here — dealership-grade infrastructure is a differentiator vs. garage operations). |
| Thank-you | "Work order received." What happens next in 3 steps + guarantee restated. |
Trust/guarantee language (canonical, use verbatim once owner approves):
"Every install leaves torque-spec'd, alignment-checked, and road-tested — and we'll re-torque your lift or wheels free at 500 miles. The price we quote before we start is the price you pay. That's in writing."
Acceptance criteria:
- All key pages carry the new H1s; grep confirms zero "Shop Online"/"Ship to Store" strings.
- CTA audit: only the three sanctioned CTA phrasings appear.
- Price and guarantee language present on every service page.
- Owner has read and approved the guarantee + pricing copy verbatim (it's a business commitment).
- No em-dash-stuffed AI-slop tells; copy read aloud passes the "does the owner talk like this" test.
6. Schema / structured data
Current state: Solid spine — LocalBusiness (AutoRepair/Store) + WebSite + PostalAddress + GeoCoordinates emitted on every page from NightShop.astro. Nothing else. Baseline notes: no Service, FAQ, Review, or Breadcrumb schema.
Target: The most complete structured-data graph of any shop in the radius (gap #11: "none of the locals earn star snippets"). Honest framing: Google's self-serving-review policy means stars on our own LocalBusiness snippet are not guaranteed, and FAQ rich results are restricted since 2023 — so the spec targets (a) whatever rich results remain earnable, and (b) the durable win: entity completeness for AI answers. The old site already gets chatgpt.com referrals (CLAUDE.md); a complete Service/FAQ/Review graph is exactly what AI answer engines ingest, and zero competitors emit one.
Concrete changes (all additive to the existing @graph in NightShop.astro, keyed off a per-page schemaExtras prop):
Servicenodes — one per install product (6), each:@type: Service,serviceType,provider: {@id: #business},areaServed(city list),offers: {@type: Offer, priceSpecification: {@type: PriceSpecification, minPrice, priceCurrency: USD}}reflecting the published floors. Emitted on the matching service page + referenced from#business.hasOfferCatalog.FAQPage— on lift-install, wheels-tires, financing, and each city page: 5–8 real questions with the on-page answers (§9.2 content doubles as the source). On-page text and schema must match verbatim.AggregateRating+Review— attachaggregateRating(live value from the reviews-service feed, injected at build or via the embed) to#business, plus up to 3Reviewnodes matching the displayed testimonials (author, datePublished, reviewRating). Values must always equal what the page visibly shows — schema mirrors the live bar, never invents.BreadcrumbList— on every non-home page (Home → Section → Page), generated from the path in the layout.sameAson#business— Facebook, Instagram, YouTube, the GBP listing URL, and appleelkton.com (parent-dealer entity linkage helps local trust).openingHoursSpecification—[OWNER: confirm real hours]— required for a complete local entity, currently absent.SITEconstant fix: schema currently hardcodeshttps://apple-offroad.pages.dev. Move to an env-driven site URL so cutover toappleoffroad.comflips every@id/urlin one place.
Acceptance criteria:
- Google Rich Results Test: 0 errors, 0 warnings on
/, one service page, one city page,/financing. - Schema.org validator: full graph parses; every
@idreference resolves. - AggregateRating value == on-page review bar value (automated check in the build or validator).
- Search Console (post-cutover): Service/FAQ/Breadcrumb enhancements detected with 0 errors within 30 days.
- SITESTR validator still exits 0.
7. Site load speed & Core Web Vitals
Current state (our biggest structural lead): homepage 17.5KB, TTFB 47ms, full load 73ms, static Astro on CF Pages, zero JS. Competitors run Wix (No Limit), Shopify (Rhino), and dated tire-CMS stacks (gap #7). The retool ADDS JS (quote flow, fitment finder, review bar, GTM) — this section is about not losing the lead while adding capability.
Budgets (p75 mobile, enforced):
| Metric | Budget | Notes |
|---|---|---|
| LCP | ≤ 1.8s (lab ≤ 1.5s) | Hero image is LCP; keep fetchpriority="high" + preload |
| CLS | ≤ 0.05 | Review bar & promo banner get reserved height; fonts size-adjusted |
| INP | ≤ 200ms | Quote flow interactions must respond < 100ms lab |
| PSI performance | ≥ 95 mobile | On /, lift page, fitment page |
| First-party JS | ≤ 50KB gz total/page | Quote flow ≤ 20KB, fitment ≤ 15KB, misc ≤ 15KB |
| Page weight | ≤ 350KB gz above-the-fold request set on / |
Concrete changes:
- Images: hero + all build/gallery images through Astro's image pipeline → AVIF with WebP fallback, responsive
srcset, explicit dimensions (mostly present),loading="lazy"below fold (present). Recompress the legacy/images/**set used by Night Shop pages; brand PNG logos → single sprite or optimized WebPs (10 × 400×150 PNGs is silent weight). - Fonts: (a) Self-host the two Barlow families (subset, woff2) — removes fonts.googleapis.com entirely. (b) zuume-edge must stay on Adobe Typekit (license) — keep
preconnectto use.typekit.net, load the kit CSS async (print-media swap or equivalent), define asize-adjusted local fallback stack for the display face so CLS stays ≤ 0.05 during swap. (c)[OWNER/us: add appleoffroad.com to the Adobe kit allowlist before cutover — already flagged in CLAUDE.md.] - JS discipline: quote flow + fitment finder + sticky bar are vanilla TS Astro islands; no framework runtime; no jQuery ever returns. GTM is the single third-party script (§8) — loaded after first interaction or 3s idle, whichever first, never render-blocking.
- Review bar: server-render at build time from the reviews-service JSON (site rebuilds daily via CF deploy hook + scheduled GitHub Action — same blog-date-gate pattern used elsewhere) OR client-fetch with reserved height. Build-time preferred: zero runtime request, zero CLS, data at most ~24h + 48h-cache stale, fine for a review count.
- No new render-blocking anything. CSS stays the single
night-shop.css; audit it for unused legacy selectors after the homepage restructure. - Verification harness:
bun run vitalsscript → Lighthouse CI (or keyed PSI API) against/, lift page,/fitment/, one city page; budgets asserted in JSON; run before every deploy alongside the SITESTR validator. Post-launch: CrUX field data checked monthly once traffic qualifies. - Competitive receipts: capture PSI scores for nolimitbmore.com, Rhino Linings DE, Mount Zion, Harford Tire at launch — the §12 scorecard needs the side-by-side.
Acceptance criteria:
- All budget-table numbers met on lab runs (Lighthouse CI, mobile emulation, 4x throttle).
- Mobile PSI ≥ 95 on
/, lift page, fitment page — screenshotted and dated. - PSI side-by-side vs. the 4 named competitors captured; we lead on every metric.
- CLS ≤ 0.05 with Typekit cold-cache (verify with font-blocked throttled run).
-
bun run vitalswired into the deploy script and failing the deploy on budget breach.
8. Tracking & measurement
Current state: ZERO tracking on the new site — no GA4, no GTM, no Ads. (Old WP site: GA4 G-LJQPZE7MVG, GTM GTM-MX4GLTX, Ads AW-10959762811 — polluted by ~81% bot traffic; the old property stays as historical reference only.)
Target: Fresh, clean instrumentation where quote_submit is the money event, wired GA4 → Ads → dashboard, following the house GTM-canonical-events pattern (dashboards read GA4 by exact event name).
Concrete changes:
- Fresh containers: new GA4 property ("Apple Off Road — appleoffroad.com") + new web stream, new GTM container. Do NOT carry
G-LJQPZE7MVG/GTM-MX4GLTX— clean baseline, no bot legacy. Link the existing Google AdsAW-10959762811(it's the account runninggoogle/cpctoday) — import the GA4quote_submitconversion. Grantpai-analytics-reader@paidoc-485820on GA4 + GTM (standard SA pattern). - Event dictionary (exact names — the dashboard contract):
| Event | Fires when | Params |
|---|---|---|
quote_start |
Step 1 first interaction | entry_point (hero/package/fitment/city-page) |
quote_step |
each step advance | step (1–4), goal, budget_band |
quote_submit |
KEY CONVERSION — successful POST | goal, budget_band, financing_interest, vehicle_make |
phone_click |
any tel: link |
placement (nav/hero/sticky/footer/city) |
fitment_use |
finder returns a result | vehicle_year, vehicle_make, vehicle_model |
financing_click |
financing CTA/apply | placement |
review_bar_click |
review bar → Google | — |
form_submit (contact) |
general contact form | form_name |
All fired via dataLayer.push from first-party code; GTM maps → GA4 tags. vehicle_make, goal, budget_band, entry_point, placement registered as event-scoped custom dimensions. GA4 Enhanced Measurement form-interaction events disabled (house rule — only named events flow).
3. Conversions: quote_submit = primary (GA4 key event + Ads conversion). phone_click = secondary. Thank-you page carries no separate pageview-goal — event-based only (static-site safe).
4. Server-side integrity: the /api/quote CF Function logs each submission (timestamp, goal, source) to the function's own storage/email trail so form volume can be reconciled against GA4 monthly (catches blocked-JS undercount).
5. Consent: simple non-blocking notice + Consent Mode v2 defaults (analytics_storage granted, ad_storage denied until interaction) — MD/DE have no CCPA-style analytics-consent mandate for a shop this size, but Ads remarketing later requires the consent signals to exist. Keep it lightweight; no cookie-wall.
6. Dashboard: onboard as a tenant of the multi-tenant dealer-analytics template (Apple Honda/Ford pattern — one YAML + GA4 viewer grant), KPIs recast: Quote Requests, Quote Starts→Submits funnel, Phone Clicks, Fitment Uses, Financing Interest %, Top Vehicles Quoted, Geo (Cecil/New Castle/Harford counties), Source Mix. Serve at analytics.appleoffroad.com post-cutover (house convention), CF Access-gated.
7. Bot hygiene from day 1: GA4 internal-traffic rule for shop/office IPs [OWNER: shop IP]; the datacenter-geo "suspected bot" labeling pattern from dealer-analytics applies.
Acceptance criteria:
- GTM preview: all 8 events fire with correct params through the full quote flow on mobile.
-
quote_submitvisible in GA4 Realtime AND as an Ads conversion (test conversion recorded). - GA4 DebugView clean — no Enhanced Measurement form noise, no unnamed events.
- Dashboard tenant live showing the quote funnel from real GA4 data.
- Monthly reconciliation: SendGrid-delivered quote emails vs. GA4
quote_submitwithin 10%.
9. Local SEO & content
Current state: One Elkton-targeted legacy page (truck-lifts-elkton), decent titles/descriptions, no city pages, no blog, no GBP program. Real organic traffic is small but exceptional quality (761 sessions/90d at 988s avg engagement — these are researchers ready to spend).
Target: Own every "{service} near {city}" query in the 30-mile core. The recon says East Coast Off Road (closest dedicated competitor) is "beatable on nearly every search," Rhino's off-road signal is diluted, and zero local shops produce content (gap #10).
9.1 City-level service pages (gap #8)
- Wave 1 (launch):
/lift-kits-elkton-md/(rebuild the legacy page into the template),/lift-kits-newark-de/,/lift-kits-bel-air-md/. These strike Rhino/Delaware Tire's home turf and the Harford County cluster (Harford Tire, Bay Area, East Coast Off Road, Duffy's) respectively. - Wave 2: Wilmington DE, Middletown DE, Aberdeen–Havre de Grace MD, Rising Sun/North East (Cecil), plus a Cecil County hub page.
- Template (every page unique, never spun): H1 per §5 formula → drive-time/route intro written for that town → the 6 packages with prices → fitment module embed → 3 live reviews → city-specific FAQ (5 Qs: drive time, do you serve X, alignment included, financing, DE-tax angle where honest and applicable
[OWNER: confirm any tax framing before publishing]) → quote flow CTA withentry_point=city-{slug}. - Schema: each page emits
Service(areaServed = that city) +FAQPage+BreadcrumbListper §6. - Internal linking: footer "Areas we serve" block + service pages link to their city variants.
9.2 Content engine (gap #10 — zero local competition)
- Cadence: 2 posts/month minimum, install-shop questions only — each post answers one buying question and ends in the fitment finder or quote flow. Launch set (write 4 before cutover):
- "How much lift do I need to run 35s? (F-150, Silverado, Ram, Tacoma, Wrangler)" — the fitment finder in prose.
- "Leveling kit vs. lift kit: which one your truck actually needs" — the honesty brand in action.
- "What a lift kit really costs installed (we publish our prices)" — the wedge, as content.
- "35s vs. 37s: clearance, gearing, and what it does to your ride"
- Backlog: "Is a lifted truck street-legal in Maryland/Delaware? (researched, sourced)", "Why alignment after a lift is non-negotiable", "Wheel offset explained in 5 minutes", seasonal prep posts matching §2.4.
- YouTube (P2): install timelapses + before/after walkarounds shot on a phone in the bay; embed via lite-youtube pattern (already used in legacy build — zero CWV cost). Each video pairs with a post.
[OWNER: someone films 2 minutes per build.] - Blog on Astro content collections (
src/content/blog/), Article schema, author = the shop.
9.3 Google Business Profile
[OWNER-GATED]Confirm/claim the Apple Off Road GBP listing (distinct from Apple Mitsubishi), grant manager access. Then: category "Auto parts store" + "Truck repair shop"-class secondaries as available; services list mirroring the 6 packages; photos (20+ real build/bays); hours; booking link →/quote flow; UTM-tagged website links (housegbp_*convention).- GBP posts: reuse the dealer-poster GBP pipeline (live for Apple Mitsubishi since 2026-07-14) — 2 posts/week: one build spotlight (gallery photo + spec), one offer/seasonal. Same infrastructure, new location.
- Review-generation loop: every completed work order → SMS/email review ask with the direct Google review link
[OWNER: front-desk process — a printed QR card at pickup works]. Target +8 reviews/month; that's a 100-review year against a currently fragmented field.
Acceptance criteria:
- Wave-1 city pages live at launch with unique copy, schema valid, fitment embed working.
- 4 launch posts published; each ends in a tracked CTA.
- GBP: access secured, services + photos + booking link live, first 4 GBP posts published.
- Rank tracking configured (weekly) for "lift kit installation elkton md / newark de / bel air md", "wheel and tire packages near me" (from Elkton geo), "off road shop near me" — page-1 for the three city terms within 90 days of cutover is the target; movement documented monthly.
- Review velocity ≥ 8/month by 60 days post-launch.
10. Financing & conversion tooling
Current state: No financing anywhere. Recon: only Intercourse (Synchrony) and No Limit surface financing at all (gap #2) — and the national leaders put "$/mo" under everything.
Target: "$X/mo" under every package — making a $5,800 build feel like $180/mo — plus a quote→book flow that ends with a drop-off date, which nobody local offers end-to-end.
Concrete changes:
[OWNER-GATED]Sign up for financing program(s). Recommended order: Synchrony Car Care (proven in this exact segment by Intercourse; broad approval band) as primary; Affirm and/or Katapult as secondary/no-credit options if the volume justifies. Owner action: merchant applications. Nothing ships until at least one program is live — no fake financing UI.- Placement once live: (a) "or ~$X/mo" line under every package price (single
financingMonthly()helper computing frompricing.tsfloors using the program's real term/rate — labeled "estimate, on approved credit"); (b)/financingpage: how it works in 3 steps, apply link/prequal widget, FAQ + schema; (c) nav link + trust-chip; (d) quote-flow Step 3 "interested in financing?" already captures intent (§4.1) and routes hot leads. - All financing surfaces fire
financing_click(§8). - Quote→book→install-date flow: v1 (launch): quote flow Step 4 captures preferred drop-off week; the shop confirms by phone (matches how the shop actually schedules). v2 (P2): if volume proves it, a real slot-picker backed by a lightweight availability calendar the shop controls — do not build this before the phone-confirm loop is measured; Intercourse's booking widget shows the tool without operational discipline is just another form.
- Compliance: financing copy uses the program's approved merchant language verbatim; "estimate/OAC" disclaimers on every $/mo figure.
Acceptance criteria:
- ≥ 1 financing program live; apply path reachable in ≤ 2 taps from the homepage.
- $/mo appears with every published price, computed from one helper, disclaimed correctly.
-
financing_clickand Step-3 financing-interest data flowing to GA4/dashboard. - ≥ 1 test quote submitted with a preferred drop-off week, confirmed by the shop's real process.
11. Prioritized implementation plan
Sizing: S ≤ ½ day · M 1–2 days · L 3–5 days. ⚑ = owner-gated (can't ship without the owner).
P0 — must-have to launch (the site earns its keep)
| # | Item | Spec § | Size | Owner gate |
|---|---|---|---|---|
| 0.1 | /api/quote CF Function → SendGrid + Turnstile + auto-reply |
4.1 | M | ⚑ confirm recipient + reply SLA |
| 0.2 | Multi-step "Start Your Build" quote flow (4 steps, sessionStorage, events) | 4.1 | L | — |
| 0.3 | Fresh GA4 + GTM + event dictionary + Ads conversion import | 8 | M | ⚑ Ads account confirm (AW-10959762811) |
| 0.4 | Reviews-service tenant apple-offroad + live review bar + real testimonials |
3.1–3.2 | M | ⚑ GBP access/manager grant |
| 0.5 | Pricing data file + published "from $X installed" on packages/pages | 2.2 | M | ⚑ real prices |
| 0.6 | Homepage restructure to 9-bay order (packages, proof, guarantee modules) | 4.3 | L | — |
| 0.7 | Copy pass — H1s, CTAs, guarantee language, kill ecommerce framing | 5 | M | ⚑ approve guarantee verbatim |
| 0.8 | Schema extension: Service, FAQ, Review/AggregateRating, Breadcrumb, hours, sameAs, env SITE | 6 | M | ⚑ confirm hours |
| 0.9 | CWV hardening: image pipeline, self-host Barlow, async Typekit, budgets + bun run vitals gate |
7 | M | — |
| 0.10 | Sticky mobile call/build bar + a11y audit fixes | 4.5 | S | — |
| 0.11 | Wave-1 city pages (Elkton rebuild, Newark DE, Bel Air MD) | 9.1 | M | — |
| 0.12 | Cutover prep: Typekit domain allowlist, GoDaddy DNS plan, env-driven site URL | 7, 6 | S | ⚑ GoDaddy DNS access |
P1 — the leapfrogs (within ~30 days of launch)
| # | Item | Spec § | Size | Owner gate |
|---|---|---|---|---|
| 1.1 | Fitment finder — dataset (25 platforms) + UI + quote-flow prefill | 4.2 | L | ⚑ sanity-check platform list |
| 1.2 | Builds gallery v2 — filterable, spec-sheet metadata, ≥ 10 builds | 3.3 | M | ⚑ FB page access (photo recovery) + build intake habit |
| 1.3 | Financing live: program placement, /financing page, $/mo helper | 10 | M | ⚑ financing merchant signup |
| 1.4 | Functional brand wall | 4.4 | S | — |
| 1.5 | /guarantee page + quote-flow guarantee line |
3.5 | S | — |
| 1.6 | GBP optimization + dealer-poster GBP posting pipeline for the new location | 9.3 | M | ⚑ GBP access |
| 1.7 | Analytics dashboard tenant (dealer-analytics template) | 8.6 | M | — |
| 1.8 | 4 launch blog posts + content collections wiring | 9.2 | M | — |
| 1.9 | Promo banner component + first seasonal offer | 2.4 | S | ⚑ approve offer |
| 1.10 | Review-generation loop (QR card + ask process) | 9.3 | S | ⚑ front-desk process |
P2 — compounding (30–90 days)
| # | Item | Spec § | Size | Owner gate |
|---|---|---|---|---|
| 2.1 | Wave-2 city pages (Wilmington, Middletown, Aberdeen/HdG, Rising Sun/North East, Cecil hub) | 9.1 | M | — |
| 2.2 | Content cadence 2/mo + YouTube timelapse pipeline | 9.2 | ongoing | ⚑ bay filming |
| 2.3 | Booking v2 (real slot-picker) — only if funnel data justifies | 10.4 | L | ⚑ scheduling process |
| 2.4 | Fitment dataset expansion (platform long tail) + wheel-brand fitment | 4.2 | ongoing | — |
| 2.5 | Custom fab capability page + fab gallery | 2.1 | S | ⚑ fab photos |
| 2.6 | Competitor PSI/rank re-benchmark + scorecard refresh (quarterly) | 12 | S | — |
Consolidated owner-dependency list (nothing in ⚑ ships without these)
- Real install prices for the 6 packages + one example build sheet (P0.5 — the wedge doesn't exist without them).
- GBP access: confirm Apple Off Road's own listing; grant manager to the agency SA/account (P0.4, P1.6 — review bar + GBP program both hang on this).
- Financing merchant signup — Synchrony Car Care first; Affirm/Katapult optional (P1.3).
- GoDaddy DNS access for the appleoffroad.com cutover (zone is NOT in our Cloudflare) (P0.12).
- Adobe Typekit allowlist — add appleoffroad.com to kit
quz1sox(P0.12). - Guarantee terms approved verbatim — 500-mi re-torque + no-upsell pledge are real commitments (P0.7).
- Facebook page access to recover the 4 dead build photos + ongoing gallery photos (P1.2).
- Business hours for schema + GBP (P0.8).
- Quote-response SLA ("we call within one business day"?) + confirm OFFROAD@appleelkton.com is monitored (P0.1).
- Front-desk review-ask process (QR card at pickup) (P1.10).
- Shop/office IP for GA4 internal-traffic exclusion (P0.3).
- Seasonal offer approval + any tax-framing claims on DE pages (P1.9, 9.1).
12. Definition of done — how we prove we beat the field
The scorecard. Run at launch, re-run at 90 days, then quarterly. Every row names its yardstick from the recon.
| # | Metric | Target | Benchmark to beat | Verify with |
|---|---|---|---|---|
| 1 | Mobile PSI performance | ≥ 95; LCP ≤ 1.8s, CLS ≤ 0.05, INP ≤ 200ms | No Limit (Wix), Rhino (Shopify), Harford, Mount Zion — side-by-side PSI captured | Lighthouse CI + PSI API, dated screenshots |
| 2 | Live review display | Real-time ★/count bar on 100% of pages | Harford's 5.0/353 buried on SureCritic; No Limit static | Interceptor visual check + Worker endpoint 200 |
| 3 | Review velocity | +8/month; +100 in year 1 | Mount Zion 479 is the long-range count target | GBP monthly count log |
| 4 | Schema rich-results | 0 errors on Service/FAQ/Review/Breadcrumb graph; enhancements detected in GSC | All locals: LocalBusiness-or-nothing | Rich Results Test + GSC enhancements report |
| 5 | Fitment finder | Live, ≥ 25 platforms, ≥ 100 fitment_use/mo by day 90 |
NO local shop has one (gap #1) | GA4 fitment_use |
| 6 | Transparent pricing | ≥ 6 real "from $X installed" prices live | Field is 100% quote-only (gap #6) | Page audit; zero placeholders in dist |
| 7 | Conversion flow | 4-step quote flow live; ≥ 15 quote_submit/mo by day 90; start→submit ≥ 25% |
Field's bare contact forms; No Limit's unqualified text-to-quote | GA4 funnel + SendGrid reconciliation |
| 8 | Tracking | All 8 events + Ads conversion verified end-to-end | N/A — table stakes we uniquely clear | GTM preview + GA4 Realtime + Ads test conv. |
| 9 | Financing | Program live, $/mo on every package, financing_click flowing |
Only Intercourse + No Limit surface it (gap #2) | Page audit + GA4 |
| 10 | Local rank | Page-1 for "lift kit installation" + {Elkton, Newark DE, Bel Air} within 90 days of cutover | East Coast Off Road ~invisible; Rhino diluted | Weekly rank tracker log |
| 11 | Guarantee | Written install guarantee live in 3 surfaces | Nobody publishes one (gap #12) | Page audit |
| 12 | Content | 4 posts at launch, 2/mo cadence held | Zero local shops produce content (gap #10) | Publish log |
The single sentence of done: A buyer in Newark, Bel Air, or Elkton searching "lift kit installed near me" on a phone finds us first, sees live stars and real prices no one else shows, specs their exact truck in the fitment finder, and books a quote in under a minute — and we can see every step of it in the dashboard.
Build gates that never relax: SITESTR validator exit 0 · bun run vitals budgets green · Interceptor visual verification per changed page · no reveal-gated content · bun/TS only.