Most shelters don't lose municipal contracts because of bad animal care. They lose them—or bleed money on them—because of vague service definitions and reporting expectations that nobody pinned down in writing. Then six months in, a city clerk is asking for "live release rate by jurisdiction" in a format your software doesn't export, and you're pulling an all-nighter in a spreadsheet trying to reconstruct numbers you never agreed to track.
This is a reusable playbook. Pasteable SLA language, reporting rows you can drop into a monthly packet, CSV headers that won't fall apart across three municipalities, and negotiation phrasing that protects a small team from obligations it can't actually meet. The goal isn't to make you sound like a law firm. It's to make your contract match how your shelter actually runs.
The specific trap: "best effort" language and undefined reporting
Here's the pattern that burns small shelters. A city contract says the shelter will "provide animal control services and submit monthly reports." That's it. No definition of what a "report" contains, no response-time standard, no remedy if either side underperforms.
Everyone signs it because it feels low-commitment. Then reality fills in the blanks—usually in the city's favor. The animal control officer expects stray pickup within two hours. You assumed next-business-day for non-emergencies. Nobody wrote it down, so now you're in a dispute you can't win because there's no baseline to point to.
The second half of the trap is reporting. When the deliverable is just "monthly reports," the city defines the format later, and they redefine it every time a new council member asks a question. One month it's intake counts. Next month they want intake broken down by zip code, species, and outcome, retroactive to January. If your data wasn't structured to produce that from day one, you're rebuilding history by hand.
A contract that defines both the service levels (what you'll do) and the service level requirements (how it's measured and reported) turns these arguments into lookups instead of fights.
SLA vs SLR: the distinction small teams keep collapsing
People use SLA and SLR interchangeably and it causes real problems in multi-site contracts. Keep them separate.
Streamline your shelter operations effortlessly.
Animlly helps you manage every pet, volunteer, and adoption step with ease and accuracy.
- Comprehensive pet profiles
- Volunteer scheduling & communication
- Adoption tracking & reporting
No credit card required
-
SLA (Service Level Agreement) the promise. "Emergency stray calls responded to within 2 hours."
-
SLR (Service Level Requirement) the measurable target plus the threshold that counts as a miss. "95% of emergency calls answered within 2 hours, measured monthly; below 90% triggers remediation."
The reason this matters: a city can't hold you to a number you never agreed to measure, and you can't defend your performance without one. When you're covering two or three municipalities under separate contracts, uniform SLR definitions across all of them is the only way to keep reporting sane. Otherwise "response time" means something different in each town and your monthly packet becomes three incompatible documents.
A model SLA/SLR table you can adapt
| Service | SLA (the promise) | SLR (measured target) | Miss threshold | Measured as |
|---|---|---|---|---|
| Emergency stray pickup | Respond within 2 hrs | 95% within 2 hrs | <90% monthly | Timestamp dispatch → arrival |
| Non-emergency pickup | Respond next business day | 90% within 1 business day | <85% monthly | Call logged → resolved |
| Intake processing | Animal logged within 24 hrs | 98% within 24 hrs | <95% monthly | Physical intake → record created |
| Owner reclaim hold | Minimum stray hold honored | 100% compliance | Any violation | Hold-start → disposition date |
| Monthly report delivery | By 10th of following month | 100% on time | Any late submission | Submission timestamp |
| Field officer availability | Coverage during stated hours | ≥90% shift coverage | <85% monthly | Scheduled vs filled hours |
Two things small teams consistently get wrong here. First, they promise 100% on things with natural variance—like a 2-hour response time that depends on traffic and simultaneous calls. Promise 95%, not 100%, on anything weather- or volume-dependent. Second, they forget to define who times it. If the city's dispatcher logs the call and your officer logs the arrival, you need both timestamps or the whole SLR is unenforceable.
The monthly reporting package: build it once, reuse it everywhere
A reporting package is just a predictable set of sections you deliver on the same day each month, in the same structure, to every municipal partner. Predictability is the whole point. When the format never changes, the city stops asking for custom pulls and your team stops dreading the 10th.
A clean monthly package for a municipal shelter contract has five parts:
-
Cover summary — one page. Total intake, total outcomes, live release rate, SLR compliance scorecard (green/yellow/red against each threshold from your table).
-
Intake detail — counts by source (stray, owner surrender, transfer, confiscation), by species, by jurisdiction if multi-site.
-
Outcome detail — adoptions, returns-to-owner, transfers out, euthanasia (with the reason categories your contract specifies), died/lost in care.
-
SLR performance — each service level, the measured number, the target, and a flag for any miss plus a one-line remediation note.
-
Financial/census reconciliation — average daily population, length of stay, and any per-animal or per-call billing counts if your contract pays that way.
The mistake shelters make is treating each month as a fresh writing project. It isn't. It's the same template with new numbers. If building it takes more than an hour, your underlying data isn't structured for it—which is worth taking seriously. A lightweight data governance standard with export-ready mappings does more to protect a municipal contract than any single clause, because it means the numbers already exist in the shape the report needs.
Simple workflow for assembling the monthly package:
Keep the header row identical across every municipality. The difference between a 30-minute monthly report and a 6-hour one is almost always whether the raw export already matches the report structure.
Compact CSV headers that survive three municipalities
When you report to more than one jurisdiction, the temptation is to make a custom spreadsheet per city. Don't. Use one master schema with a jurisdiction column, and filter. Here's a compact header set that covers most municipal reporting without bloat:
recordid,jurisdiction,intakedate,intaketype,species, outcomedate,outcometype,outcomereason,losdays, reclaimflag,zipcode,callreceivedts,officerarrived_ts
-
jurisdictionis a controlled value, not free text. "City of Marden," "Marden," and "marden" will fragment your counts. Pick one spelling per contract and lock it. -
intaketypeandoutcometypemust use the exact category words in the contract. If the contract says "returned to owner" and your system exports "RTO," map it before it reaches the report, not after. -
callreceivedtsandofficerarrivedtsare what prove your response-time SLR. If you only track dates and not timestamps, you cannot report a 2-hour standard. This is the single most common reason shelters can't defend performance. -
los_daysshould be calculated from your two date fields, never typed. Typed durations drift.
Keep the header row identical across every municipality. The difference between a 30-minute monthly report and a 6-hour one is almost always whether the raw export already matches the report structure.
Simple data-exchange expectations (write these into the contract)
Data exchange is where polite assumptions turn into friction. Spell out four things in plain language and you'll avoid most of it:
-
Format and cadence. "Shelter provides a monthly CSV and PDF summary by the 10th. Ad-hoc requests acknowledged within 3 business days; delivery within 10." That last clause stops the Tuesday-afternoon "can you get me this by end of day" spiral.
-
Who owns what field. The city owns dispatch timestamps; the shelter owns intake and outcome records. If a response-time dispute arises, both timestamps are required. No shared timestamp, no SLR claim.
-
Correction window. "Either party may flag data discrepancies within 30 days of a report; corrections issued in the next monthly cycle." This keeps a mistake from reopening six months of history.
-
PII handling. Finder names, surrendering-owner contact info, and addresses get redacted from standard municipal reports unless the contract specifically requires them for a legal purpose. Report aggregate zip codes, not addresses, by default.
That last point matters more than most teams expect. A council member asking for "a list of every surrender last month" may not realize they're asking for personal data. Having the redaction default written into the contract lets you say "the contract specifies aggregate reporting" instead of improvising a privacy decision under pressure.
Performance-remediation steps: the part that keeps you from losing the contract
A single bad month shouldn't end a contract, and a well-written remediation ladder makes sure it doesn't. The structure below protects both sides and—critically—gives a small team room to recover before anyone invokes termination.
-
First miss (any SLR below threshold) Shelter notes the miss in the monthly report with a one-line cause and a corrective action. No penalty. This is just transparency.
-
Second consecutive miss on the same SLR Shelter submits a short remediation plan (half a page max) within 15 days—what changed, what you're doing, expected recovery month.
-
Third consecutive miss Joint review meeting. Both parties assess whether the SLR target is realistic or whether resources or scope shifted. Targets can be renegotiated here.
-
Sustained failure (e.g., 90+ days unresolved) Formal cure period, typically 30–60 days, before any termination-for-cause clause activates.
The negotiation point most small shelters miss: always tie termination-for-cause to a completed remediation ladder, never to a single breach. Cities often table a one-strike termination clause because it's standard boilerplate. You're not being difficult by asking for a cure period—you're asking for something every commercial contract has. Frame it as "standard cure language" and it usually sails through.
Negotiation language a small team can actually reuse
You don't need a lawyer to table reasonable protective clauses. You need the right phrasing. Here are passages shelters can paste and adapt:
-
Scope protection "Services are limited to the categories defined in Exhibit A. Additional service categories require a written amendment and corresponding fee adjustment." This stops scope creep where "animal control" quietly expands to include wildlife, livestock, or cruelty investigations you never priced.
-
Volume safety valve "SLR targets assume monthly intake within ±20% of the trailing twelve-month average. During a documented surge exceeding this range, response-time SLRs are suspended and replaced by best-effort service for the duration." A small team cannot hold a 2-hour response during a hoarding case that triples intake. Write the exception in.
-
Cure before termination "Termination for cause requires written notice specifying the deficiency and a cure period of not less than 30 days, provided the shelter is actively executing an agreed remediation plan."
-
Reporting reciprocity "City shall provide dispatch timestamps and call logs necessary to measure response-time SLRs within 5 business days of month-end. SLR measurement is suspended for any period where city-held data is not provided." This is fair and it protects you—if they don't give you the timestamps, you can't be dinged for the metric.
-
Fee review "Per-animal and per-call rates subject to annual review tied to documented cost changes." Multi-year contracts without this clause quietly erode as fuel, medical, and staffing costs rise.
The pattern across all of these: you're not asking for favors, you're asking for symmetry. Every obligation on you should have a matching dependency or protection. That framing—symmetric asks rather than open-ended ones—tends to land better in negotiations than you'd expect.
A real scenario: two towns, one unworkable report
A shelter covering two neighboring towns ran contracts worth roughly $110k–$130k combined annually. Both contracts said "monthly reports" with no format specified. Town A's clerk wanted intake by zip. Town B's wanted outcomes by species with euthanasia reasons spelled out. The coordinator was spending close to two full days a month reconciling two different spreadsheets, and response-time disputes came up twice because nobody had agreed on how the 2-hour standard was measured.
They rebuilt around one master CSV schema with a jurisdiction column and a fixed five-section monthly packet, identical for both towns—just filtered. They added timestamp fields for call-received and officer-arrived, and wrote a reporting-reciprocity clause into the Town A renewal requiring the dispatch logs.
Monthly reporting dropped from roughly two days to half a day. The response-time disputes stopped because both timestamps were now required and logged. When Town B's council asked for a new breakdown mid-year, it was a filter on existing data instead of a weekend rebuild. The contracts didn't change in value—but the cost of servicing them dropped noticeably, and the relationship got less tense.
When this level of structure makes sense (and when it's overkill)
This full playbook is worth the effort when you hold more than one municipal contract, when a contract is worth enough that losing it would genuinely hurt, or when you're renewing and have leverage to renegotiate terms. Multi-site networks especially need the uniform schema, because inconsistency scales badly.
It's overkill if you have a single small contract with a town you've worked with for years and the reporting is genuinely light. In that case, just add the SLR table and the cure-period clause at your next renewal and skip the rest. Don't build a reporting apparatus bigger than the contract.
One important caveat: if a contract includes cruelty-investigation authority, euthanasia mandates beyond your current protocols, or anything touching legal enforcement powers, get a lawyer to review the liability and indemnification sections specifically. The reporting and SLR scaffolding here is safe to self-manage. The liability transfer is not.
Where this connects to the rest of your operations
Municipal reporting doesn't live in isolation. The cleaner your internal data taxonomy, the less any of this costs you each month—which is why getting your export headers and data dictionary standardized pays off directly in contract reporting.
And if you're part of a network sharing load across jurisdictions, aligning these SLR definitions with your regional mutual-aid governance prevents the awkward situation where a transferred animal gets counted—or missed—in two different cities' reports.
Bottom line
The shelters that hold onto municipal contracts aren't the ones with the best lawyers. They're the ones whose contract language matches their actual operations, whose reporting is a filter instead of a rebuild, and whose SLRs include the exceptions a small team genuinely needs.
Define the service levels. Define how they're measured. Build the reporting package once. Lock a cure period before any termination clause. Do those four things consistently and the contract stops being a monthly source of dread and starts being what it should be—a stable, fundable part of how your shelter serves its community.
Ready to enhance your shelter’s impact?
Join 500+ shelters using Animlly to improve care coordination, increase adoptions, and engage communities effectively.