Sync / roster
Sync applicants, decisions, and enrolment status between the SIS and Slate so admissions and the registrar stay aligned.
Admissions lives in Slate; the record of truth for enrolled students lives in the SIS. When the two drift, applicants fall through the gap between "admitted" and "enrolled". This sync moves applicant and decision data into the SIS and enrolment status back into Slate, keyed consistently, so both sides tell the same story.
A working piece from this integration — no sign-up. The full build handles the edge cases, safeguards, and cutover.
# Sync a final admission decision from SIS to Slate # Slate REST API — POST /api/decision PUT https://campus.example.edu/api/application/{slateAppId}/decision { "decision": "Accept", // SIS: DEC_FINAL_CODE "decisionType": "final", "timestamp": "2024-05-15T09:30:00Z", "term": "2025 Fall", "degree": "B.A.", "major": ["UNDECLARED"], // SIS: MAJ_1_CODE "sendNotification": true, "sendToApplicant": true, "externalId": "SIS-2024-0078234" } # Lookup Slate App ID by SIS student ID before calling decision endpoint GET https://campus.example.edu/api/query? q=Select * from Applications where externalId = '{sisPersonId}'
| SIS Field | Slate Field | Notes |
|---|---|---|
PERSON.SIS_ID | externalId | Join key — persist on app creation |
APP.DEC_FINAL_CODE | decision | "Accept", "Deny", "Waitlist", "Defer" |
STU.ADMIT_TERM | term | Use Slate term lookup key |
STU.ENROLL_STATUS | Enrollment Status | Sync via material status endpoint |
How we'd take this from discovery to a production-safe cutover — the phases, the canonical mapping, and the edge cases that bite.
Syncs applicant records, decision outcomes, and confirmed enrolment from the Student Information System into Slate so the admissions office and registrar share a single authoritative view. The integration runs on a scheduled batch pull from the SIS export tables, transforms records through a staging schema, and upserts into Slate via the Reader application or direct API calls.
PersonID, ApplicationID) and the SIS surrogate keys used to match records. Document one-to-one mappings versus transformation logic (e.g., status codes to Slate decision types).stg_slate_sync) with tables mirroring the SIS export layout. Build ETL logic: filter records changed since the last sync run, apply de-duplication (prefer latest SIS record on key collisions), and map decision codes to Slate DecisionType and DecisionStatus values./api/rpc/batchUpsert (verify endpoint name in your Slate version). Log every upsert attempt with a correlation ID linking back to the SIS source row.LookupID scenarios. Validate decision status transitions in Slate UI.| SIS Field | Slate Identifier / Column | Notes |
|---|---|---|
applicants.person_id |
PersonID (Slate Person key) |
Primary join key; maps to Slate Lookup ID |
applicants.first_name |
First Name |
Direct map; apply title-case before load |
applicants.last_name |
Last Name |
Direct map; strip leading/trailing spaces |
applications.application_id |
ApplicationID (Slate Application key) |
Used for decision linkage; must be stable across loads |
decisions.decision_code |
DecisionType |
Transform SIS codes to Slate enumerated values (e.g., ADMIT, Deny) |
decisions.decision_date |
DecisionDate |
ISO 8601 format; push null if not yet decided |
enrollment.status_code |
EnrollmentStatus (custom Slate field) |
Requires a pre-created Slate dataset field; values: Confirmed, Withdrawn, Deferred |
enrollment.program_code |
Program |
Matches Slate term/program lookup; trim to 50 characters |
First Name + Last Name + Date of Birth must be configured before the first load or records will split.Enrolled before the formal decision record exists; the pipeline must guard against linking enrollment to a missing ApplicationID.DecisionDate — Slate rejects a decision record without a date; default to the record creation timestamp in SIS when the field is null.Retry-After headers.Begin with a full historical load during a maintenance window, then switch to delta-sync on the next scheduled cycle. Before going live, validate that row counts in Slate match SIS counts for every application_id in the prior 12 months. Keep the SIS export tables readable for a 48-hour rollback window; if Slate record counts diverge, run a reconciliation query joining on PersonID and ApplicationID, and re-run the batch for the affected application_id set. Once reconciled, disable the rollback path and promote the integration to steady-state monitoring with alerts on sync lag exceeding 15 minutes.
Reading the reference is free. Delivering it under liability — with the safeguards that keep production running through the cutover — is what we do.