Salesforce permission set expiration dates: a guide
Permission set and permission set group assignments can carry an expiration date. At 11:59 PM in the chosen time zone the user keeps the assignment but loses its permissions, and Salesforce sends no warning. List what is about to expire with SOQL, and remember expired rows are hidden unless you ask for them.
Checked against Salesforce documentation on 11 October 2026.
What happens at expiry
The user stays assigned but “can't access the permissions”. Anything the same permissions get from a profile or another set that does not expire still applies, so expiry only removes access granted by that one assignment. Expired assignments are soft-deleted: ordinary SOQL does not return them.
Set an expiry date
- Turn on “Permission Set & Permission Set Group Assignments with Expiration Dates” in User Management Settings.
- Open the permission set or group, Manage Assignments, Add Assignment, choose the users.
- Specify the expiration date (for example 30 days, or a custom date) and the time zone, then Assign.
Through the API, set PermissionSetAssignment.ExpirationDate (API 52.0 or later). Assignments never expire unless you set a date.
List upcoming expirations
SELECT Assignee.Name, PermissionSet.Name,
PermissionSetGroup.DeveloperName, ExpirationDate
FROM PermissionSetAssignment
WHERE ExpirationDate = NEXT_N_DAYS:30To audit what already expired, add ALL ROWS. A report on a custom report type for Permission Set Assignments works too, but covers custom permission sets and groups only.
Limits
- A set or group that contains Assign Permission Sets, Manage Profiles and Permission Sets, or Manage Users cannot have an expiration date.
- The feature arrived in beta in Summer '21, became generally available in Summer '22 and was enforced as a release update in Winter '23.
Common mistakes
- Choosing My Local Time Zone, which expires the assignment at 11:59 PM in the admin's time zone, not the user's.
- Expecting expiry to remove access that a profile or another set also grants.
- Auditing with plain SOQL, which hides expired rows.
- Relying on the report for standard permission sets, which it excludes.
Or let OrgPulse watch it
OrgPulse checks your org every day and alerts you by email or Slack before these dates arrive. It only reads your org, and the first org is free.