Skip to main content
Back

Projects Roofing Proposal Management

An AI Proposal Builder, Synced to the CRM

The CRM gave every job one home in production, but proposals still lived in Roofr, disconnected, every one starting from a blank page. So we built our own proposal app, synced to the CRM by job and property address, with an AI editor at its center: describe the job in a prompt, get a full draft back, then shape it in conversation until it's ready to send.

Company
Priority Roofing (USA)
Timeline
Jun 2026 - 3 weeks
Team
Developers, Stakeholders, Tester, Product Designer
AI-enabled roofing proposal builder interface

WHERE THIS IS TODAY

Not a redesign of Roofr. A standalone AI-first proposal app, synced to the CRM by job and address, built around one conversation: describe the job, get a complete draft, then refine it by talking to it, without retyping anything the CRM already has.

40% → 60%

proposal drafting completion rate before and after the AI editor shipped

2

estimate types, itemized and roof system, built on one shared catalogue

6

modules covering assessment through proposal delivery

BACKGROUND

Before the Agent, Every Proposal Was Typed From Scratch

Once the Roofing CRM shipped, a job had one home from won to paid. But a job had to be won first, and that front half, the assessment and the proposal, happened outside the CRM, inside a third-party tool called Roofr. Roofr had no intelligence in it: it measured roofs and handed a rep a form, one section, one line, one price, typed by hand, disconnected from every piece of data the CRM already held about that customer and job. A rep who'd just qualified a prospect inside the CRM left it entirely to write a proposal from nothing, with no system reading the job for them.

Roofr

Assessment & proposals

Roof measurements, damage assessment, and a manual proposal form.

Fully disconnected from the CRM, and nothing in it drafted anything. Every proposal began blank, no matter how many times a rep had built one like it.

The CRM

Everything after a job is won

Production, scheduling, materials, and commissions for a job already in motion.

No way to receive a job before it existed, or read one and act on it. The front half of the sale happened somewhere else entirely.

“I qualify the lead in the CRM, then type the same customer into Roofr to actually sell them anything. If the deal closes, I copy it all back by hand.”

— Sales Rep, Priority Roofing
PROBLEM

Nothing Here Was Smart, and Reps Paid for It Every Time

This was the same problem the CRM had already solved, showing up again on the other side of the job. Not a missing integration, a missing layer of intelligence, nothing here could read a job and act on it. Five issues kept coming up.

01

Disconnected from the CRM

Roofr had no relationship to the jobs and customers already living inside the CRM, every proposal started from a blank system.

02

Data typed twice, scattered everywhere

Reps re-typed customer and job details by hand, while photos, damage notes, and documents ended up split across whatever tool was open.

03

Approval disconnected from job tracking

A proposal being approved didn't mean anything to the CRM. Someone still had to notice and manually start the job.

04

The cost compounded

Every re-entry was a chance to introduce an error, and every manual handoff was time a rep or back-office spent not selling or building.

05

Every proposal started from a blank page

No faster way in, even a rep who'd built the same roof-system proposal fifty times still typed it from zero. The tool meant to save time cost the same amount every time.

THE PATTERN UNDER ALL FIVE

Every fix here needed the proposal to start already knowing the job, not a rep starting from nothing.

RESEARCH & AUDIT

Testing Whether Reps Would Actually Trust an Agent to Draft for Them

Before designing a replacement for Roofr, I traced a real proposal start to finish, from booking the assessment to the homeowner's signature, and talked to everyone involved. Not a feature audit. Two questions mattered more than any missing-feature list: was there enough structured data to ground an AI agent in the job, and would a rep actually trust a machine-written draft enough to send it.

WHO A PROPOSAL PASSES THROUGH

3 personas

Portrait of Marcus Bell, a sales rep, in a dark suit

Marcus Bell

Sales Repassessment → proposal sent
Age
31
Location
Dallas, TX
Tools
CRM, Roofr, phone
Tech
High, phone-first
Qualifies the lead in the CRM, then builds the proposal in Roofr from nothing. Measures the roof, photographs the damage, and wants the proposal out before he leaves the driveway, since the homeowner is collecting quotes from two other companies this week. Skeptical a machine could write something he'd send without rewriting it first.

MOTIVATIONS

  • First good proposal in the door usually wins the job
  • Commission depends on closing, not on quoting
  • Wants a draft, not a form, to start from

GOALS

  • Describe the job once and get a proposal back, not a blank one
  • Trust the draft enough to send it with light edits, not a rewrite
  • Stay in control of anything the agent changes

FRUSTRATIONS

  • Typing the same proposal shape from zero on every single job
  • Not knowing if he can trust a number he didn't calculate himself
  • Worried an AI draft would read generic instead of like his own pitch
“If it can write the first draft in the truck before I even get home, I'll try it. The second it gets a price wrong, I stop trusting it completely.”
— Marcus Bell

STAKEHOLDER SESSION

3 roles · 9 questions

Every session came back to the same question, phrased differently per role: could a system that reads the job and drafts on its own actually be trusted here.

Sales Reps

Assessment → close

If you described a job in a sentence and got a full draft back, would you send it, or rewrite it?

What would an AI-written proposal need to get right before you'd trust its price?

How much do you want to keep typing yourself versus handing to a system?

Back Office

Approval, contracts, job creation

What would you need to see to trust that a machine wrote this proposal correctly?

Where's the line on what an agent should be allowed to change without asking first?

What's the one AI mistake that would make you shut the whole thing off?

Roofr's manual proposal form, the blank starting point every rep faced with nothing read from the job
01

The data to ground an agent already existed, just scattered

The job, the customer, the assessment, the catalogue, everything an agent needed was already captured somewhere, just across three disconnected tools instead of one schema it could read.

02

Trust would live or die on the first wrong price

Every rep and back-office session landed on the same line: one bad number, and they'd never trust a draft again. Confidence had to be earned before speed even mattered.

03

Nobody wanted automation, they wanted a draft they could argue with

Reps didn't want a black box sending proposals on its own. They wanted a starting draft and a way to talk back to it, control had to stay visibly theirs.

THE GUIDING QUESTION

What if a rep could describe a job in a sentence and actually trust what came back?

APPROACH

Build Our Own App, Not Bolt Onto Roofr

The first real decision wasn't a screen, it was whether to integrate Roofr's API or build our own app. Integrating would have synced the two systems, but reps would still open Roofr itself, blank forms and all, with no room for the AI layer we wanted. We built our own standalone app instead, linked to the CRM the simple way: the same job and property address, so a rep never re-enters a customer or job, even with two products open.

RETIRE

Roofr as the system of record for a sale

It solved assessment and proposals in isolation, but every proposal it produced started disconnected from the job it was for.

BUILD

A standalone Proposal Management app, synced by the job

Assessment, proposal, approval, and signing all live in their own app, linked back to the CRM by the same job and property address, so nothing a rep already entered has to be typed again.

EXTEND

The CRM's pipeline backward, into the sale itself

The Job Cycle already carried a job from won to paid. This work extends that same idea one stage earlier, to first inspection.

THE CALL THAT SHAPED IT

Put an AI agent inside the builder, not beside it

Drafting a proposal from scratch was the slowest part of a rep's day → a prompt generates the full draft, and the same agent refines any section in place.

Sync by the job, don't duplicate the record

Assessments and proposals had no link to the job that already existed → linked to the CRM by the same job and property address, not copied into it.

Make proposals dynamic, not just templated

Every roofing service prices and reads differently → templates are a starting point; sections rebuild per job.

Split pricing into two catalog types

Itemized work and full roof systems don't price the same way → two catalog structures, one estimate engine underneath.

Close the loop with signing, not a handoff

An approved proposal used to become someone's manual task → signing happens inside the flow and creates the job directly.

WORKFLOW AND USERFLOW

One Path From Inspection to Signature

A prospect leaves the CRM's qualifying stage as a scheduled assessment, not a "won job" that shows up later from somewhere else. It moves forward as the same job, synced between the CRM and the proposal app by that job and address, through one flow, until a signed contract hands it to production.

1SALES REP

Rep chooses: with or without an assessment

The first decision point: link the proposal to a scheduled on-site assessment, or start one directly when no assessment is needed.

Dashboard
2SALES REP

Assessment scheduled (if linked)

When a proposal is linked to an assessment, the qualified prospect is scheduled for an on-site property assessment first.

Dashboard
3SALES REP

Property inspected, damage recorded

For linked proposals, the rep inspects the property and logs damage items directly against the job.

Assessment
4SALES REP

Photos & documents captured

Photos and supporting documents are attached to the same record, not scattered across a phone and a laptop.

Assessment
5SALES REP

Proposal drafted from a prompt, or a template

A rep describes the job in a sentence or two and gets a full draft back, pulling from the linked assessment when there is one, or from a template when that's faster.

ProposalTemplates
6SALES REP

Rep refines it by talking to the draft

Instead of hand-editing every field, a rep asks for changes in plain language, re-price this, rewrite that section, and the agent applies just that change.

Proposal
7SALES REP

Pricing built from the catalog

Itemized or roof-system pricing is pulled from the standardized catalog rather than estimated by hand.

Catalog
8SALES REP

Proposal sent to the homeowner

The finished proposal goes to the homeowner directly from the same workflow that built it.

Proposal
9HOMEOWNER

Homeowner approves

Approval happens inside the proposal itself, surfacing it as a workflow event on the CRM job is part of the integration still ahead.

Proposal
10BACK OFFICE

Job moves to production (manual, for now)

A won proposal still becomes a job through a manual handoff today. Closing that gap with digital signing and automatic job creation is the next milestone.

Proposal
INSIDE THE AI EDITOR

The Feature the Whole App Was Built Around

Every other module here keeps a job's data in one connected place instead of scattered across tools, synced back to the CRM by job and address rather than merged into it. But the AI editor is what makes that faster than the old way: a rep describes the job and keeps talking to the draft until it's right, which only works if the draft is trustworthy and easy to correct. Three decisions drove that: what the agent is grounded in, what it hands back, and what it does when it doesn't have enough to work with.

DRAFTING

One prompt, grounded in the job, returns a full draft

The slowest part of a rep's day was staring at a blank proposal after a long inspection. Now they describe the job in a prompt and get a complete draft back, built from whatever the job already knows about itself.

AI Proposal generator.
Prompt to draft

One prompt, informed by the job's own assessment data, produces a complete first draft, sections, scope language, and starting pricing already in place.

Inline refinement

The rep keeps editing by hand or asks the agent to change one specific part, the agent never rewrites what wasn't asked for.

GROUNDED

Prompted with the job's own data, not typed from scratch

The CRM and proposal builder stay separate tools, but the same job and property address link them, so a rep's CRM entries carry straight into the prompt, alongside the linked assessment, roof type, measurements, and recorded damage. With no assessment linked, it drafts from the prompt alone and marks pricing provisional instead of pretending it measured the roof.

STRUCTURED

Outputs the builder's own schema, not paragraphs to paste in

A draft comes back as sections, scope language, and catalogue-linked line items, the exact structure the builder already edits. Nothing generates as prose that has to be reformatted into the tool.

SCOPED

Every inline edit is a diff, never a silent rewrite

Ask it to re-price one line or rewrite one section and it changes only that. Everything else in the proposal stays exactly what the rep left it as.

What a Draft Actually Returns

SectionsMatched one-to-one to the builder's section types, so a draft opens as an editable proposal, not text to restructure by hand.
Line itemsPulled only from the shared catalogue, itemized or roof-system, the agent can't invent a price outside it.
Confidence flagSet to provisional whenever a draft is built from the prompt alone, with no assessment measurements behind it.
Edit targetA single section ID plus the requested change, not a full replacement proposal, is what an inline edit returns.

WHAT CHANGED AFTER THE FIRST VERSION

The first draft agent rewrote the whole proposal on every request

One tweak to a price meant re-reading the entire proposal to see what else moved → edits scoped to a single section, a diff, not a rewrite.

Early drafts didn't say when they were guessing

A prompt-only draft looked exactly as confident as one built from a real assessment → provisional pricing flagged the moment there's no assessment behind it.

The agent used to invent scope items that weren't in the catalogue

A generated line item with no matching price left a rep to catch it manually → unmatched items get flagged for the rep instead of priced automatically.

RESTRUCTURING

The same AI editor restructures the proposal, not just its wording

Rewriting a paragraph was never the whole job. A proposal often needs a section added, one removed, or the order changed. The AI editor handles this the same way it handles wording: on request, in place, without the rep leaving the builder.

AI Proposal editor.
NO MATCH

A referenced item isn't in the catalogue

The agent flags the line for the rep to resolve instead of inventing a price or a scope item that doesn't exist in the system.

MISSING DATA

No assessment is linked

It still drafts from the prompt, but every price on that draft is marked provisional until a real assessment backs it.

AMBIGUOUS ASK

An edit request doesn't map to one section

Rather than guessing which part of the proposal to change, the agent asks the rep to point at the section instead of touching the wrong one.

REVERSIBLE

Every AI edit can be undone

Nothing the agent changes is final. A rep can step back to the version before any AI edit, drafting or refining, the same as undoing their own typing.

THE SYSTEM

The Six Modules the Agent Reads From and Writes Into

The AI editor doesn't work in isolation, it reads and writes through the same six modules a rep would use by hand: daily selling work, the configuration that grounds and bounds the agent, and the admin layer that closes the loop.

CORE WORKFLOW3 modules
DashboardAssessmentProposal
CONFIGURATION3 modules
TemplatesCatalogue ManagementSettings

Dashboard

Gives reps visibility into their pipeline, assessments, proposals sent, approvals, and closed projects, plus recent activity at a glance.

The proposal dashboard showing assessment, proposal, and project pipeline metrics
The dashboard view with metrics.

Assessment

Inspect properties, record damage items, and capture photos and documents in one structured workflow, the grounding data the AI agent drafts from when a job has one linked.

The assessment listing page
Assessment listing page.
A detailed assessment page with damage items and captured photos
Detailed Assessment page.

Proposal

A flexible builder for customer proposals, customizing sections per roofing service, with every field linked to its CRM job. A rep chooses upfront whether the proposal is linked to an assessment or stands alone; an inline AI agent can draft it from a prompt either way, then refine sections as the rep edits.

The proposal listing page
The proposal listing page.

Templates

The fallback for when a rep would rather start from a known shape than a prompt. Templates keep a proposal within a category; a rep can use one as-is, modify it, or build a new one from scratch.

Template listing page.

Catalogue Management

The AI agent's price ceiling: it can only price what's in here. The shared catalogue behind both estimate types, itemized line items and build-specific roof systems, with every entry carrying its own instructions and price.

The catalogue management module
Catalog management module.

Settings

Centralized configuration for how assessments and proposals behave across the team.

Settings page.

Digital Contract Signing

Once a proposal is approved, rep and homeowner complete the agreement digitally, and it becomes part of the connected project inside the CRM.

Proposal signing enabled for the customer
Proposal Signing enabled for Customer.
STATUS & WHAT'S NEXT

Shipped, and Still Being Refined

This has already launched and is in active use by the sales team, it isn't a pilot. From here, the work continues: fixing what usage shows doesn't work and improving it step by step. So instead of an impact section, here's an honest status report: what's shipped, what's being refined, and what's still ahead.

Shipped
  • Assessment module, inspection, damage capture, photos, documents
  • Proposal builder with itemized and roof system estimate types, linked or standalone
  • Templates and catalogue management
  • AI agent for prompt-to-draft and always-on inline editing
In active use, refining now
  • Refining the overall experience based on how reps actually use it day to day
  • Enhancing the AI editing experience with support for documents and reference material
  • Linking CompanyCam, a job-photo app, to sync assessment photos automatically
  • Deeper CRM data linkage beyond the property address that's already connected
IMPACT SINCE THE AI EDITOR SHIPPED

The blank page is gone

Every new proposal starts from a draft now, not a template hunt or an empty section list. Reps open the builder and prompt first; template-first is now the exception.

Assessments turn into priced proposals same-day

A draft that used to wait for a rep to sit down and write it now exists minutes after the inspection ends, still editable, but never starting from zero.

Roofr logins are already dropping off

Reps default to our own app even for jobs that don't strictly require it, nothing has to be retyped thanks to the CRM sync, and the AI draft is faster than anything Roofr offered, which was the entire bet behind building our own.

WHAT WE'VE LEARNED SO FAR

A light sync by the job beat a deep one, and it was enough

Integrating Roofr's API would have shipped faster and kept both systems in sync. Building our own took longer, but linking it to the CRM by nothing more than job and property address was enough to remove the re-entry, without merging two products into one.

Flexibility has to live in the proposal, not just the template

Templates alone couldn't cover every roofing service. The real fix was making proposal sections rebuildable per job, with templates as a starting point.

Approval is a workflow event, not a signature

Treating homeowner approval as a state change on the job, not an email to notice, is what let the contract-signing step trigger the job automatically.

Building next to a live CRM changes how you sequence work

Every module here had to work with production data the CRM already depended on daily, meaning a different ship order than a greenfield build would allow.

Before pilotAfter pilot
% measured across the pilot sessions
40%
60%

Proposal drafting completion

25%
40%

Proposals with an AI edit

Completion rose from 40% to 60%, and AI editing went from a rarely-touched feature to something used on 4 in 10 proposals.

Reps were starting proposals and abandoning them before AI drafting existed, the blank page was the drop-off point. The inline editor built on that: once a rep had a full draft to react to instead of a form to fill in, editing by conversation read as faster than typing changes by hand, pulling both numbers up. Volume moved too: drafts went from an average of 12 a day to about 30, a rough read from job data, but directionally consistent with the rest of the pilot.