Estimating
The Same Card, Three Pipelines
An estimate isn't a separate object. It's the same opportunity card you started with — promoted into the next pipeline. When an opportunity hits "Qualified" and the estimator builds a quote, that card disappears from the Opportunities board and lands in the Estimating board, carrying its history with it. When the customer signs, it graduates again into the Projects board as a job. One record, three lenses — each lens belongs to a different team.
The Estimating module is where opportunities become bookable work. After a site visit, the estimator builds a line-item quote — labor, materials, options — and sends it to the customer. The customer reviews in their portal, approves with an e-signature, and the estimate auto-converts into a project and invoice. Every estimate is tracked from draft to win/loss, with attribution back to the estimator and the originating opportunity source.
Sales Pipeline
The estimator's primary view is a kanban board, not a list. Cards move left-to-right as the estimate matures. Each card surfaces the same opportunity DNA — source, contact, projected value, days in stage — plus estimate-specific data: total amount, last viewed timestamp, days since sent. Drag a card right to advance; drop into Approved and the system spins up the project and the deposit invoice automatically.
Estimate List View
A list view is also available for estimators who prefer a flat sortable table — same data, different lens. Useful for bulk operations and reporting.
Pipeline Stages
The estimate kanban has five active columns plus three terminal states. Each transition is logged with timestamp and actor for the audit trail. Automatic triggers move cards forward — the estimator only drags manually to override.
| Stage | Type | Entry Trigger | Exit Trigger | SLA |
|---|---|---|---|---|
| Draft | Active | Estimator opens "Build estimate" from a Qualified opportunity | Estimator clicks Send | Same day as site visit |
| Sent | Active | Estimate emailed + SMS'd to customer with portal link | Customer opens the portal link | — |
| Viewed | Active | Portal view event logged (first open) | Customer replies, calls, or requests changes | Follow up within 48 hours of first view |
| Negotiating | Active | Customer requests changes, asks for tier swap, or back-and-forth on price | Customer signs OR estimator marks Lost | — |
| Approved | Terminal (Win) | Customer e-signs in portal | Auto-graduates to Projects pipeline within 2 seconds | — |
| Declined | Terminal (Loss) | Customer explicitly declines via portal button | — | — |
| Expired | Terminal (Loss) | Validity period elapses with no decision | — | Customer auto-notified with refresh offer |
| Lost | Terminal (Loss) | Estimator manually closes with reason code | — | Reason required (Price / Timeline / Competitor / Scope / No Reply) |
The three terminal states (Declined, Expired, Lost) are filtered out of the active board by default but remain accessible from the "Lost" filter pill. They feed win-rate analytics and loss-reason reporting.
Building an Estimate
Estimators build a quote in four parts:
1. Header
- Customer (auto-linked from the opportunity)
- Job address (auto-filled from contact, editable if different)
- Estimate validity period (default 30 days)
- Estimator name (logged in user)
2. Scope of Work
A free-text narrative describing what will be done, in plain language. This is what the customer reads first — line items follow. Templates exist per service type so estimators don't write from scratch.
3. Line Items
Each line carries: description, quantity, unit, rate, total. Lines are grouped by category (Labor, Materials, Equipment, Permits, Other) and totals roll up by group.
| Line Item | Qty | Unit | Rate | Total |
|---|---|---|---|---|
| Labor — Lead carpenter | 28 | hrs | $150/hr | $4,200 |
| Labor — Helper | 16 | hrs | $85/hr | $1,360 |
| Composite decking | 320 | sqft | $12.50/sqft | $4,000 |
| Framing lumber | 1 | lot | $680 | $680 |
| Permit fee | 1 | each | $320 | $320 |
| Cleanup / haul-off | 1 | each | $200 | $200 |
| Subtotal | $10,760 | |||
| Tax (8%) | $861 | |||
| Discount (Referral) | -$2,221 | |||
| Total | $9,400 |
4. Photos & Attachments
Photos of the jobsite (uploaded from mobile during the site visit) attach to the estimate. Customers see them inline with the scope. Estimates with annotated photos get opened ~5× more than line-item-only quotes.
Estimate Templates
Estimators rarely build from scratch. Templates exist per service type and load a pre-built scope narrative + line items that the estimator then tunes:
| Template | Typical Use | Default Lines |
|---|---|---|
| Deck rebuild | Replace existing deck | ~12 lines (demo, framing, decking, railings, finishing) |
| Bathroom remodel — standard | Tub-to-shower conversion | ~18 lines |
| Kitchen tile + backsplash | Surface work only | ~8 lines |
| Roof inspection + repair | Small repair | ~6 lines |
| HVAC tune-up | Recurring service | ~3 lines |
| Whole-house repaint | Exterior + interior | ~14 lines |
Templates are tenant-customizable — owners can create and edit templates from Settings → Estimate Templates.
Good / Better / Best Tiered Estimates
For projects with optionality, estimators can present three tiers side-by-side on a single estimate. Customers pick a tier with one tap.
| Tier | Description | Total |
|---|---|---|
| Good | Standard composite, builder-grade railings, paint finish | $7,200 |
| Better | Premium composite, aluminum railings, stain finish | $9,400 |
| Best | Top-tier composite, glass-panel railings, pergola add-on | $14,800 |
Tiered estimates close more than single-price quotes because they change the customer's mental question from "should I buy?" to "which tier?"
Customer Approval Flow
When the estimate is sent, the customer receives:
- SMS — "Your estimate from [Business] is ready: [short link]"
- Email — Branded email with the estimate PDF attached and a portal link to view in-browser
- Portal view — In-browser view with photos, scope, line items, e-sign button
When the customer taps "Approve":
- E-signature captured (drawn or typed)
- Timestamp + IP address logged
- Estimate status → Approved
- Project auto-created from the estimate's line items
- Invoice auto-created (initial deposit invoice if a deposit % is configured)
- Originating opportunity moves to "Won"
- Estimator and owner notified
- Customer receives confirmation email + project portal access
E-Sign & Legal Trail
Approved estimates capture a full audit trail for legal defensibility:
| Captured | Purpose |
|---|---|
| Customer signature image | Visual signature on the PDF |
| Typed name | Backup if image fails to render |
| Timestamp (server-side) | When approval happened |
| IP address | Origin of approval |
| User-agent | Device used to approve |
| Document hash | Cryptographic proof the document wasn't modified after signing |
Each estimate version is hash-locked at send time. If the estimator edits after sending, a new version is created — the customer must re-approve.
Estimate Expiration
Every estimate carries a validity period (default 30 days, editable). On expiration:
- Status changes to Expired
- Customer notified via email with offer to refresh
- Estimator notified to follow up
- Opportunity returns to the pipeline at the Qualified stage if it was sitting in Appt Pending/Booked
Expired estimates can be refreshed — system clones the estimate with new validity dates and updates pricing for any material cost shifts.
Win Rate Analytics
The estimating dashboard tracks performance per estimator, per service type, and per opportunity source:
| Metric | Definition |
|---|---|
| Win rate | Approved ÷ (Sent − Expired − Withdrawn) |
| Avg time to send | Hours from opportunity Qualified → estimate Sent |
| Avg ticket | Mean approved estimate value |
| Close velocity | Median days from Sent → Approved |
| Loss reasons | Count by reason code (Price, Timeline, Lost to competitor, Scope changed, No reply) |
Owners see this rolled up across the business; estimators see their own performance.
Estimate → Invoice → Project
Approval is the trigger that cascades downstream:
- Project created — Line items become project tasks, total becomes contract value
- Invoice created — Deposit invoice generated if a deposit % is configured (e.g., 30% due at signing)
- Schedule slots reserved — If the estimate references a specific install date, the calendar holds that block
- Materials list generated — Material lines flow to the procurement queue
- Crew suggested — Skill-matched crew is suggested for assignment
- Customer portal updated — Customer now sees a Project page with milestones
This entire cascade happens in < 2 seconds after approval. The estimator doesn't manually create anything downstream.
Change Orders vs. Re-Estimating
When scope changes during a job:
- Small scope additions (< 10% of original contract value) → Change order (see Invoices & Payments)
- Major scope changes (≥ 10% or fundamentally different work) → New estimate with a versioned link to the original
The system enforces this threshold automatically — over-10% additions require an e-signed change order before work proceeds.
Access Control (RBAC)
| Permission | Owner | Manager | Estimator | Dispatcher | Technician | Bookkeeper |
|---|---|---|---|---|---|---|
| View all estimates | ✓ | ✓ | ✓ | Own projects | ✗ | ✓ |
| Create estimate | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ |
| Edit draft | ✓ | ✓ | Own | ✗ | ✗ | ✗ |
| Send estimate | ✓ | ✓ | Own | ✗ | ✗ | ✗ |
| Apply discount > 10% | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ |
| Mark as Lost | ✓ | ✓ | Own | ✗ | ✗ | ✗ |
| Edit templates | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ |
| View win-rate analytics | ✓ | ✓ | Own | ✗ | ✗ | ✓ |