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:

closure rate = closed / (open + 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 TypeDescription
OTC Alterations PermitOver-the-counter alterations — smaller-scope work processed at the DBI counter
Additions Alterations or RepairsFull-scope building alterations, additions, and repair work
New Construction Wood FrameNew wood-frame residential construction
New ConstructionNew non-wood-frame construction
DemolitionsBuilding demolition
Grade or Quarry or Fill or ExcavateExcavation and grading work

Trade Permits (separate datasets)

Permit TypeSource Dataset
ElectricalDBI Electrical Permits — electrical wiring, panels, service work
PlumbingDBI 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 TypeReason
Sign – ErectSign installation, not building construction
Wall or Painted SignSignage, 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:

StatusClassification
CompleteCounted as closed — work verified complete
IssuedCounted as open — permit issued, work not yet completed
ExpiredCounted as open — permit expired without completion
ReinstatedCounted as open — previously expired permit reinstated
Cancelled / WithdrawnExcluded — permit cancelled or withdrawn before work
Filed / Approved / FilingExcluded — pre-issuance statuses, work not yet authorized
Suspend / Disapproved / RevokedExcluded — 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].