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

    👤 Salesman Name, phone & email printed on every estimate & text

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

    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 · shown as 50% OFF, up to 599 sf) 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

    📎 Addendum — Scope of Work Customer-requested specifications printed as their own section on the proposal. Auto-draft pulls products, blends & areas from this estimate.

    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 One hero photo per color (photo name = color name). The banner auto-matches the estimate's floor color; click a photo to override. Resize & crop 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–360361–459460–599600–799800–9991000+ 0–360361–459460–599600–799800–9991000+
    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.