15 January 2026 / Platform delivery

Reconciling portals, permissions and integrations before release

In a multi-portal product, the final release checks often fail between components: one role sees the wrong state, an integration updates late or two screens apply different rules. The examples in this post are a composite of recurring delivery problems.

Intersecting steel beams and bracing viewed from beneath a bridge.
Photo: Sebastian Schuster (opens in a new tab)

In a multi-portal product, the final release checks often fail between components: one role sees the wrong state, an integration updates late or two screens apply different rules. The examples in this post are a composite of recurring delivery problems. A page can work correctly on its own and still be wrong in the product. The admin portal accepts a change. The customer portal shows an older value. A partner role can see the record but not the action needed to progress it. None of those faults belongs neatly to one screen, which is why isolated acceptance checks tend to miss them. The most useful release check follows one record through the whole product. Create it through the route a real user would take, move it through each permitted state, let the integrations run, then inspect what every affected role can see and do. Use a small set of deliberately different records. One should follow the ordinary path. Others should cover a declined action, a delayed integration, a corrected field and a user with limited permissions. These are test fixtures, not reconstructed client stories. Their job is to expose disagreement between components. For each fixture, write down:

  • its current state and the event that put it there;
  • which role owns the next action;
  • which portals may display it;
  • which fields may be edited at that point;
  • which external update is expected, and how late it may arrive;
  • what evidence should remain after the work completes.

That list is more useful than a broad instruction to "test all portals". It gives the release team something finite to reconcile. Permission checks often stop at whether a role can open a page or see a button. That leaves a large gap. The role may be able to submit an action it should only view, or the interface may hide a control while the underlying endpoint still accepts the request. Build the role matrix around actions on a record. For each state, ask whether the role may view, create, amend, approve, reject, reopen, export or delete. Include actions triggered through links, bulk tools and APIs, not only the main interface. Then test both sides of every important rule. Confirm that the permitted action succeeds and that the prohibited action is rejected by the server. A hidden button is a presentation choice. The server-side decision is the permission boundary. The result should also be understandable to the user. If an action is unavailable because another role must act first, say that. A generic error leaves support staff comparing accounts and guessing which rule applied. A multi-portal product needs one account of the record's state. Trouble starts when each component infers that state differently. One screen treats a submitted record as complete, another waits for an external acknowledgement, and a third relies on a nullable date that nobody updates on failure.

Name the states and the events that move work between them. Keep transitional states where the distinction changes what a person should do. "Awaiting external confirmation" is worth keeping if staff must wait or intervene. It is unnecessary if it behaves exactly like "submitted" everywhere. For release testing, capture the state before and after each action, the actor, the time and the correlation identifier used by any integration. This does not require exposing an internal event log to every user. It does require enough information for an operator to explain why two screens disagree. Also test refresh behaviour. A portal that only fetches state on first load may continue showing an action after another role has already completed it. Repeat important transitions with two sessions open at once and check what happens when the second user acts on stale information. External systems rarely update at the exact moment the interface returns success. A release test that waits a few seconds and declares failure can be as misleading as one that never checks the external result. Define the integration states the product can honestly report: queued, sent, acknowledged, rejected, timed out and scheduled for retry are common examples. The exact names matter less than preserving the difference between work that has not run and work that ran unsuccessfully.

Test duplicate delivery, late delivery and delivery in the wrong order. If the same event arrives twice, the second copy should not repeat the business action. If an earlier status arrives after a later one, it should not move the record backwards. If a retry succeeds, the activity history should retain the failed attempt rather than replacing it with a clean final state. Reconciliation needs a human route as well. Someone should be able to find records stuck beyond the expected delay, inspect the last attempt and either retry safely or escalate with the identifiers needed by the other system. The same rule often appears in several places: form validation, an API, a background job, an export and a summary screen. Small differences accumulate. One portal accepts a blank value, another substitutes a default, and the export silently omits the field. Create a short rule catalogue for release-critical fields and decisions. Record the source of each rule, the components that implement it and the examples that prove it. Run the same boundary values through each component where practical. Dates, status eligibility, money, optional identifiers and role ownership deserve particular attention because silent coercion is common.

Do not patch inconsistent wording if the underlying decisions still differ. Resolve which rule is authoritative, update the implementations, then keep the examples as regression tests. The release check should prove agreement, not merely make the screens look similar. A useful release review ends with named evidence. Pick the ordinary path and the few exceptions that would leave customers or staff unable to continue. Run them against the release candidate with production-like roles and integration settings. Save the record identifiers, expected states, actual results and unresolved differences. Do not average those results into a percentage that hides a blocked path. A failed permission boundary or an unrecoverable integration state needs a decision before release. A cosmetic mismatch can be recorded and scheduled. The distinction should be explicit. The final check is simple to state: for each fixture, can every role see the right state, take only the allowed action, and understand what happens next? If the answer requires opening a database console or asking which portal is correct, reconciliation is still part of the release work.

Continue the thinking.

Comments are public and hosted in an open-source GitHub Discussions repository.

Loading comments connects your browser to GitHub. A GitHub account is required to post.

All blogs