# Adding roof measurement reports to a roofing CRM

> A roofing CRM adds roof measurement reports with five calls to RoofQuery: order from the job's address, show progress from webhooks, read the measurements off the completed webhook, link the branded PDF, and expose a revision action. Reports cost the platform $13 residential and $35 commercial from a prepaid balance with no minimum, and what it charges its own users is its own decision. A brand profile per contractor puts their name, colors and logo on the PDF.

Category: By industry. Last updated 2026-09-09.
Canonical: https://roofquery.com/guides/adding-roof-reports-to-a-roofing-crm

Your users already have a job record with an address on it. The feature they want is a button on that record that produces a measured roof, under your brand, with the numbers flowing straight into the estimate. This guide is how to build that on RoofQuery, and the decisions that are yours to make rather than ours.

## What does the integration look like?

Five calls, in this order.

1. **Order.** When a user clicks the button, [POST](https://roofquery.com/docs/place-an-order) the job's address and coordinates with a `scope`. Store the returned order id on the job.
2. **Show progress.** The order starts `processing` and moves to `in-progress` when a technician picks it up. Surface that on the job so the rep knows it is coming.
3. **Receive.** The `completed` [webhook](https://roofquery.com/docs/webhooks) carries every measurement. Write squares, pitch areas and edge lengths into your estimate model directly from the webhook body. No second call.
4. **Present.** Link the [PDF](https://roofquery.com/docs/pdf) from the job with the contractor's brand profile on it, so their customer sees their company and logo.
5. **Correct.** Give the user a "request a revision" action. It is free, and the original stays available while it is redone.

## Who pays, and how much?

RoofQuery charges your account $13 per residential report and $35 per commercial, from a prepaid balance with auto-recharge. What you charge your users is your call. Common models: a per-report fee with margin, a bundle of reports in a plan tier, or free reports as a retention feature funded by the subscription. The API does not care which. [Pricing is also available from the API](https://roofquery.com/docs/pricing), so your product can show it without hardcoding.

## How does branding work with many contractors?

One [brand profile](https://roofquery.com/docs/brand-profiles) per contractor. When a contractor signs up to your platform, create a profile with their name, contact details, colors and logo, and store the profile id on their record. Every PDF link for their jobs carries `?brand=`, and their customer sees their company, logo included. Your own account defaults never change. Read [how white-label branding works](https://roofquery.com/guides/how-white-label-branding-works) before you design the settings screen.

## Which scope should the button use?

Ask the user, or default sensibly per job type. A re-roof quote usually wants `all_structures`; a storm inspection on the main house may only want `primary_only`. There is no server-side default on purpose.

## How do report fields map to estimate lines?

| Estimate line | Drive it from |
| --- | --- |
| Shingles or membrane | `totalSquares`, plus your waste factor by `complexity` |
| Steep-slope labour | `pitchAreas` above your steep threshold |
| Drip edge and starter | `edgeTotals.EAVE` + `edgeTotals.RAKE` |
| Ridge cap and vent | `hipsAndRidgesLengthFt` |
| Ice and water, valley metal | `edgeTotals.VALLEY` |
| Step and wall flashing | `edgeTotals.STEP_FLASHING`, `edgeTotals.WALL_FLASHING` |
| Detached garage as a separate option | `structures[1]` onward |

The fields are defined under [report data](https://roofquery.com/docs/report-data) and in the [glossary](https://roofquery.com/guides/roof-measurement-glossary).

## Which edge cases need handling?

- **Cancelled orders.** Unmeasurable property. Show the reason, clear the pending state, and note that the cost came back as credit.
- **Redeliveries.** A corrected report arrives as an `updated` event on an order that is still `completed`. Re-download, and re-run any estimate maths. The [lifecycle reference](https://roofquery.com/docs/order-lifecycle) explains the alternation.
- **Insufficient balance.** A 402 on the order call, before an order exists. Auto-recharge makes it rare; a clear error makes it harmless.

> Build the whole thing in sandbox first. The test addresses run the happy path, a commercial roof, a cancelled order and a failed payment in seconds, with real webhooks. [Testing in sandbox](https://roofquery.com/guides/testing-in-sandbox-before-you-spend) has the details.

## Frequently asked questions

### Can a roofing CRM resell RoofQuery reports?

Yes. There is no reseller agreement to sign and no minimum. Reports are $13 residential and $35 commercial to your account, and you set your own price to your users.

### Can each contractor on my platform have their own branding?

Yes, including their logo. Create a brand profile per contractor and put its id on their PDF links.

### How long does the integration take?

The core is five calls and a webhook handler. Most teams have a working sandbox integration in a day, because the sandbox runs the whole lifecycle in seconds.
