GFPEstimate Builder
🔍 Start here — Load the customer from GHL
Pick the customer and their details fill in below — or just type a new customer by hand. Then use ✚ New Estimate ▼ (top bar) to set the type.
Cannot generate estimate — please fix:

    1 Customer Information

    Required
    Required
    Layout

    2 Property Verification Send the customer a sheet to confirm their property & dimensions before the visit

    ×
    * Records mode needs this number to generate. New-build & No-PA don't.
    Mode is automatic: Existing home (Step 1) builds the confirm-this-size sheet from the link/screenshot; New build builds the help-us-confirm sheet (asks 2-car vs 3-car). Preview it, then send from the estimate screen.

    3 Project Areas Check the surfaces being coated, then enter sqft and optionally a photo

    4 Coating System BEST is the default quoted tier — customer sees Good and Better as alternates on the estimate

    Good (1 Coat Solid · 5-Year) and Better (2 Coat Solid · Lifetime) are auto-included on the customer's estimate for comparison. Good auto-hides when garage >600 sf.
    PRICE PER SQ FT
    Edit any tier — updates the quote live. Click Save All Settings (Pricing tab) to keep prices for next time.
    Type a price here and it applies to every area right away (the box checks itself). All three options become that one price. Clear the box — or uncheck it — to go back to the Good / Better / Best prices above.

    5 Extras Only checked items appear on the estimate

    Included at No Charge Shown on every estimate as included — uncheck to remove if it doesn't apply

    6 Additional Services Optional line items not driven by sqft

    7 Discount Bundle 10% applies automatically when 2+ areas are in scope — no reference needed. Pick another option only to override.

    8 Color, Source & Notes

    Tick the box under any field to print it on the estimate and the sold sheet.
    For custom blends — shows on the estimate in place of the dropdown color.

    9 Promo Discount Flat dollars off — applies to the BEST (Full Flake) option only

    🎯 Target Price Set the $/sq ft you want the BEST (Full Flake) option to land at — the builder backs into it by auto-adjusting the area rates so the normal math (areas × rates − bundle − promo) lands on target × sq ft, rounded to the nearest dollar

    🔒 Card on File Fills the Sold Sheet only — never saved to history, the cloud, or your browser; clears on a new estimate

    🔒 Used only to fill the Sold Sheet you print/charge from. Not saved to history, the cloud, or your browser.

    A Brand Configuration

    🎨 Brand Color Theme
    Color theme:
    Pick a color, then Save All Settings. Changes show on the printed estimate.
    LIVE PREVIEW

    Cloudinary Photo Library Pull your shared photos (banner, gallery, tiers, inclusions, area photos) live from Cloudinary by tag. Stored as links, not images — so the browser storage wall is gone.

    A2c Banner Photo Upload up to 8 hero photos, click one to put it on the banner, then resize & crop. Live preview below.

    Banner photo
    2 Coat + Flake
    $3,624 · turnkey · installed
    Resize & crop the photo
    Zoom100%
    Left ↔ Right50%
    Up ↕ Down50%
    ☀ Brightness100%
    ◐ Contrast100%

    A4 County Property Appraisers The lookup list used in Step 1 — add or update as you expand

    Matching State + County overwrites the existing entry. Remember to Save All Settings.

    A2b Photo Library — Page 2 Build a library once — load ~4 photos per type (Garage, Patio, Driveway…), each tagged with finish & color. On each estimate, ✨ Auto-pick chooses up to 6 that match the job's areas + color; tick/untick any photo to adjust. Saved automatically.

    A2d Color Swatches Upload a real swatch photo for each floor color — shown on the estimate & sold sheet when the customer picks that color. Until you upload one, a solid placeholder color is used.

    A3 Customer Reviews Shown under "What Customers Say" on the estimate

    Paste your best Google reviews here. Click Save All Settings to keep them. (Auto-pulling recent Google reviews comes later with the back-end.)

    B Sales Representatives

    Editing the active rep below applies to estimates instantly. Save Defaults to persist the full roster.

    C Extras & Add-Ons Pricing Per-sf rates, percentages of base, and flat fees

    ▌ Auto-saves as you type · Builder labels update in real-time across the app

    D Pricing Master Sheet Size-based rates. The Quick Pricing boxes on the builder page fill these in for you.

    Active mode (from Consult Type): VIRTUALDefaults: in-person +5% premium over virtual
    Option 🖥 VIRTUAL 🤝 IN-PERSON
    0–549550–899900+ 0–549550–899900+
    Save keeps your brand, pricing, reps, and integration settings in this browser only. Cloud Sync stores your settings and your Estimate History on your website — enter your sync code once on any computer and everything loads and stays in sync automatically from then on. Backup to File downloads everything — settings and all saved estimates — as one file you can store in Google Drive and reload on any device with Restore from File. Reset restores GFP factory defaults.

    📂 Estimate History

    🔌 Integration Hooks Stubbed — ready to wire to live services

    All hooks fire from real events in the app. With integrations off, events log to browser console for testing. Flip a toggle and enter credentials to activate. Each "Test" button fires a sample payload using current builder state.

    📤 GoHighLevel — CRM Sync

    OFF
    Pushes estimate events to a GHL webhook. Use to create opportunities, attach PDF, trigger follow-up automations, sync contact data. Events fired: estimate.created, estimate.viewed, estimate.downloaded, estimate.signed_requested, estimate.deposit_requested.
    
        

    💳 Stripe — Deposit Capture

    OFF
    Generates a Stripe Checkout link for the 50% deposit. Customer clicks "Pay Deposit" on the estimate and pays via credit card or ACH. Note: Requires a small backend (Cloudflare Worker, Supabase Edge Function, etc.) to mint Checkout Sessions — never put a secret key in this file. The Public Key field below is for the eventual frontend wire-up.
    
        

    ✍ E-Sign — Customer Signature

    OFF
    Submits the estimate PDF to DocuSign / HelloSign / Dropbox Sign for customer signature. Pre-fills signature fields on Terms page and Use & Care page. Note: Like Stripe, this needs a backend endpoint to call your e-sign provider — never expose API keys in browser code.
    
        

    📊 Analytics Hook

    Every estimate event is also broadcast as window.dispatchEvent(new CustomEvent('gfp.event', {detail: {...}})). Pipe it to GA4, Segment, Mixpanel, PostHog, or a Google Sheet without touching this file. Useful events: estimate.created, estimate.viewed, estimate.downloaded, estimate.deleted.
    No config needed — events fire by default. Listen in your analytics shim or browser DevTools console.