cori.data.bfs
Access and analyze U.S. Census Bureau Business Formation Statistics (BFS) at the county, state, and national level from 2005 to present. Measures business applications — EIN filings — as a leading indicator of entrepreneurial activity in rural and nonrural communities.
Drew Rosebush 2026-08-31
Overview
The cori.data.bfs package provides access to U.S. Census Bureau Business Formation Statistics (BFS) at the county, state, and national level from 2005 to the present. BFS measures business applications — Employer Identification Number (EIN) filings with the IRS — as a leading indicator of entrepreneurial activity. Because applications precede establishment by months or years, the data captures entrepreneurial momentum before it shows up in employment or business counts.
Because applications precede establishments by months or years, BFS is the earliest observable signal of whether entrepreneurial momentum is building in a community — particularly useful for tracking rural economies where establishment counts alone may show little movement. All data are returned in the standard cori.data long format: one row per geoid / year / variable.
Installation & quick start
remotes::install_github("ruralinnovation/cori.data.bfs")
library(cori.data.bfs)
# All variables and their definitions
get_bfs_codebook()
# Total business applications — all counties, all years
get_business_applications(geography = "county")
# New Hampshire counties, 2010 onward
get_business_applications(
geoids = c("33009", "33011"),
years = 2010:2024
)
What this data tells us about rural America
Business applications are best interpreted as a leading indicator of future establishment counts rather than a measure of current economic strength. Not all applications convert to employer businesses, and the conversion rate varies by community conditions, industry, and access to capital and support. Reading application trends alongside employment and wage data gives the fullest picture of whether entrepreneurial momentum is translating into durable economic change.
Introduction
Adapted from the Introduction vignette on GitHub.
cori.data.bfs provides annual business application counts from the U.S. Census Bureau’s Business Formation Statistics. Data cover 2005–present and measure total EIN applications filed with the IRS, excluding tax liens, estates, trusts, agriculture (NAICS 11), and public administration (NAICS 92).
Source: U.S. Census Bureau, Business Formation Statistics Coverage: 2005–present, updated annually Geography: County (5-digit FIPS), state (2-digit FIPS), national ("00")
Variables
get_bfs_codebook() |>
dplyr::select(variable, label, unit, notes) |>
knitr::kable()
Reading data
All data are returned in long format: one row per geoid / year / variable.
df <- get_business_applications(geography = "county")
dplyr::glimpse(df)
Filter to specific geographies, years, or variables:
nh_bfs <- get_business_applications(
geoids = grep("^33", unique(df$geoid), value = TRUE),
years = 2010:2024
)
dplyr::glimpse(nh_bfs)
Rural vs. nonrural
Business formation diverges between rural and nonrural counties. The chart below shows total business applications by rural status using the CBSA 2023 rural definition.
library(cori.charts)
library(ggplot2)
library(ruraldefinitions)
library(dplyr)
load_fonts()
rural_xwalk <- ruraldefinitions::cbsa_2023 |> select(geoid, is_rural)
rural_avg <- df |>
left_join(rural_xwalk, by = "geoid") |>
filter(!is.na(is_rural)) |>
group_by(year, is_rural) |>
summarise(value = sum(value, na.rm = TRUE), .groups = "drop")
ggplot(rural_avg, aes(x = year, y = value, color = is_rural)) +
annotate("rect", xmin = 2007.9, xmax = 2009.5,
ymin = -Inf, ymax = Inf, fill = "grey80", alpha = 0.4) +
annotate("rect", xmin = 2020, xmax = 2020.5,
ymin = -Inf, ymax = Inf, fill = "grey80", alpha = 0.4) +
geom_line(linewidth = 1) +
geom_point(size = 2.5) +
scale_color_manual(
values = c("Rural" = "#2F6E9B", "Nonrural" = "#7EBDC2"),
labels = c("Rural" = "Rural counties", "Nonrural" = "Nonrural counties")
) +
scale_x_continuous(
breaks = seq(2005, 2024, by = 4),
expand = expansion(mult = c(0, 0.2))
) +
scale_y_continuous(labels = scales::label_number(scale = 1e-3, suffix = "K")) +
theme_cori() +
theme(legend.position = "bottom") +
labs(
title = "Rural business formation surged during the pandemic and has held",
subtitle = "Total business applications (BA series), 2005\u20132024",
x = NULL,
y = NULL,
color = NULL,
caption = paste0(
"Source: CORI analysis of U.S. Census Bureau Business Formation Statistics.\n",
"Shaded bands mark Great Recession (2008\u201309) and COVID-19 (2020). ",
"Rural classification: CORI CBSA 2023 definition."
)
)
County ppotlight: Grafton County, NH
library(cori.data.pep)
grafton_bfs <- get_business_applications(
geoids = c("33009", "33", "00"),
years = 2005:2024
)
grafton_pop <- get_population(
geoids = c("33009", "33", "00"),
variables = "population",
years = 2005:2024
) |>
select(geoid, year, population = value)
grafton <- grafton_bfs |>
left_join(grafton_pop, by = c("geoid", "year")) |>
mutate(
apps_per_1k = value / population * 1000,
group = case_when(
geoid == "33009" ~ "Grafton County, NH",
geoid == "33" ~ "New Hampshire",
geoid == "00" ~ "United States"
),
group = factor(group, levels = c("Grafton County, NH", "New Hampshire", "United States"))
)
ggplot(grafton, aes(x = year, y = apps_per_1k,
color = group, linetype = group, linewidth = group)) +
annotate("rect", xmin = 2007.9, xmax = 2009.5,
ymin = -Inf, ymax = Inf, fill = "grey80", alpha = 0.4) +
annotate("rect", xmin = 2020, xmax = 2020.5,
ymin = -Inf, ymax = Inf, fill = "grey80", alpha = 0.4) +
geom_line(na.rm = TRUE) +
geom_point(size = 2.5, na.rm = TRUE) +
scale_color_manual(values = c(
"Grafton County, NH" = "#2F6E9B",
"New Hampshire" = "#7EBDC2",
"United States" = "#9DA7B0"
)) +
scale_linetype_manual(values = c(
"Grafton County, NH" = "solid",
"New Hampshire" = "dashed",
"United States" = "dotted"
)) +
scale_linewidth_manual(values = c(
"Grafton County, NH" = 1.2,
"New Hampshire" = 0.8,
"United States" = 0.8
)) +
scale_x_continuous(breaks = seq(2005, 2024, by = 4)) +
scale_y_continuous(labels = scales::label_number(accuracy = 0.1)) +
theme_cori() +
theme(legend.position = "bottom") +
labs(
title = "Business applications per 1,000 residents \u2014 Grafton County, NH",
subtitle = "Compared to New Hampshire and the United States, 2005\u20132024",
x = NULL, y = NULL, color = NULL, linetype = NULL, linewidth = NULL,
caption = paste0(
"Source: CORI analysis of U.S. Census Bureau Business Formation Statistics.\n",
"Population denominator from Census Population Estimates Program via cori.data.pep.\n",
"Shaded bands mark Great Recession (2008\u201309) and COVID-19 (2020)."
)
)
Related
- Dataset: Census Business Formation Statistics
- Package: cori.data — meta-package that includes
cori.data.bfs - Package: cori.data.bds — establishment counts and job creation; pairs with BFS for the full formation-to-employment story
- Package: cori.data.pep — population denominators used in the county spotlight above
- Project: Rural Economic Outlook — BFS is a core input to CORI’s multi-dataset economic analysis
NOTE Data attribution: Business Formation Statistics are produced by the U.S. Census Bureau. When citing analysis using this package, reference: U.S. Census Bureau, Business Formation Statistics, www.census.gov/econ/bfs.