Methodology
How we calculate closure rates and which permits we count for San Francisco.
What is a closure rate?
When a contractor pulls a building permit in San Francisco, an inspector needs to verify the work was completed correctly before the permit can be closed. A closure rate measures the percentage of an applicant’s permits that have been properly closed:
The 365-day eligibility rule
A contractor who pulled a permit last month hasn’t had time to complete the work yet. To avoid penalizing recent activity, we only count permits issued more than 365 days ago when calculating closure rates.
Permits issued within the last year still appear in the data but are dimmed in the table and not factored into the rate.
Which permits are included?
San Francisco’s Department of Building Inspection (DBI) publishes permit data across multiple datasets. We include construction permits from three sources:
Building Permits
| Permit Type | Description |
|---|---|
| OTC Alterations Permit | Over-the-counter alterations — smaller-scope work processed at the DBI counter |
| Additions Alterations or Repairs | Full-scope building alterations, additions, and repair work |
| New Construction Wood Frame | New wood-frame residential construction |
| New Construction | New non-wood-frame construction |
| Demolitions | Building demolition |
| Grade or Quarry or Fill or Excavate | Excavation and grading work |
Trade Permits (separate datasets)
| Permit Type | Source Dataset |
|---|---|
| Electrical | DBI Electrical Permits — electrical wiring, panels, service work |
| Plumbing | DBI Plumbing Permits — plumbing installations and modifications (includes boiler work) |
Applicant identification
Building permits: DBI publishes contact information in a separate dataset that is joined to permits during our nightly refresh. Each permit may have multiple contacts with different roles (e.g., contractor, architect, owner). We prefer the firm name when available, falling back to last name, first name. When a permit has multiple contacts, deduplication keeps the row with the longest applicant name — which naturally favors company names over individuals.
Trade permits: Electrical and plumbing permits have their own separate contacts datasets. Each contractor is matched to their permits by permit number during ingestion.
About 31% of building permits have no contact data in the source (the join is a LEFT OUTER JOIN). These permits are still tracked but do not appear on any applicant’s record.
What is excluded?
We exclude permits where low closure rates are systemic or the permit type doesn’t represent inspectable construction work:
| Permit Type | Reason |
|---|---|
| Sign – Erect | Sign installation, not building construction |
| Wall or Painted Sign | Signage, not building construction |
Permits older than 10 years (based on filed date) are also excluded to keep the dataset focused on reasonably current activity.
Deduplication
The primary building permits dataset is pre-joined with contacts, meaning a permit with three contacts appears as three rows. We deduplicate on permit number during each nightly refresh, keeping the row with the longest applicant name (to prefer firm names over individual names).
During dedup, we reconcile permit status: if any copy of a permit was marked as closed, the surviving row is updated to reflect that closure — ensuring we never lose a legitimate sign-off.
Status classification
All three DBI datasets use the same status vocabulary. We classify four statuses for closure rate calculations:
| Status | Classification |
|---|---|
| Complete | Counted as closed — work verified complete |
| Issued | Counted as open — permit issued, work not yet completed |
| Expired | Counted as open — permit expired without completion |
| Reinstated | Counted as open — previously expired permit reinstated |
| Cancelled / Withdrawn | Excluded — permit cancelled or withdrawn before work |
| Filed / Approved / Filing | Excluded — pre-issuance statuses, work not yet authorized |
| Suspend / Disapproved / Revoked | Excluded — administrative holds or denials |
We classify Expired as “open” because it indicates the contractor did not complete and close the permit before it expired, consistent with our treatment of expired permits in other cities.
Leaderboard criteria
The leaderboard applies two additional filters:
- Minimum 20 rated permits — avoids surfacing statistically insignificant data.
- Active in the last 3 years — prevents the list from being populated by defunct companies.
The leaderboard can be filtered by permit type (e.g., Building, Electrical). When filtered, both thresholds apply only to permits of the selected type.
Median comparison
On applicant detail pages, each closure rate is compared to the median closure rate across all leaderboard-eligible applicants in the same category. This gives context — a 50% closure rate means something different in a category where the median is 40% versus one where it’s 80%.
Medians are calculated from the same pool of applicants who meet the 20-permit minimum threshold.
Data source
Data comes from three DBI datasets on DataSF: Building Permits (with permit contacts), Electrical Permits, and Plumbing Permits. All are refreshed nightly.
Limitations
This site shows permit closure data. It does not evaluate the quality of anyone’s work. There are legitimate reasons a permit may remain open:
- Client non-cooperation — the property owner may fail to schedule the final inspection or grant access.
- Administrative backlog — work may be inspected and approved but not yet updated in the system.
- Project delays — financing, design changes, supply chain issues, or other factors outside the applicant’s control.
- Multi-phase projects — large commercial projects may legitimately take years to complete.
- Permit holder vs. contractor — the applicant may be a GC, architect, or owner — not necessarily the person scheduling the inspection.
If you believe there are inaccuracies in the underlying permit data, contact the SF Department of Building Inspection at [email protected].