Skip to main content
Operational Specification for Integration Exports: Sample Schemas, Acceptance Tests and Sign-Off Checklists

Operational Specification for Integration Exports: Sample Schemas, Acceptance Tests and Sign-Off Checklists

A practical spec so your vendor exports don't quietly break your downstream systems

Most integration problems in K-12 don't announce themselves. A nightly export runs for eight months, then one January morning the state reporting pipeline chokes on a null enrollment_status that used to always be populated. Nobody changed anything on your side. The vendor pushed a "minor" patch and dropped a field that three of your systems depended on.

This keeps happening because the contract between you and the vendor was never written down at the field level. Someone agreed to "provide a student export," a file appeared, it looked fine, and everyone moved on. No schema, no validation rule, no staged acceptance test, no sign-off either side could point back to. When the export drifts, there's no shared definition of "correct" to argue against.

This piece is about writing that definition — not a legal contract, but an integration export specification that a K-12 district and a vendor can both sign, test against, and enforce. It covers the sample payload, the validation rules, the staged acceptance tests, and the sign-off checklist for both sides.

Why "it looked fine in the demo" is the most expensive sentence in integration

The demo file is almost never representative. Vendors build sample exports from clean test students — one address, one guardian, an active enrollment, an English name with no diacritics. Your real data has the kid who transferred mid-year twice, the guardian with two last names, the student with a suppressed record, and the sibling group sharing a household ID.

A typical example: a district accepts a nutrition-eligibility export because the 12-row sample validated perfectly. In production, roughly 4% of rows carried a household_income field formatted as "$0" instead of 0 or null, because the vendor's UI let staff type free text. That 4% didn't fail loudly. It silently sorted those families into the wrong eligibility band until a manual audit caught it months later.

The specification's whole job is to make the ugly cases explicit before go-live. If the spec doesn't describe how the vendor represents a withdrawn student, a null value, or a multi-guardian household, you haven't specified anything — you've just described the happy path.

What goes in an integration export specification

Keep it to five components. Anything more and nobody maintains it; anything less and it's not enforceable.

ComponentWhat it definesWho owns it
Sample payloadOne realistic file with edge cases includedVendor drafts, district approves
Field dictionaryEvery field: type, nullability, format, source of truthJoint
Validation rulesMachine-checkable pass/fail conditionsDistrict
Staged acceptance testsGated tests from schema → sample → pilot → productionDistrict runs, vendor supports
Sign-off checklistExplicit approvals before each stage advancesBoth

The thing that separates specs that hold up from specs that rot is the source of truth column in the field dictionary. For every field, write down which system is authoritative. When two systems both claim to own dateofbirth, you eventually get two different birthdays for one child and reconciliation becomes manual. Naming the owner per field is the same discipline that makes canonical pipelines for state reporting survivable — the export spec is just that principle applied at the vendor boundary.

Sample payload: write it with the edge cases baked in

Don't accept a "clean" sample. Ask the vendor to produce one that deliberately includes the messy realities. A student export sample should carry rows for:

  1. An actively enrolled student with a complete record
  2. A student withdrawn mid-year (so you see how exitdate and enrollmentstatus interact)
  3. A student with two guardians in separate households
  4. A record with a legitimately null optional field
  5. A name containing an apostrophe and a hyphen (O'Brien-Martinez)
  6. A student with a suppressed / directory-opt-out flag

Here's a trimmed sample payload for a student roster export, showing how nullability and edge cases should look on the page:

{ "exportid": "roster-2025-01-14T02:00:05Z", "recordcount": 4, "records": [ { "studentid": "100482", "firstname": "Marcus", "lastname": "O'Brien-Martinez", "dateofbirth": "2013-09-02", "enrollmentstatus": "active", "exitdate": null, "grade": "06", "directoryoptout": false, "guardians": [ {"guardianid": "G-771", "relationship": "mother", "householdid": "H-40"}, {"guardianid": "G-772", "relationship": "father", "householdid": "H-41"} ] }, { "studentid": "100510", "firstname": "Ava", "lastname": "Nguyen", "dateofbirth": "2012-03-18", "enrollmentstatus": "withdrawn", "exitdate": "2024-11-08", "grade": "07", "directoryoptout": true, "guardians": [ {"guardianid": "G-802", "relationship": "guardian", "householdid": "H-55"} ] } ] }

Notice what this forces into the open: exit_date is null for the active student and populated for the withdrawn one. If the vendor's real export sends an empty string "" instead of null, or just omits the key entirely, your validation catches it because the sample already told everyone what correct looks like.

Validation rules: make them machine-checkable, not English

The most common failure in these specs is validation rules written as prose — "student ID should be valid" or "dates should be reasonable." Nobody can run those. Rules have to be conditions a script can evaluate to true or false.

Split them into three tiers so failures get triaged instead of dumped in one pile:

Tier 1 — Reject the file (hard stops):

  1. record_count must equal the actual number of records
  2. student_id must be present, unique, and non-null on every row
  3. enrollmentstatus must be one of active, withdrawn, graduated, noshow
  4. File must parse as valid JSON/CSV with no truncation

Tier 2 — Quarantine the row (soft failures):

  1. If enrollmentstatus = withdrawn, then exitdate must be non-null and not in the future
  2. dateofbirth must produce an age between 3 and 21
  3. grade must be in the district's valid grade set
  4. Every guardian_id must reference a resolvable household

Tier 3 — Flag for review (warnings):

  1. More than 2% of rows with a null optional field that's usually populated
  2. Row count changed more than ±15% from the previous run
  3. New value appearing in an enumerated field for the first time

That last Tier 3 rule — watching the shape of the data, not just individual rows — is what catches the silent vendor patch. When a vendor drops a field, the file still parses and every row still passes Tier 1. The "field usually 98% populated, now 100% null" signal is what tells you something changed upstream. Without it, you might not find out for weeks.

Staged acceptance tests: four gates, no skipping

Treat acceptance as gates, not a single pass/fail event. Each gate has an owner and can't be skipped because someone's in a hurry to go live before the enrollment window.

  1. Schema gate. The sample payload validates against the field dictionary. Types, nullability, and enumerations match. No production data yet — purely structural. Owner: district data lead.
  2. Sample gate. The district loads the edge-case sample into a staging copy of the downstream system and confirms every record lands correctly, including the withdrawn student and the multi-guardian household. Owner: district data lead + downstream system owner.
  3. Pilot gate. Run a real export against a limited scope — one school, or one grade band — for at least two full cycles (two nights, or two weekly runs). Compare record counts and spot-check 20–30 records by hand against the source system. Owner: joint.
  4. Production gate. Full-scope export runs in parallel with the old process (if one exists) for one cycle before cutover. Tier 3 warnings reviewed and explained, not just cleared. Owner: joint, with named sign-off.

The pilot gate is the one people try to skip, and it's the one that saves you. Even a single parallel cycle surfaces the difference between "the file is valid" and "the file is correct." Valid means it passed the rules. Correct means the withdrawn students actually match who withdrew.

Each gate should produce a dated record — even just a shared doc or email thread — so you have something to point at if the export breaks later and everyone starts arguing about what was tested.

A real scenario: the special-ed export that double-counted

A mid-size district — around 6,800 students across nine schools — brought on a new assessment vendor whose export fed both the SIS and a state-facing report. The demo file was flawless. They went live without a pilot gate because the calendar was tight.

Within the first two exports, the state report showed roughly 40 more students receiving services than the district actually had. The cause: students who transferred between two of the district's own schools appeared once under each school's site_id, and the export had no dedup key spanning sites. Every row was individually valid. The set was wrong.

Because there was no field dictionary naming studentid as the district-wide unique key independent of siteid, nobody had written a Tier 1 rule to catch cross-site duplicates. The fix took about three weeks of back-and-forth, a corrected resubmission, and a fair amount of trust rebuilding with the state contact. After they added a single rule — student_id unique across the entire file regardless of site — and a two-cycle pilot gate, the next three reporting periods went out clean.

The whole mess would have been a one-line validation rule caught in staging.

Sign-off checklist: owner and vendor, side by side

Sign-off isn't a signature on a PDF. It's a shared checklist where each item has a name next to it. Split it so nobody assumes the other side handled something.

Vendor sign-off:

  1. [ ] Sample payload includes all agreed edge cases
  2. [ ] Every field in the dictionary is documented with type, nullability, and format
  3. [ ] Null representation is consistent and documented (null, not "" or "N/A")
  4. [ ] Change-notification process defined

    how many days before a schema change, and to whom

  5. [ ] A rollback path exists if a bad export ships
  6. [ ] Point of contact named for export failures, with a response window

District (owner) sign-off:

  1. [ ] Source of truth assigned for every field
  2. [ ] Validation rules implemented and running automatically on each export
  3. [ ] Staging environment can load and verify the sample
  4. [ ] All four acceptance gates passed and dated
  5. [ ] Downstream system owners have confirmed the data lands correctly
  6. [ ] Someone owns the Tier 3 warning review each cycle — by name

The change-notification item on the vendor side is the sleeper. Most silent breakages come from vendors treating a field change as routine maintenance. Getting a defined notice window in the sign-off — even just five business days and an email to a named person — turns surprise breakages into scheduled work. This same evidence-trail discipline is what makes owner-mapped exports useful during an audit: when someone asks how you know this export is correct, you point at the signed gates and the running validation log.

When a full spec makes sense — and when it's overkill

Not every data handoff needs this much structure. A one-time export you'll load manually and never repeat doesn't justify four gates and a field dictionary.

Write the full spec when:

  1. The export feeds a downstream system automatically (state reporting, nutrition, transportation)
  2. It runs on a recurring schedule
  3. Wrong data has compliance or funding consequences
  4. More than one system consumes the same file

Keep it lightweight when:

  1. It's a one-off pull for a single analysis
  2. A human reviews every row before it's used anywhere
  3. The blast radius of a mistake is small and reversible

Anyone whose export touches state submissions or funding-linked counts should not skip this. The cost of a resubmission and a strained relationship with your state contact dwarfs the day or two it takes to write the dictionary and rules up front. That's not an exaggeration — a single corrected resubmission cycle often costs more staff time than the entire spec would have taken to write.

Where automation earns its place

Running Tier 1–3 validation by hand on every nightly export isn't realistic, and that's usually why the rules get written and then quietly ignored. The practical move is automated validation the moment a file lands — reject Tier 1 failures before they reach any downstream system, quarantine Tier 2 rows for review, and log Tier 3 warnings alongside the previous run's numbers for comparison.

Platforms built to manage school data workflows can watch for the file, apply the rule set, and route exceptions to the right owner instead of letting a bad export flow straight through. AI-powered operational software adds another layer here — flagging anomalies that don't trip a hard rule but deviate enough from historical patterns to warrant a look. The point isn't the tooling. A spec nobody enforces is just a document. The enforcement is what protects you.

Process diagram

Have the automation email the named owner for a Tier 2 quarantine with a direct link to the offending rows so triage doesn't stall.

The enforcement is what protects you.

Closing thought

An integration export specification is really just writing down what "correct" means before a file ever moves. The sample payload makes edge cases visible, the validation rules make correctness testable, the staged gates keep speed from overriding safety, and the sign-off checklist makes sure both sides actually own their half. Do this once per recurring export and the next silent vendor patch becomes a caught warning on a Tuesday morning instead of a scramble in front of your state contact three months later.

Built for Schools Tailored to educational workflows and administrative needs
Save Time Simplify attendance, scheduling, and communication processes
Engage Community Streamlined parent and teacher collaboration
Drive Success Data insights to support student achievement and operational growth