Sandbox Setup Guide
Everything you need to prepare a Salesforce sandbox for Release Assurance regression testing, with least-privilege personas, server-to-server authentication, and a security posture your reviewer can sign off on in one read.
What we access
- One sandbox or scratch org, never production
- One or more persona users cloned from real end users
- A single External Client App or Connected App (JWT flow)
- A small, dedicated permission set on those personas
- Your UI, behaving exactly as a real user would
- Short-lived access tokens, re-minted on every run
What we never access
- Production orgs (blocked in our code, not just in policy)
- Setup, Object Manager, or any admin-only screens
- Flows, Apex classes, triggers, LWCs, metadata, or config
- PII, real customer data, or live business secrets
- Named credentials, custom settings, or secret stores
- Passwords, refresh tokens, or long-lived sessions
The security model
Before the how, the why. Four properties of Release Assurance shape the whole setup, and understanding them up front makes every later step obvious.
By design, not by policy
Our control plane refuses to start a run against any Salesforce instance_url that resolves to a production pod. It's a code-level gate with tests around it, not a setting an operator could flip. You never have to trust us to avoid production — the system cannot physically run there.
We drive your UI as a real user
Release Assurance exercises business workflows through Salesforce's own interface. That means all we need is a persona user who can do what a real user does — nothing more. No Setup, no metadata APIs, no direct database access, no custom integration endpoints.
No passwords, no long-lived tokens
Authentication is Salesforce's OAuth 2.0 JWT bearer flow. Every request is a freshly signed JWT; Salesforce verifies it against a public certificate you install; you get back an access token that lives for minutes. There is no password, no refresh token, no persistent session.
One kill switch, in your hands
Trust is granted by a single artifact: the certificate you upload. Remove it and every persona loses access instantly. There are no sessions to invalidate, no keys to rotate on our end, no cleanup for you to chase.
If a JWT leaked today, it would expire in minutes and could not be renewed. If our private key were ever compromised, revoking our certificate in Salesforce would end access for every persona immediately, with no session fallout.
Prepare the sandbox environment
A sandbox prepared for automated regression testing should be representative enough to exercise your workflows and sanitized enough that a mistake costs nothing.
Use a sandbox or scratch org — never production
Full-regression runs require the freedom to create, update, and delete records. That work does not belong in a production org.
Strip PII and real customer data
Refresh from a seeded template, not from a production copy. Scrub names, emails, phone numbers, payment data, and any field that carries PII.
Turn email deliverability off
Set Setup › Email › Deliverability › Access to Send Email to No access, unless your tests specifically need to verify outbound email behavior.
Why: Prevents any accidental email to real addresses that might still exist in the cloned data.Remove or rotate secrets inside the org
Scrub named credentials, custom settings, custom metadata, and any other in-org secret stores. We will not read them, but a sanitized sandbox makes this a non-issue in audits.
Why: Defense in depth. Even though our permission set denies metadata access, a sandbox with no secrets cannot leak any.Keep enough test data to exercise the workflows
Balance matters: too little and tests can't run; too much real data and risk creeps back in. Use synthetic records, fixture accounts, and anonymized copies.
Create persona users
Give us users who look exactly like your real end users — same profile, same permissions, same app visibility. The whole point is to test what your real users experience; any extra permission we receive invalidates the test.
Username convention
Use a deterministic format so the account is obviously a Release Assurance test account, tied to your org and your sandbox:
Replace persona with the role or name, tenantid with the ID we assign during onboarding, and sandboxname with your sandbox name.
Examples
Never assign the System Administrator profile to a persona user, even temporarily for setup. Clone the real user's profile. If the real user is a salesperson, the persona is a salesperson — not a salesperson plus admin.
One persona per distinct role
If your workflows differ by department or title — legal, CSS, sales, service — create a separate persona per role. Don't share one persona across roles; it hides whether a failure is a permissions issue or a workflow issue.
Set up JWT authentication
Release Assurance uses Salesforce's OAuth 2.0 JWT Bearer Flow for server-to-server authentication. On newer orgs you'll configure it through an External Client App; on older orgs it may still be a Connected App.
Create the External Client App (or Connected App)
Enable OAuth and, in the OAuth settings, enable the JWT bearer flow. Request only the scopes we need:
api,refresh_token, andwebif required. Avoidfull.Why: JWT bearer is server-to-server. No passwords, no browser login, no user interaction. The app is the narrow door that carries every request.Upload our public certificate
We provide an X.509 public certificate. Install it on the app's Use digital signatures setting. The matching private key is generated on our infrastructure and never leaves it.
Why: Salesforce verifies every JWT signature against this certificate. Only a signer holding the matching private key can produce valid tokens — there is no shared password to leak.Set Permitted Users to "Admin approved users are pre-authorized"
Then grant app access exclusively through the Release Assurance permission set (see part 5).
Why: Nobody can self-authorize. The only identities that can obtain a token are the dedicated persona users holding the permission set.Keep Login IP Ranges tight — don't relax them for us
If your org enforces IP restrictions, leave them in place. We'll provide our egress IP ranges so you can allowlist them on the persona profile or the app.
Why: IP policy is a second factor on top of the certificate signature. A valid JWT from an unexpected network is still refused.Leave token lifetime short; no refresh token
The JWT flow does not return a refresh token, which is exactly what we want. Access tokens expire within minutes; our control plane re-mints a fresh JWT on every run.
Why: Short-lived tokens bound the blast radius of any single token. A copied token expires before it can be meaningfully used, and cannot be extended.Know how to revoke
Revocation is one step: remove our certificate from the app, or delete the app itself. Access ends immediately for every persona.
Why: Trust rests on one artifact you own. No sessions to kill, no passwords to reset, no tokens to blacklist.
Only the holder of the private key can produce a JWT Salesforce will accept. The private key is generated and stored on our infrastructure, is never transmitted, and never appears in your org. Salesforce only ever sees the public certificate. Same family of asymmetric cryptography that protects HTTPS.
Create the Release Assurance permission set
One permission set, assigned to the persona users, does two things: lets them authenticate through the JWT flow, and makes them identifiable as test personas without giving them anything extra.
| Setting | State | Why |
|---|---|---|
API Enabled | On | Required so Salesforce will issue an OAuth access token for the JWT flow. By itself, it does not grant Setup access or admin power. |
| External Client App / Connected App assignment | Assigned | Attaches the Release Assurance app to persona users via the permission set. Only holders can use the app. |
Modify Metadata Through Metadata API Functions | Off | Enabling this would open a path to read and modify org metadata, flows, and code via the API — exactly the access we say we don't need. |
Use Any API Client | Off | If your org uses External Client Apps, keep this off. Salesforce notes that enabling it can bypass app-specific pre-authorization controls. |
| Object, field, and record access | None added | Persona users inherit access from their cloned profile. The permission set adds nothing on top. |
Do not add View Setup and Configuration, View All Data, Modify All Data, Author Apex, Customize Application, or any object-level permissions. If a workflow only a real admin could run must be tested, use a separate admin-profile persona — don't mix admin power into every persona.
Disable in-app guidance and feedback popups
Salesforce walkthroughs, prompts, and feedback surveys can cover buttons or change focus mid-click. For a UI-driven test run, a pop-up is a silent failure.
Setup › In-App Guidance › Settings
- Turn off Salesforce Standard In-App Guidance
- Turn off Custom In-App Guidance
Setup › User Interface › Adoption Assistance
Disable all three toggles:
Extra hardening recommendations
None strictly required for Release Assurance to work, but each reduces risk meaningfully. These are what we'd do if we were in your seat.
Use a dedicated sandbox for testing
Isolate automated regression runs from day-to-day admin work, experiments, and unrelated users.
Refresh the sandbox on a cadence
Schedule a refresh (monthly or per release). Makes "remove secrets + PII" a repeatable checklist rather than a one-time scrub.
Never assign System Administrator to personas
Always clone the real user's profile. System Administrator opens every door we explicitly told you we don't need.
Pre-authorize only the Release Assurance permission set
Block self-service OAuth authorization from any other user. The only way in is through the permission set you control.
Keep Login IP Ranges strict
Allowlist only our egress IP ranges on the persona profile or app. Don't loosen org-wide IP policy on our behalf.
Minimum OAuth scopes only
Grant api, refresh_token, web if required. Avoid full. Fewer scopes, smaller blast radius.
Turn on Setup Audit Trail
Any config change in the sandbox becomes visible and attributed. If something drifts, you can see when and by whom.
Review Login History for personas
Spot unexpected IPs or user agents early. A persona user should only ever log in from our IP ranges via JWT.
Rotate our certificate on your schedule
Certs are cheap to rotate. Agree on a cadence and we'll generate a new keypair for you to install.
Deactivate personas when paused
If testing pauses for an extended period, deactivate persona users or unassign the permission set. Reactivating takes seconds.
No Lightning Login or passwordless tricks
Leave persona users on a plain profile. JWT is the only path in — keep it that way.
No custom My Domain identity flows for personas
Persona users should live in your normal My Domain. Avoid SAML assertions or identity flows that bypass standard controls.
Go-live checklist
One list, in order. Walk through it top to bottom and you're ready for onboarding. Print it, paste it into a ticket, or share it with your security reviewer for sign-off.
Release Assurance sandbox readiness
- Environment
- Sandbox or scratch org provisioned (not production)
- Real customer data and PII removed or anonymized
- Email deliverability set to No access
- Named credentials, custom settings, and custom metadata scrubbed of secrets
- Persona users
- One persona user per distinct business role
- Usernames follow
persona@releaseassurance.com.tenantid.sandboxname - Each persona uses a profile cloned from a real user (never System Administrator)
- No extra permissions beyond what the real user already has
- JWT authentication
- External Client App or Connected App created, OAuth + JWT bearer enabled
- Release Assurance public certificate uploaded to the app
- Scopes limited to
api,refresh_token, andweb(if required) - Permitted Users set to "Admin approved users are pre-authorized"
- Login IP Ranges allowlist set to our egress IP ranges only
- Permission set
- Release Assurance permission set created
API Enabled= onModify Metadata Through Metadata API Functions= offUse Any API Client= off- External Client App / Connected App assigned through this permission set
- Permission set assigned to each persona user
- Salesforce UI hygiene
- Setup › In-App Guidance: Salesforce Standard In-App Guidance = off
- Setup › In-App Guidance: Custom In-App Guidance = off
- Adoption Assistance: Switch to Classic Feedback = off
- Adoption Assistance: Suggested for You = off
- Adoption Assistance: Product Feedback Form = off
- Audit and ongoing
- Setup Audit Trail enabled
- Certificate rotation cadence agreed with Release Assurance
- Process for deactivating personas on extended pauses documented
Send the signed-off checklist and persona usernames to your Release Assurance contact, along with the sandbox instance URL. We'll confirm the certificate fingerprint, run a connectivity dry-run, and schedule your first regression pass.