Middleware
A middleware layer using SnapLogic or MuleSoft to bidirectionally sync student, enrollment, and engagement data between Ellucian Colleague and Salesforce Education Data Architecture.
This middleware integration establishes a bidirectional sync between Ellucian Colleague and Salesforce Education Data Architecture (EDA), enabling student, enrollment, and engagement data to flow between the institution's core student information system and its CRM without manual re-entry. The middleware layer—built on SnapLogic or MuleSoft—normalizes data schemas, handles deduplication via a shared person identifier, and maintains change-data-capture queues for near-real-time consistency.
The challenge lies in reconciling Colleague's relational, COBOL-derived data structures with EDA's object-oriented Account-Contact model, while ensuring that admission applications, enrollment events, and advising notes created in either system appear consistently and without duplication across both.
A working piece from this integration — no sign-up. The full build handles the edge cases, safeguards, and cutover.
<!-- Ellucian Colleague → Salesforce EDA Field Mapping (MuleSoft/SnapLogic) --> Ellucian Colleague → Salesforce EDA ──────────────────────────────────────────────────────────────────── Entity: STUDENTS Object: Contact ──────────────────────────────────────────────────────────────────── STUDENTS.PERSON_ID → Contact.UniqueId__c (external key) STUDENTS.FIRST_NAME → Contact.FirstName STUDENTS.LAST_NAME → Contact.LastName STUDENTS.EMAIL → Contact.Email STUDENTS.PHONE → Contact.Phone STUDENTS.BIRTH_DATE → Contact.Birthdate STUDENTS.ADDR1, STUDENTS.CITY, STUDENTS.STATE, STUDENTS.ZIP → Contact.MailingAddress ──────────────────────────────────────────────────────────────────── Entity: ENROLLMENTS Object: Course Enrollment ──────────────────────────────────────────────────────────────────── ENROLLMENTS.PERSON_ID → CourseEnrollment.Contact__c (lookup) ENROLLMENTS.COURSE_SECTION → CourseEnrollment.CourseOffering__c ENROLLMENTS.STATUS → CourseEnrollment.Status__c ENROLLMENTS.MODE → CourseEnrollment.EnrollmentType__c (A=Administrative, W=Waitlist) ENROLLMENTS.START_DATE → CourseEnrollment.EnrollmentDate__c
How we'd take this from discovery to a production-safe cutover — the phases, the canonical mapping, and the edge cases that bite.
This integration synchronizes student demographics, enrollment records, and engagement activities between Ellucian Colleague and Salesforce Education Data Architecture via middleware (MuleSoft or SnapLogic), maintaining referential integrity across both platforms through shared student identifiers and scheduled batch processing.
STU to EDA Contact (and parent Account), ENR to Course_Connection__c, and STU.ENGAGEMENT to EDA Engagement__c. Document all transforms in a shared mapping spreadsheet.student-sync-flow, enrollment-sync-flow, and engagement-sync-flow. Use DataWeave for field transformations. Configure idempotent message processing using STU.ID as correlation ID.Student_ID__c. Enable error handling with Dead Letter Queues for failed records.LastModified timestamps per entity. In SnapLogic, use a PostgreSQL-based control table to track sync cursors.LastName, FirstName on Account).STU.ID counts, ENR status codes, and GPA fields. Resolve discrepancies before promoting to production.| Ellucian Colleague Entity | Colleague Field | Salesforce EDA Object | EDA Field | Transform Notes |
|---|---|---|---|---|
STU |
STU.ID |
Contact | Student_ID__c |
Primary key; upsert on Contact |
STU |
STU.FIRSTNAME |
Contact | FirstName |
Trim whitespace; map to Account separately |
STU |
STU.EMAIL |
Contact | Email |
Validate format; update only if populated |
STU |
STU.ACAD.LEVEL |
Contact | Primary_Education_Level__c |
Code translation table: U=Undergraduate, G=Graduate |
ENR |
ENR.CRS |
Course_Connection__c | Course_Offering__c |
Join on CRS.ID → Course_Offering__c |
ENR |
ENR.STATUS |
Course_Connection__c | Status__c |
Map: A=Active, D=Dropped, W=Withdrawn |
TERM |
TERM.ID |
Term | Id |
Sync on every pipeline run; match by term code |
STU |
STU.GPA |
Contact | GPA__c |
Decimal(5,3); write-only on full sync |
Email but different Student_ID__c, the pipeline will create a duplicate rather than merge; configure EDA duplicate rules to block or flag this.STU.NAMES; failing to capture the current name via STU.PREFERRED.NAME results in stale data in EDA.Cutover must be reversible: before switching the production pipeline to live, snapshot the EDA Contact and Course Connection tables to a backup org or custom object (EDA_Backup__c), recording Student_ID__c and LastModifiedDate. During the 4-hour freeze window, execute a full extract from Colleague, load into a staging EDA org, validate counts (±0 records), and run the reconciliation query SELECT Student_ID__c, COUNT(*) FROM Course_Connection__c GROUP BY Student_ID__c HAVING COUNT(*) > 1 to surface duplicates. If validation passes, promote the staging pipeline to production. If it fails, revert to the snapshot and re-run extraction with corrected mapping. Post-cutover, run daily reconciliation reports for 30 days comparing Colleague STU.COUNT and ENR.COUNT against EDA Contact and Course_Connection__c totals, alerting on any drift exceeding 1%.
Reading the reference is free. Delivering it under liability — with the safeguards that keep production running through the cutover — is what we do.