TOWNFALL
UNCOVERED
8 ways to solve South Carolina’s small-town crisis
By Tony Bartelme
August 16, 2026
Scroll to end for reader quiz
Trouble and hope. Many South Carolina towns are at a crossroads between the two.
You see it in Elloree and Andrews, where beautiful old buildings stand vacant on once-thriving main streets. But you also see people starting new businesses and residents demanding accountability from their elected leaders.
And you see it in Cottageville and Bonneau, towns that lost their police departments after officials failed to do basic tasks — pass budgets and hire auditors to check their numbers. But you also hear new mayors and city managers speak frankly about their towns’ mistakes and how they hired auditors to get their books in order.
Can South Carolina’s small-town crisis be fixed?
For this Townfall report, The Post and Courier interviewed more than 60 municipal finance officials, mayors, administrators and academic experts. We spoke to residents who love their towns and cities and believe that better government transparency will make these places thrive. Readers sent in more suggestions, and the newspaper created a new “accountability desert” map of towns that may be especially prone to misconduct and, therefore, good candidates for extra attention.
The good news is that key organizations in South Carolina recognize the crisis and are working on ways to fix it. The bad news is that state lawmakers have mostly sat on the sidelines. Yet nearly everyone we spoke to agrees on one thing: More needs to be done or more towns will end up making headlines for the wrong reasons. Here are some of their ideas.
Towns and cities are required to turn in independent audits to the state treasurer every year. The most-recent list showed 113 towns and cities were delinquent — more than 40 percent. Falling behind on an audit may seem like a minor matter, but it’s often a poker tell for larger problems, including embezzlement, fraud and police misconduct.
So what has the Legislature done about this?
In 2025, South Carolina’s 10 regional councils of government noted the audit delinquency problem and how it reflected a small-town fiscal crisis. They pitched a modest plan to lawmakers: hiring an experienced financial professional in each region to help struggling towns get their finances straight.
“It’s always harder when you’re in a hole,” said Ron Mitchum, executive director of the Berkeley-Charleston-Dorchester Council of Governments, or COG. “That’s what we were asking for — a way we could be more helpful before it got bigger and worse.”
The plan would have cost $2 million a year for three years — or $200,000 a year per COG region. The price reflected the cost of finding experienced public-sector professionals in the midst of a “silver tsunami,” the retirement of aging accountants and city managers.
“You need to hire seasoned professionals to fill those roles, people who have seen a lot of things, and yeah, you’re going to have to pay them well,” said Britt Poole, executive director of the Central Midlands COG, which covers Fairfield, Lexington, Newberry and Richland counties.
But the Legislature decided the crisis could wait.
Experts and COG officials said state lawmakers could resurrect that proposal with an even more comprehensive plan.
You could call it the Save Our Small Towns Act, or SOSTA. That acronym conveniently means “a pause’ or “break” in Italian, and a break is exactly what many of our small towns need.
State lawmakers could take a page or two from 23 other states, including North Carolina. All have systems in place that monitor local governments for signs of fiscal stress.
North Carolina’s Local Government Commission is noteworthy for its accountability powers. It can shoot down a town’s bond issue if the numbers don’t add up. It can take financial control if the town is heading toward default or doesn’t turn in its audits.
It has sticks. But also carrots.
Agency staff coach towns to pull their finances together and connect them with North Carolina’s robust university government school. Credit rating agencies have long lauded North Carolina’s approach and rewarded the state’s local governments with higher credit ratings. This translates into lower borrowing costs and savings for taxpayers. Commission meetings in Raleigh can feel like substance abuse interventions, but instead of addiction, the commission tries to break cycles of mismanagement and political dysfunction.
“North Carolina always seemed to be a step ahead of South Carolina,” said Mark Crocker, former board chairman of the S.C. Board of Accountancy. “We don’t have anything that equates with that.”
Still, creating something like North Carolina’s commission could require some legal workarounds.
“I don’t know how doing that would work with home rule,” State Treasurer Curtis Loftis said. Enacted 50 years ago, the Home Rule Act shifted local government power from state legislative delegations to counties.
But it’s not a completely foreign concept for South Carolina to step in.
Lawmakers used budget provisos to order forensic audits of Calhoun Falls and Hampton County, with the state auditor working with the inspector general, after those towns descended into financial crises.
And when a local school district fails, the S.C. Department of Education can take control, as it did recently in Marlboro County and four other times over the past decade. Referring to Marlboro County’s problems, State Superintendent of Education Ellen Weaver said, “Every child in MCSD — and across our state — deserves a high-quality education.”
Don’t taxpayers deserve the same quality of governance from their towns and cities?
For generations, many parts of rural America didn’t have enough clergy for each church to have its own pastor. Some traditions responded with “circuit riders” — preachers who served multiple congregations. A similar system could help towns.
Many small municipalities lack the tax base and budget to hire and properly pay a full-time financial professional, said Kevin Yokim, Florence County administrator. But if groups of smaller communities pooled their resources they could afford roving administrators or financial professionals.
Creating municipal circuit riders is one way to pool resources. Another is what the Municipal Association of South Carolina hopes to launch this year. They plan to buy accounting software designed for municipal finances and deploy experienced managers to groups of towns that sign up for that accounting platform.
Having standard financial software and procedures “will make it easier for our technical officials to go from town to town and immediately know what they’re looking at,” said Todd Glover, executive director of the association that represents the state’s 271 incorporated towns and cities.
Glover said this standardization and sharing also might make audits cheaper. A number of small towns have already expressed interest, he said.
The benefits go beyond better bookkeeping, he added. “Financial accountability, audit accountability — you shouldn’t provide that just because it’s required by law. You should be doing it because that’s what your residents deserve.”
In his 1981 inaugural address, President Ronald Reagan famously said, “In this present crisis, government is not the solution to our problem; government is the problem.” Reagan was speaking about national issues of inflation and growing national debt, as well as the virtues of personal responsibility. But it also marked an amplification of hostility toward government in general and a disincentive for young people to seek jobs in the public sector.
“We have to take the stigma away from working for local governments,” said George “Mac” McCarthy, former president and CEO of the Lincoln Institute of Land Policy think tank in Cambridge, Mass. “We’ve been communicating horribly about government being a problem and not a solution — that it becomes an employer of last resort. And that’s a very bad thing because you’re not going to get the best and brightest if you do that. We need to treat those jobs with the import they actually have.”
Or as Malik Whitaker said, “We have to make working for government sexy again.”
Whitaker is a city administrator for Lake City in Florence County. He took the reins less than a year ago amid spiraling spending, possible bankruptcy and rising calls for accountability, including from billionaire philanthropist Darla Moore, who lives in Lake City and famously said she was “pistified” by the town’s past management.
Whitaker echoed others about the sense of purpose they feel and how they see the results in the streets and neighborhoods where they work and live. Public-sector jobs often aren’t easy, he said. “Managing large cities requires professional training,” he said, and pay needs to match this training.
But most of all, Whitaker said, “You have to have champions who celebrate the work.”
University of North Carolina at Chapel Hill’s School of Government has more than 160 staffers. The University of Georgia’s Carl Vinson Institute has more than 200 and is nearly 100 years old. The University of Tennessee Institute for Public Service has 200 employees, trained 43,000 people last year and generated a $2.7 billion economic benefit in that state.
South Carolina has the College of Charleston’s Joseph P. Riley Center for Livable Communities. It has three full-time staffers.
Despite its small size, the Riley Center has supported more than 200 local governments and nonprofits. But demand far surpasses the center’s capacity to help, said Kendra Stewart, the center’s director.
South Carolina has simply fallen behind other states when it comes to university-led government education programs.
The University of South Carolina’s Institute of Public Affairs once had a significant presence. But it took a hit in the early 2000s when its director and two other employees pleaded guilty to embezzling $90,000 from the university.
The Riley Center recently asked lawmakers for a $300,000 earmark to add two full-time staffers and two advisers. All earmarks were stripped from the new state budget, which lawmakers sent to Gov. Henry McMaster this week.
But even if lawmakers had approved the funding, South Carolina would still be miles behind other states in this arena. Experts say that if South Carolina wants to make lasting improvements in local governments, state leaders and philanthropists should create a more substantial university public service institute.
South Carolina has 271 towns and cities; 40 have fewer than 200 residents.
As detailed in a 2023 Post and Courier Boom and Balance report, some are towns in name only, clinging to more prosperous pasts but lacking the population base or energy to properly function. South Carolina law says a municipality’s charter becomes void if its population falls below 50. The 2020 Census initially put Cope (Orangeburg County) and Jenkinsville (Fairfield County) below that threshold. Both later provided evidence that they still had enough residents to remain incorporated.
Many residents in small towns told us about the importance of honoring the generations who lived there. They spoke about the sense of identity that comes with keeping the town’s name.
At the same time, it’s clear that many can no longer manage basic municipal tasks.
Some experts spoke about the need to offload police to counties and water and sewer utilities to regional utilities. A few cities already do this, especially when it comes to law enforcement. Policing is expensive, and even larger towns struggle to recruit and properly pay their officers. Lake City signed a management agreement with the Florence County Sheriff’s Office to oversee law enforcement while the city gets its finances in order, said Whitaker.
One possibility would be a new form of incorporation allowing very small communities to retain limited powers, such as annexation, while shifting costly services elsewhere.
Think “village” instead of “town.”
An unfortunate recurring theme in South Carolina’s local government story is the scandalous intersection of police and politics.
Consider McBee in Chesterfield County. State Law Enforcement Division agents recently arrested the mayor, police chief and two former police officers on charges stemming from what investigators allege was a scheme to use traffic tickets to raise money for town expenses. SLED included texts from these officials in court papers. In one, the mayor texted the chief: “Can you try to write 4 or 5 a day to help me pay for the new loan.”
Or take a look at Pelion, where a councilman handed a police chief a $500 gift card amid an investigation into a family member of the mayor.
Or any number of other places. About one-third of the municipal misconduct cases identified in a Post and Courier analysis involved police and sheriff’s departments.
SLED already handles a crush of investigations into police shootings and other cases. It needs help from the Criminal Justice Academy to better weed out problem officers and work with communities to prevent politics from affecting police work.
The Criminal Justice Academy doesn’t “get into the politics of departments,” a spokesperson said, adding that the academy also has no policies or programs that address ethical conflicts and improper political pressure between police departments and elected officials.
Twenty years ago, towns often hired local CPAs to do municipal audits.
“They were happy to do it after the tax season because it filled out their summers,” said Robert Jordan, a CPA in Florence County.
But municipal accounting grew much more complex, in part because the profession’s regulatory bodies added more requirements.
“The regulation overload just killed it for the local CPA,” Jordan said.
Yokim, Florence County’s administrator, noted that the county’s audit has page after page of footnotes. A single entry about the state’s retirement system “is probably nine pages. It’s crazy.” (It’s actually 10 pages).
Joel Black, chair of the Governmental Accounting Standards Board, which sets accounting and financial-reporting standards for state and local governments, said his group is researching ways to make governmental accounting less complex.
But Jordan and others suggested that a state task force take a look at audit requirements in South Carolina and come up with “agreed-upon procedures” that reduce some of those onerous footnotes.
This story was made possible by generous reader donations to The Post and Courier Investigative Fund.
To contribute, please go to postandcourierfund.com.
You can also send a check to the Spartanburg County Foundation, 424 E Kennedy Street, Spartanburg, SC 29302, and write “Post and Courier Investigative Fund” in the subject line.
Investments in scrutiny
Big and small, these ideas to help small towns have an underlying theme that parents of teenagers know well: Without someone watching, mischief is more likely to happen.
The stakes are high. Without better chaperones, failing towns could put dents in the state’s pension and insurance systems. Or counties may be forced to pick up the slack, as Florence County did recently by loaning millions of dollars to cash-strapped Lake City, Johnsonville and Pamplico.
The benefits of more accountability also are high. A Yale researcher studied 10 states that increased scrutiny of municipal finances. She found these statewide monitoring efforts were associated with healthier finances and less corruption.
News organizations also have a role. The Post and Courier’s “accountability desert” map shows places where scrutiny is weaker in part because they’ve lost reporters and editors. A recent study by Rebuild Local News estimated that local governments in news deserts pay an additional $1.1 billion a year in borrowing costs.
And social media can’t fill the void, said Glover of the Municipal Association. “Social media has all the powers of the press and none of the accountability.”
Beyond the eight ideas described here, there’s no shortage of others: Create new university programs to train finance officers; build a pool of funding to help towns with audit backlogs get caught up. Vincent Coe, a candidate for treasurer, proposed a “municipal risk” online dashboard that tracks late audits, shrinking fund balances and finance office turnover. Many suggested South Carolina needs a comprehensive game plan.
Over and over, we also heard: Whatever the plan, “it needs to have teeth.”
Because like teens, towns that don’t face consequences have no reason to change.
Below: Who’s to blame for the small town fiscal crisis?
You be the judge! Use the slider to move the needle and tell us who is paying attention (or not) to small towns in South Carolina.
Submit your ratings to compare them with the average scores from other readers.
How your picks compare
0
Asleep
Alert
Sleeping like a baby
`;
dialGrid.appendChild(card);
const range = card.querySelector(“input”);
const gauge = card.querySelector(“.gauge”);
range.addEventListener(“input”, () => {
values[subject] = Number(range.value);
touched[subject] = true;
updateDial(subject);
});
gauge.addEventListener(“click”, (event) => {
const nextValue = getGaugeValueFromClick(gauge, event);
values[subject] = nextValue;
touched[subject] = true;
range.value = String(nextValue);
updateDial(subject);
});
updateDial(subject);
});
}
function getGaugeValueFromClick(gauge, event) {
const rect = gauge.getBoundingClientRect();
const centerX = rect.left + (rect.width / 2);
const centerY = rect.bottom;
const deltaX = event.clientX – centerX;
const deltaY = centerY – event.clientY;
if (deltaY “, “>”)
.replaceAll(‘”‘, “””)
.replaceAll(“‘”, “‘”);
}
function describeDifference(userScore, crowdScore) {
const difference = userScore – crowdScore;
const absolute = Math.abs(difference).toFixed(1);
if (Math.abs(difference) 0) {
return `You rated this ${absolute} points higher than other readers.`;
}
return `You rated this ${absolute} points lower than other readers.`;
}
function renderComparison(data, isSample = false) {
const results = document.getElementById(“comparisonResults”);
const meta = document.getElementById(“comparisonMeta”);
const count = Number(data.responseCount || 0);
results.className = “comparison-grid”;
results.innerHTML = subjects.map((subject) => {
const userScore = Number(values[subject]);
const crowdScore = Math.max(0, Math.min(10, Number(data.averages?.[subject] ?? 0)));
const userWidth = userScore * 10;
const crowdWidth = crowdScore * 10;
return `
${escapeHtml(subject)} ${describeDifference(userScore, crowdScore)}
${userScore.toFixed(0)} vs. ${crowdScore.toFixed(1)}
`;
}).join(“”);
meta.textContent = isSample
? `Preview using sample averages from ${count.toLocaleString()} fictional responses.`
: `Compared with ${count.toLocaleString()} reader responses.`;
}
function validateConfig() {
if (!GOOGLE_FORM_ACTION || !SHEET_CSV_URL) {
throw new Error(“Add the Google Form action URL and linked sheet CSV URL first.”);
}
subjects.forEach((subject) => {
if (!FORM_FIELDS[subject] || !FORM_FIELDS[subject].startsWith(“entry.”)) {
throw new Error(`Add the Google Form entry id for “${subject}”.`);
}
});
}
function getUnansweredSubjects() {
return subjects.filter((subject) => !touched[subject]);
}
function submitToGoogleForm() {
return new Promise((resolve, reject) => {
try {
validateConfig();
const iframe = document.getElementById(“townfallFormTarget”);
const form = document.createElement(“form”);
form.method = “POST”;
form.action = GOOGLE_FORM_ACTION;
form.target = iframe.name;
form.style.display = “none”;
subjects.forEach((subject) => {
const input = document.createElement(“input”);
input.type = “hidden”;
input.name = FORM_FIELDS[subject];
input.value = String(values[subject]);
form.appendChild(input);
});
document.body.appendChild(form);
const cleanup = () => {
form.remove();
iframe.removeEventListener(“load”, onLoad);
};
const onLoad = () => {
cleanup();
resolve();
};
iframe.addEventListener(“load”, onLoad, { once: true });
form.submit();
window.setTimeout(() => {
cleanup();
resolve();
}, 1500);
} catch (error) {
reject(error);
}
});
}
function parseCsv(text) {
const rows = [];
let row = [];
let value = “”;
let inQuotes = false;
for (let i = 0; i [subject, 0]))
};
}
const headers = rows[0];
const subjectIndexes = Object.fromEntries(
subjects.map((subject) => [subject, headers.indexOf(subject)])
);
subjects.forEach((subject) => {
if (subjectIndexes[subject] === -1) {
throw new Error(`Missing “${subject}” column in linked sheet feed.`);
}
});
const dataRows = rows.slice(1).filter((row) =>
subjects.some((subject) => row[subjectIndexes[subject]] !== “”)
);
const totals = Object.fromEntries(subjects.map((subject) => [subject, 0]));
dataRows.forEach((row) => {
subjects.forEach((subject) => {
totals[subject] += Number(row[subjectIndexes[subject]]) || 0;
});
});
const responseCount = dataRows.length;
const averages = {};
subjects.forEach((subject) => {
averages[subject] = responseCount
? Number((totals[subject] / responseCount).toFixed(1))
: 0;
});
return {
responseCount,
averages
};
}
async function submitAndCompare() {
const button = document.getElementById(“compareButton”);
const meta = document.getElementById(“comparisonMeta”);
const results = document.getElementById(“comparisonResults”);
if (hasSubmitted) {
return;
}
button.disabled = true;
button.textContent = “Comparing…”;
meta.textContent = “”;
results.className = “comparison-meta”;
results.textContent = “Loading reader averages…”;
try {
const unanswered = getUnansweredSubjects();
if (unanswered.length) {
throw new Error(
unanswered.length === 1
? `Select a number for ${unanswered[0]}.`
: “Select a number for each one before submitting.”
);
}
if (!GOOGLE_FORM_ACTION || !SHEET_CSV_URL) {
await new Promise((resolve) => setTimeout(resolve, 350));
renderComparison(sampleAudienceData, true);
return;
}
await submitToGoogleForm();
await new Promise((resolve) => setTimeout(resolve, 1800));
const data = await fetchAudienceDataFromSheet();
renderComparison(data, false);
hasSubmitted = true;
button.textContent = “Submitted”;
} catch (error) {
results.className = “comparison-error”;
results.textContent = error.message || “We could not load the reader comparison. Please try again.”;
console.error(error);
button.disabled = false;
button.textContent = “Review your Townfall scorecard and submit”;
return;
} finally {
if (!hasSubmitted) {
return;
}
}
if (hasSubmitted) {
button.disabled = false;
button.disabled = true;
button.textContent = “Submitted”;
}
}
document.getElementById(“compareButton”).addEventListener(“click”, submitAndCompare);
buildDials();



