How to sync Focus School Software with Kastr

There is no Focus partnership and no connector. Focus does have Advanced Reports, scheduled delivery and an API, and any of those produces an export your job can turn into Kastr roster entries. The two things worth getting right the first time are which fields you select and how you translate Focus's contact flags, get those wrong and the export validates cleanly while messaging the wrong adults.

Last reviewed 2026-08-04

Focus Advanced Report field selection, what to include and what breaks if you omit it
FieldRequiredIn the roster entryIf you leave it out
Student local IDYessourceIdExtEvery record is an add, then a withdrawal, every night
Legal and preferred nameYesgivenName, familyNameMessages address children by a name their family does not use
School / campusRecommendedNot part of an entry; used for scoping and countsYou cannot check counts building by building
Enrolment status and datesYesDecides who is in the batchWithdrawn students stay active indefinitely
Grade levelOptionalNot part of an entryNo effect: Kastr has no grade audience
Contact name and relationshipYesGuardian entry, linked by guardianOfSourceIdStudents arrive with no reachable adult
Custody flagYesDecides whether the adult is exportedThe wrong adults are exported as guardians
Lives-with flagRecommendedYour inclusion ruleNo basis for deciding about household adults
Emergency-contact flagYesNot exported: leave these adults outNeighbours and aunts receive the newsletter
Mailing flagRecommendedYour inclusion ruleOver-messaging adults who asked to be emergency-only
Phone number with typeYesThe phone field, mobile onlyLandlines treated as SMS-capable, so texts to them fail
Email addressYesThe email fieldNo fallback channel when SMS fails
Preferred language, per adultRecommendedlanguagePrefWhole household defaults to English

Build the report with exactly these columns and your job has everything it needs on the first attempt in most districts. The two rows people skip are phone type and the emergency-contact flag, and they are the two that produce complaints from real adults within a fortnight of going live.

Translating Focus contact flags into who gets messaged

Focus carries several independent indicators on a contact, custody, emergency, lives-with, mailing, and they do not mean the same thing. The translation is a decision your district makes once and should write down.

  • Custody flagged → guardian entry. Receives everything, including urgent sends that bypass quiet hours.
  • Lives-with flagged, not custody → guardian entry or left out, depending on your policy. Usually included.
  • Emergency flagged only → left out of the export. A roster entry has no emergency-only setting, so that adult is reached through your emergency notification system, not Kastr. This distinction is the one that decides whether an aunt three towns away receives the spring concert reminder.
  • Mailing flagged → include in routine sends. Where a family has explicitly asked for one adult to receive correspondence, honour it.
  • Nothing flagged → do not send them as a guardian entry. Export the list, look at it, and hand it back to the office. An unflagged adult attached to a student record is usually a data-hygiene finding rather than a recipient.

On consent state. A roster entry has no consent field, so nothing in the Focus export sets it; SMS consent and opt-outs are applied in Kastr when each text is sent, which matters for 10DLC and TCPA purposes. Focus is unlikely to hold a text-messaging consent field anyway, so decide your district's position with counsel before the first send rather than defaulting silently. Do not assert consent you cannot evidence, recording consent you did not collect is worse than recording none.

Scheduling the export, and the first three nights

The recipe most Focus districts land on:

  1. Build the Advanced Report with the columns above, filtered to active enrolments in the current year.
  2. Schedule delivery to a district-controlled SFTP location overnight. Focus can schedule report delivery, so nobody needs to remember to run it, which matters, because a roster that depends on a person remembering will fail in week three.
  3. Cron a POST from a district machine: a job that turns the report into JSON entries and sends them with plain curl or any HTTP client to POST /api/v1/roster/sync. The job runs on your infrastructure with a key you generated and can revoke; we hold no credentials to Focus and cannot reach into it.
  4. Check the first three nights by hand. The custom JSON roster API has no dry-run mode, so compare each batch's counts against Focus before it is sent. The diff engine SHA-256 hashes each record payload and classifies add, change, unchanged and withdraw.

What the three nights should show. Night one: everything is an add. Night two: almost everything unchanged, a handful of changes. Night three: a small number of genuine adds, changes and withdrawals. If night three still reports thousands of changes, the payload contains something non-deterministic, a generation timestamp, a re-ordered contact list, a trailing whitespace difference. Fix that before the job runs unattended, or the run counts become noise you stop reading.

Then reconcile five counts against Focus before it goes nightly: active students; student-guardian pairs; distinct guardians (which should be lower than the pair count, and if it is equal your de-duplication is not working); students with at least one SMS-capable number; and students with no contact point at all. That last list is the most valuable thing the exercise produces. Hand it to the office and fix it in Focus, Kastr never writes back, so a correction made downstream is overwritten by tonight's file.

The guardrail applies here as everywhere: a run that would withdraw more than half of active records aborts with aborted_guardrail and writes nothing. Pause the job during your year-end and rollover windows and run it attended.

Florida districts: survey windows, public records and retention

Focus has a large Florida footprint, and two state-specific realities interact with a communications roster.

The FTE survey calendar. Around survey weeks, enrolment records receive concentrated attention, corrections, reclassifications, status changes processed in batches. A nightly sync will show elevated change counts during those periods, which is normal and not a defect. What matters is that you know the weeks in advance so an unusual ledger does not trigger a false alarm, and so nobody accepts an anomalous file because they assumed it was survey noise. Mark the survey weeks on the same calendar as your rollover pause.

Public records. Florida's public-records framework is broad, and messages sent by a district are frequently records. Two practical consequences. First, write every message expecting to see it disclosed with its timestamp. Second, you need a message log whose integrity you can demonstrate rather than merely assert: Kastr keeps a per-district append-only audit log with a SHA-256 hash chain, each entry hashing the previous one, with UPDATE and DELETE revoked at the database role level and no update policy to fall back on. That produces a log that can be shown to be unaltered. Which specific records are exempt, and how student-record confidentiality interacts with disclosure, is a question for your district's counsel and not something a vendor page should answer.

Retention, stated honestly. Kastr derives a retention class from a person's role at creation, student, guardian or staff. What does not exist yet is automated enforcement: there is no scheduled job deleting records when a retention period expires, and there is no cryptographic proof of deletion. If your records-management policy requires enforced destruction on a schedule, that is a real gap today and you should hear it from us rather than discover it during an audit. Clause 7.1 gives you the contractual right to export everything, machine-readable and without fee, at any time, a right we honour on request, not a self-serve button.

Questions people actually ask

Can Focus schedule the export automatically or does someone have to run it?

Focus can schedule report delivery, so build the Advanced Report once and have it drop to a district-controlled SFTP location overnight. A cron job then turns it into JSON entries and POSTs them. Do not run a production roster off a manual export; it works for a pilot and fails in about week three when the person who runs it is on leave.

Which Focus contact flags decide who receives an urgent message?

Custody-flagged contacts go in as guardian entries and receive everything, including urgent sends that bypass quiet hours. Lives-with and mailing flags inform your inclusion rule. Emergency-only contacts should stay out of the export, because a roster entry has no emergency-only setting and Kastr is not an emergency notification system. Contacts with no flags at all are usually a data-hygiene finding rather than a recipient.

Does the Florida FTE survey window affect roster syncing?

It raises change counts, because enrolment records get concentrated corrections around survey weeks. That is normal. Mark the survey weeks on the same calendar as your rollover pause so an unusual ledger neither triggers a false alarm nor gets waved through as expected noise. Read the ledger during those weeks rather than skipping it.

Does Kastr have a Focus partnership?

No. There is no partnership, no certified connector and no Kastr code that authenticates to Focus. What exists is a documented endpoint that takes JSON entries, a diff engine, and a guardrail that aborts a run withdrawing more than half your active records. The custom JSON roster API has no dry-run mode. If a procurement document needs a partnership to point at, we do not have one.

One price. Every feature. Locked for three years.

$3.50 per student per year under 5,000 students. No tiers or add-on modules. Normal messaging is included under a published fair-use allowance, with transparent cost recovery only above it.