This case study examines a real-world integration between PeopleSoft Campus Solutions and Slate by Technolutions (a higher-education admissions CRM). PeopleSoft acts as the HTTP client, pulling dual enrollment applicant data from Slate on a schedule and driving it into Campus Community, matriculation, and term activation. The same pattern applies to any inbound integration where a vendor exposes a query or report as a REST endpoint and PeopleSoft is responsible for ingesting, staging, and integrating the data.
The population is high school students participating in a dual enrollment program (taking college courses for credit while still in high school) plus a related continuing-education population. The multi-step application lives entirely in Slate:
Once marked ready, PeopleSoft needs to:
PeopleSoft is the system of record for the resulting student; Slate is the system of record for the application.
The integration is a scheduled pull. Slate does not push into PeopleSoft; PeopleSoft polls Slate.
Two HTTP conversations exist:
date_submit query string parameter filters on the form-submission date forward.Both calls traverse Boomi, which acts as a pure pass-through proxy. Boomi does not manipulate the data, does not enrich it, does not transform it, and does not route anywhere dynamic. It sits in the middle because the institution has a standing business rule that all inter-system HTTP traffic must flow through the centrally-managed iPaaS — not because this integration needed an iPaaS.
Technically, the Boomi hop adds nothing to this integration. PeopleSoft is perfectly capable of calling Slate directly over HTTPS. On this project, the required Boomi layer was not a value-add; it was a roadblock. The central team owning Boomi did not have domain expertise in either PeopleSoft Campus Solutions or Slate, so every change to the Slate query, every credential rotation, and every endpoint tweak required a coordination cycle with a separate team on a separate schedule. Latency and opacity went up; debugging got harder because request/response bodies had to be retrieved from a system PeopleSoft developers do not own.
This mirrors the “API gateway paradox” discussed in The API Team: a centralized gateway mandate that sounds logical on a slide deck but routinely underdelivers in practice, less for technical reasons than for organizational ones — missing domain expertise, late involvement, and responsiveness bottlenecks. A hybrid model (route sensitive or audit-heavy integrations through the gateway; allow straightforward system-to-system calls to go direct) tends to produce better outcomes than a blanket “everything through the iPaaS” rule.
If your organization genuinely needs a single choke point for auditing, credential custody, or firewall traversal, an iPaaS pass-through can be a reasonable cost. If the iPaaS is mandated but not used, the cost is all downside.
See PeopleSoft as HTTP Client for the HTTP client mechanics and HTTP Target Connector for the connector itself.
When you design a vendor integration, the first design question is always: who initiates the conversation?
Slate can push, but the institution chose to pull. The reasons map to general principles:
The tradeoff is latency. A pull integration is never real-time. For dual enrollment admissions, where the end-to-end process already spans days of form routing and review, near-real-time is fine.
Slate emits a GUID on every applicant record. That GUID is the primary key of the staging table. This one decision makes the rest of the design simple:
date_submit “from date” that is intentionally conservative (look back further than strictly necessary). Duplicates are collapsed by GUID at insert time.A subtle piece of logic handles the recurring case: when the process runs under a recurrence and completes successfully with no more records to process, it auto-advances the “From Date” to the current date minus one day. The minus-one-day overlap is deliberate — duplicates are cheap (the GUID dedups them), missed records are expensive (they require a human to notice and retrigger).
The most reusable lesson in this integration is the staging table. Inbound data does not land directly in PS_NAMES, PS_ADDRESSES, PS_ACAD_PROG, and the rest of Campus Community. It lands in a single custom staging table (UM_QCK_ADMT_HDR) with an explicit status state machine and per-integration-step completion flags.
Integrating directly into Campus Community from an inbound REST pull means:
A staging table solves all three. The raw JSON lands in one column, the parsed fields land in their own columns, and each integration step (Person, Matriculation, Term Activation, Residency, Emergency Contact, External ID) gets its own “done” flag and timestamp. A user-facing page lets staff review the record, correct missing data, resolve search-match conflicts, and trigger integration steps individually or all at once.
The staging record transitions through a small set of statuses:
| Status | Code | Meaning |
|---|---|---|
| New Staged Record | NEW | Just imported. No integration attempted yet. |
| Search Match - Suspended | SMAC | Search-match found a potential existing person. Needs human review. |
| Integration Incomplete | ICOM | One or more integration steps failed or are missing required data. |
| Admission Complete | COMP | All integration steps done. EMPLID created/linked. |
| Canceled | CANC | Staff decided not to integrate this record. |
The state machine is deliberately small. Every record can be queried and worked from a search page filtered by status. A support team member with no developer access can open an ICOM record, see exactly which step failed, read the error, fix the underlying data, and retrigger.
Each integration step has its own _DONE flag and _DTTM column on the staging record. This is more granular than it needs to be for the happy path, but it pays for itself the moment anything goes wrong. Production support can:
That last capability is critical. An integration that cannot be overridden by a human becomes a production support nightmare. Every real-world integration accumulates edge cases where the cleanest fix is to do the work in the target system directly. The staging record has to be able to catch up to that reality instead of fighting it.
PeopleSoft ships a “Quick Admit” process for admitting students with minimal data entry. The integration deliberately does not use it. The custom integration reproduces most of the same steps but reaches Campus Community through Component Interfaces.
What was gained by rebuilding:
What was given up:
For a high-volume, mission-critical admissions pipeline, the tradeoff favored custom. For a one-off or low-volume integration, using delivered Quick Admit would be a reasonable choice.
Search-match is the hard problem of any person integration. An asynchronous batch process cannot reliably decide whether “John Smith, DOB 2007-03-12” is the same person as an existing “Jonathan Smith, DOB 2007-03-12” already in Campus Community.
The integration handles this by refusing to guess. Any record with a potential match is moved to status SMAC (Search Match - Suspended) and surfaced to a staff reviewer. The reviewer has two outcomes available:
Both outcomes are one-button operations on the staging page that chain into “Trigger All Integrations” to complete the remaining steps.
The search-match configuration uses a dedicated parameter (UMASS_SRCH_PARM in this implementation) that is registered against both the batch component and the staging component. Registering it against the component is what allows the delivered search-match UI to be embedded in the custom staging page.
Every write into Campus Community goes through a Component Interface. No direct SQL, no bypassing PeopleSoft’s business logic. This follows the broader book guidance in Using Component Interfaces for Updates.
| Component Interface | Purpose |
|---|---|
| HCR_PERSONAL_DATA_SRV | Create/update the person (name, address, phone, email, ethnicity, SSN, birthdate) |
| HCR_IDENTIFICATN_DATA_SRV | Citizenship and visa data |
| HHR_EMERGENCY_CNTCT_SRV | Emergency contact |
| SAD_UC_ETHNIC_DTL_PERS | Ethnicity detail (a separate record in Campus Community) |
| Z_ACAD_PLAN_CI | Matriculation — program, plan, admit term |
| Z_STDNT_ACTIVATION | Term activation |
| Z_RESIDENCY_PERS_CI | Residency |
| Z_EXT_SYS_ID_PERS | State-assigned student ID (external system ID) |
Two gotchas worth noting for anyone building similar integrations:
PS_DIVERS_ETHNIC and PS_ETHNICITY_DTL with different CIs and different behavior. Writing to only one of them leaves the data looking correct in one page and missing in another. Plan for both.When the staging record reaches status COMP, PeopleSoft posts the EMPLID back to Slate:
POST /ws/simple/executeSlateUpdateDualEnrollStatus
Content-Type: application/json
Authorization: Basic {{token}}
{
"persons": {
"person": [
{
"refID": "1233456789",
"emplID": "987654321",
"status": "Admission Complete"
}
]
}
}
Two design notes:
See JSON Encoding for how to build the outbound payload with PeopleCode’s JsonObject and JsonArray classes, and JSON Decoding for parsing the inbound Slate response.
The integration defines one URL Definition per database, keyed by database name:
UM_SLATE_DUAL_ENROLL_{{DBNAME}}
There is a record in each environment (DEV, TEST, QA, PRD) pointing at the correct Slate environment — production Slate for PRD, Slate test for the lower environments. This matters most at database refresh time. When PRD is cloned down to DEV, the URL Definitions come with it, but the {{DBNAME}} keying means DEV looks up UM_SLATE_DUAL_ENROLL_SADEV92 and finds the DEV endpoint, not the PRD endpoint that was just copied in.
This is the same pattern used in the D2L integration case study and for the same reason: a database refresh must never accidentally point a lower environment at production APIs.
Let the vendor GUID be your primary key. If the vendor emits a stable unique identifier, store it as the primary key of your staging table. Every idempotency problem downstream becomes trivial.
Never land inbound data directly into the target’s live tables. Stage it. Track status. Track per-step completion. The cost is one custom table and one admin page; the return is dramatically better production support.
Design for human review from day one. Search-match conflicts, data quality issues, and missing required fields are not edge cases — they are the 10–20% of records that consume 80% of the operational time. Build the review surface up front, not after go-live.
Give every integration step a manual-override escape hatch. The real world will eventually require a human to fix something outside the integration. The staging record must be able to reflect that reality.
Route all writes through Component Interfaces. The work to stand up a CI is small compared to the work of debugging a direct-SQL integration that skipped a piece of delivered business logic. See Using Component Interfaces for Updates.
Pull beats push when latency tolerance allows it. You control the cadence, the retry, and the recovery. The vendor’s availability becomes a non-event.
Key configuration by database name. URL Definitions, credentials, and feature flags should resolve differently per environment automatically. Database refreshes must not require a post-clone checklist to prevent data bleed.
Decouple the outbound callback from the inbound pipeline. Treat “notify the source system” as a separate concern driven by status change, not as an inline step. Failures there should not roll back the work that already succeeded.
Test the surprises early. Component Interfaces have behaviors that are not obvious from the page — derived fields, multi-table writes, level-0 versus level-1 placement. Exercise them on real data in DEV before you trust them in PRD.
Chris Malek s a PeopleTools® Technical Consultant with over two decades of experience working on PeopleSoft enterprise software projects. He is available for consulting engagements.
Work with Chris