Automation · People operations
How to build a role change access update
Someone moved from finance to sales six months ago and can still post journals in the ERP. Here is how role changes update access properly, the prompts that build it, and what it takes to run in production.
Built with Tray Headless
- System Workday
- Step Compare old and new role
- Step Add new access
- Step Remove old access
- Step Record the change
- System Okta
The new role's access is added on the effective date, and the old role's access goes after a short handover window instead of never.
The short answer
What is a role change access update?
A role change access update is four parts: the HRIS change as the trigger, a comparison of what the old role and the new role should hold, access added on the effective date and removed after a short handover window, and a record of both. Most companies get the first half right. New access arrives because the person asks for it. Old access stays because nobody asks for it to go, so a few years of promotions and transfers leave people holding the access of every job they have had.
Stage 7 of 8: Role changes and transfers. Part of Employee lifecycle, end to end : every stage, the systems it runs on and the guide that builds it.
What matters here
- Joiners and leavers get a process. Role changes usually don't, and that is where access quietly piles up.
- Removing the old role's access matters more than adding the new one, because nobody files a ticket to lose access.
- Compare the old role with the new one instead of starting from scratch, so access both roles need is never cut off by mistake.
- Give the old access a short, fixed handover window, then remove it on a schedule rather than when someone remembers.
- Keep the access someone was granted by request separate from the access their role gives them, and review the requested access on its own.
Who this is for
You run IT operations or identity. Onboarding and offboarding are automated, but promotions and transfers still run on tickets, and every access review finds people holding permissions from a job they left a year ago.
How it works in practice
The path from a change in the HRIS to the person holding exactly what their new role needs.
- 1
The HRIS change starts the clock
A new job title, department, manager, location or cost centre, each with an effective date.
- 2
The old role and the new role are compared
What both roles need stays. What only the new role needs is added. What only the old role had is marked for removal.
- 3
New access is ready on the effective date
Groups, apps and permission sets for the new role, granted on the morning the change takes effect.
- 4
Old access is removed after the handover window
Usually two weeks, so the person can hand work over. Then it goes on schedule, without a ticket.
- 5
Exceptions go to the new manager
Anything the person needs to keep from the old role is asked for, approved and given an end date.
- 6
Every change is recorded
What was added, what was removed, when, and who approved any exception. The access review reads from it.
What a role change update is made of
A role change is a joiner and a leaver at the same time, for the same person. It needs both halves.
The HRIS as the trigger
Job, department, manager, location and cost centre changes, read with their effective dates. A ticket is not the trigger, because the old access is never on the ticket.
Role-based access, compared
A map from role to the groups, apps and permissions it should hold, compared before and after. The difference is the work.
Add on the day, remove after a window
New access on the effective date. Old access after a fixed handover window, with any exception approved by the new manager and given an end date.
A record of every change
Each grant and removal, confirmed against the system and logged, so the next access review is a report instead of a project.
The Tray Headless prompts
Paste these into Claude Code or Codex with the Tray Headless plugin installed. Each stage runs on its own. The systems named in them are the worked example rather than a requirement, and every prompt says so.
Once per project, run
/tray-workflows:set-workspace
to pick the workspace these build in. Point it at a sandbox first.
- 1
Set up, then map roles to access
You can't compare two roles until each one has a list.
Headless skills
build-workflowtray-patternsUse build-workflow. The systems in play are Workday, Okta, Google Workspace, Salesforce, NetSuite, Slack and Snowflake, or whatever we run in those seats. Before you plan anything, tell me which of them are already authenticated in the workspace, because I do not want a connector stubbed that I have not authenticated. Build me the role-to-access map: for each combination of department and job family, the Okta groups, Google groups, Salesforce profile and permission sets, NetSuite role and Slack channels it should hold. Start from what people in each role hold today and show me where they differ, because the differences are where the old access is hiding.
- 2
Trigger on the HRIS change and compare
The difference between the two roles is the whole job.
Headless skills
build-workflowtray-patternsUse build-workflow. Trigger on a Workday job change: title, department, supervisory organization, location or cost centre. Read the effective date. Look up the old role and the new role in the access map and work out three lists: Keep: access both roles should have. Touch nothing. Add: access only the new role should have. Remove: access only the old role had. Anything the person holds that is in neither role was granted by request. Leave it alone here and list it for the access review.
Without the keep list, a transfer between two teams that share a tool removes it on Friday and adds it back on Monday, and the person loses a day's work in between.
- 3
Add on the effective date
Because the first day in a new role should not start with tickets.
On the effective date, grant everything on the add list: Okta groups, Google groups and shared drives, the Salesforce profile and permission sets, the NetSuite role, and the Slack channels for the new team. Confirm each grant against the system rather than trusting the response, then post a summary to the person and their new manager in Slack.
- 4
Remove after the handover window
Because nobody raises a ticket to lose access.
Headless skills
tray-patternsSchedule the remove list for the effective date plus 14 days, or the window we set per department. Three days before removal, message the new manager in Slack with the list and one choice per item: remove as planned, or keep until a date they choose, up to 90 days. No answer means remove. On the day, remove everything not kept. Confirm each removal against the system. Anything kept gets its own end date and is removed then.
Finance and admin access is the case that matters most. Someone who leaves finance should lose the ability to post journals or approve payments on schedule, with no exceptions unless a finance lead approves them.
- 5
Handle the awkward changes
Because not every change is a clean move from one role to another.
Headless skills
tray-gotchasUse tray-gotchas, then handle these: Manager change only. Update approval routing and reporting lines, and leave app access alone. Temporary cover or acting role. Add the access with an end date and remove it when the cover ends, without touching the person's own role. A change entered after its effective date. Apply it now, and work out the removal window from today rather than from the date it should have happened. A change that is reversed. Restore from the role map, never from a copy of what the person held before.
- 6
Record it, then hand it to IT
So the access review is a report instead of a project.
Write every add, remove, keep and exception to Snowflake with the person, the systems, the dates and who approved any exception. Then produce a standing report: everyone who holds access from a previous role past its removal date. It should read zero. Run the per-step checks and the whole-workflow audit before this touches production, then open the same workflow in Tray Build so IT can edit the role-to-access map in the visual canvas as teams change.
What it connects to
A role change touches every system the old role and the new role use, which is usually more than either team thinks.
Workday
Read job, department, manager, location and cost centre changes with their effective dates.
Reads
Okta
Add and remove group memberships and app assignments for the new and old role.
Reads and writes
Google Workspace
Update group membership and shared drive access for the new team, and remove the old team's.
Reads and writes
Salesforce
Change the profile and permission sets, and move record ownership where the role change needs it.
Reads and writes
NetSuite
Change the role and remove posting and approval rights the new job does not need.
Reads and writes
Slack
Add the person to the new team's channels and ask the new manager about anything to keep.
Reads and writes
Same build, other stacks
The design does not change if you run something else in one of these seats. The same prompts build it against Microsoft Dynamics 365, SAP S/4HANA, Google BigQuery, Microsoft Teams, Azure Active Directory or SAP SuccessFactors.
Connections in this build
Field mapping, templates and common problems for each pairing: Okta + Workday REST, G-Suite + Okta, Workday REST + Salesforce and Okta + Salesforce.
Named systems are the ones most teams run, not the only ones that work. Each is an authentication in your Tray workspace, referenced by name, so the workflow never holds a credential. Where we have a connector page, the name links to it.
Running it in production
This is the part of access control most audits find broken. It gets tested like the rest.
It lives on the platform, not in a script
The trigger, the scheduled removals and the manager check-in all run on the same engine, with a run history for every role change.
Every change is confirmed and recorded
Grants and removals are checked against each system, not assumed from a response, with the platform audit trail behind them.
Managed credentials
Changing access needs admin rights in every app. Those live in your workspace as managed authentications, scoped and audited, not in a config file.
IT owns the role map
The map from role to access opens in Tray Build, so IT can change it as teams and tools change without a rebuild.
The standing report is the control
People holding access from a previous role past its removal date. It should read zero, and the first run shows how far from zero you are.
Questions people ask
Why does access pile up after role changes?
Because new access is requested and old access is not. People ask for what they need in a new role, and nobody asks to lose what they had, so every move adds and nothing removes.
Why not remove the old access on the effective date?
Most people need a week or two to hand work over. A fixed window, with exceptions approved by the new manager and given an end date, is safer than removing on day one and then granting it back by ticket.
What about access someone requested outside their role?
Leave it out of the role change. It was granted for a reason the role map does not know about, so list it for the next access review instead of removing it automatically.
Is this different from onboarding and offboarding?
It uses the same role map and the same systems. A role change is a joiner and a leaver for the same person at once, so it needs both the add and the remove.
Related guides
People operations
How to build employee onboarding provisioning
Drive it from the HRIS, derive access from the role instead of a copied colleague, sequence around the start date, and prove it happened. The prompts that build it.
People operations
How to build employee offboarding deprovisioning
Revoke on the leave date, cover every system instead of the ones you remember, transfer what they owned, and prove it. The Headless prompts that build it.
People operations
How to build an org hierarchy sync
Propagate a reporting change everywhere it decides something, handle the reorganisation, and never leave an approval routed to somebody who left. The prompts.
IT and security
How to build access request and approval
Route to the system owner, grant with an expiry by default, provision automatically, and produce the access review as a by-product. The prompts that build it.
Last reviewed October 2026.