Middleware
Bidirectional sync of prospect records and application data between Ellucian CRM Recruit and Slate CRM using a middleware orchestration layer.
This integration establishes a bidirectional synchronization layer between Ellucian CRM Recruit and Slate (Technolutions), two admissions CRMs that institutions often run in parallel during transition periods or to serve different recruitment functions. The middleware (implemented via Dell Boomi) handles mapping of prospect entities, application stages, communication events, and document attachments between the two systems, with change-data-capture triggers ensuring near-real-time propagation.
The complexity arises from divergent data models: Ellucian CRM Recruit uses a PERSON-centric schema with associated APPLICATION sub-entities, while Slate uses a PERSON-APPLICATION junction model with separate EVENT and FORM objects. Field-level mapping requires careful translation of application funnel stages, program codes, and term identifiers, and bidirectional sync introduces collision risk that must be managed through timestamp-based or priority-based conflict resolution.
A working piece from this integration — no sign-up. The full build handles the edge cases, safeguards, and cutover.
Typical field mapping for a prospect-to-applicant record sync payload:
``` ```html| Ellucian CRM Recruit Field | Slate Field | Notes |
|---|---|---|
Prospect.PersonGUID |
person.guid |
Primary key join |
AcademicInterest.ProgramCode |
application.program |
Lookup via Program table |
Application.Status |
application.submissionStatus |
Enum: submitted, complete, under review |
Application.ApplyDate |
application.date |
UTC timestamp |
Prospect.CohortYear |
application.cycle |
Admissions cycle year |
// Middleware: Map CRM Recruit prospect → Slate application payload syncProspectToSlate(crmRecruitRecord) { mapProgramCode(crmRecruitRecord.AcademicInterest.ProgramCode); mapSubmissionStatus(crmRecruitRecord.Application.Status); mapDecisionDate(crmRecruitRecord.Decision.DecisionDate); // Slate API: POST /api/application/create POST "https://[school].technolutions.net/api/application/create" { guid": crmRecruitRecord.Prospect.PersonGUID, "application": { "program": mappedProgramId, "date": crmRecruitRecord.Application.ApplyDate, "submissionStatus": mappedStatus, "cycle": crmRecruitRecord.Prospect.CohortYear } } }
How we'd take this from discovery to a production-safe cutover — the phases, the canonical mapping, and the edge cases that bite.
=== Ellucian CRM Recruit → Slate (Technolutions) Admissions Sync === Integration Type: Bidirectional, event-driven via middleware orchestration ===
This integration connects Ellucian CRM Recruit as the system of record for prospect recruitment activity with Slate as the admissions processing and application management platform. A middleware orchestration layer (e.g., Boomi, MuleSoft, or custom API gateway) manages bidirectional delta-sync of prospect records and application data, resolving entity identities and preserving audit trails across both systems.
person.id + person.email as the stable anchor.ProspectCreated, ProspectUpdated, ApplicationSubmitted events; (b) corresponding Slate dataset write operations or API upserts. Implement the reverse leg for decision updates flowing back from Slate. Enforce idempotency using a middleware-side event log keyed on source_event_id.person.firstName, person.lastName, contact.phone; Slate owns application.status, decision.outcome. For concurrent updates to shared fields, timestamp-based last-write-wins with a 5-minute conflict window logged to a reconciliation table.sync_failure events for 72 hours. Set up alerts on event lag exceeding 15 minutes or error rate above 1%.| Concept | Ellucian CRM Recruit Field | Slate Field / Dataset | Notes |
|---|---|---|---|
| Person anchor | person.id (GUID) |
Person: ID (Slate dataset key) |
Cross-system ID stored in middleware resolution table |
| Email address | contact.emailAddress |
Person: Email |
Primary key for deduplication lookup; nullable in Ellucian |
| Application reference | application.id |
Application: ID |
TODO(verify) — Slate may expose as application.appId in Writer API |
| Application status | application.applicationStatus (code) |
Application: Status (Slate lookup) |
Map Ellucian status codes to Slate status GUIDs via a static lookup table |
| Program of interest | programOfInterest.code |
Program: Code (Slate dataset) |
TODO(verify) — Slate Program dataset structure and key field name |
| Application submitted date | application.submissionDate |
Application: Submitted Date |
Ellucian returns ISO 8601; validate timezone handling to UTC |
| Decision outcome | decision.outcome (Slate → Ellucian sync direction) |
Application: Decision (Slate lookup) |
Slate owns this field; write-back to Ellucian via decision.outcomeCode |
| Last sync timestamp | meta.lastModifiedDateTime |
Person: Last Modified |
Used for delta-sync polling window; capture from middleware event log |
contact.emailAddress already exists in Slate as an inactive record, the upsert will create a duplicate instead of reactivating. Middleware must query Slate for existing Person: Email matches and reactivate rather than insert.application.id is null (e.g., draft state) must be excluded from sync to prevent Slate write failures. Filter on application.applicationStatus != 'Incomplete' before queuing.programOfInterest.code that has no corresponding Slate Program dataset row will cause the application write to fail silently if not handled. Middleware should write to a program_pending_review Slate dataset and alert operations.person.emailAddress in Ellucian. Prospects without an email cannot be anchored in Slate. Sync must flag these records for manual review rather than create anonymous Slate entries.Cutover is executed as a coordinated, reversible dual-write period lasting a minimum of 5 business days. At T-48 hours, freeze all manual Slate writes to the datasets in scope (Application, Person, Program) and export a full Slate snapshot to a dated S3/blob container. Load the full Ellucian ID resolution table into the middleware, then trigger the historical backfill from Ellucian, validating record counts (±2% tolerance) against the Slate snapshot before proceeding. At T-0, enable live bidirectional sync with the middleware operating in "shadow-validate" mode for the first 24 hours: routing writes to both systems but logging diffs rather than propagating. If at any point error rate exceeds 2% or record lag exceeds 30 minutes, halt the live queue, revert Slate datasets from the snapshot, and disable the middleware sync engine. After 72 hours of clean live operation, mark shadow-validate complete and transition to full production mode. Maintain the Ellucian snapshot and Slate snapshot side-by-side for 30 days post-cutover to support reconciliation queries.
Reading the reference is free. Delivering it under liability — with the safeguards that keep production running through the cutover — is what we do.