GFPEstimate Builder
Cannot generate estimate β€” please fix:

    1 Customer Information

    Required
    Required

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

    3 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. $899 project minimum applies Β· Good auto-hides when garage >600 sf Β· Rates editable in Pricing tab.

    4 Extras Only checked items appear on the estimate

    5 Additional Services Optional line items not driven by sqft

    6 Discount Bundle 10% applies automatically when 2+ areas are in scope β€” no reference needed. Pick another option only to override.

    7 Color, Source & Notes

    A Brand Configuration White-label for partner contractors

    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

    Active mode (from Consult Type): VIRTUALDefaults: in-person +5% premium over virtual
    Option πŸ–₯ VIRTUAL 🀝 IN-PERSON
    0–549550–899900+ 0–549550–899900+
    Saves brand config, pricing, rep roster, and integration settings to your browser. 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.