Prerequisites
- A portal you’ve already created (see Creating a Portal)
Portal Studio
Open a portal from the Portals page at app.statisfy.com/portals to open it in Portal Studio. The editor is organized into five tabs:
Your edits are saved automatically as a draft shortly after you stop typing. The editor header shows Saving draft… while it saves and Draft saved once it’s done. Drafts are kept separate from the live version, so:
- You can leave and come back later, and your in-progress work is still there.
- The live version your customers see does not change until you go live.
Previewing Your Work (Preview tab)
The Preview tab renders your draft live as you edit — it’s labeled Draft preview and updates to reflect your latest changes. You can:- Switch the preview between Desktop, Tablet, and Mobile to check how your portal looks on different screens.
- Refresh the preview if you want to reload it.
- Use Preview as to pick a specific account (and person) and see the live, account-specific data your customers would see when signed in. Nothing you do in the preview is written.
- Use the ⋮ menu next to Preview as to impersonate that person: open a real signed-in session as them on the preview URL or the live site. See Impersonating a Customer.
Editing Code (Code tab)
The Code tab shows your portal’s files in a tree alongside an editor. A problems bar under the editor reports compile issues as you type — when everything is valid you’ll see No problems — preview compiles cleanly. Use Split preview to view your changes next to the code.
Portals are built with React and TypeScript. A small set of packages is ready to use right away — there’s nothing to install:
- React — for creating your pages and components.
- Statisfy packages — anything that starts with
@statisfy/, such as ready-made components for showing customer data, the Digital Worker chat, and the customer sign-in screen.
Configuring Components (Settings tab)
Some of the ready-made Statisfy components you can drop into a portal — like the Digital Worker chat or the onboarding project module — need to be told which Digital Worker or data they should use before they’ll work. You set that in Settings → Configuration → Components, without touching code. The Components panel has two views:- Draft — the settings you’re editing. These are what your draft Preview uses.
- Live — a read-only look at the settings your published portal is using right now. Use Copy to draft to pull a live value back into your draft.
- Set a value — type or pick a fixed value (for example, choose a Digital Worker from the list).
- From a field — bind the value to an account field, so it resolves per customer when they sign in.
Editing component settings needs permission to manage portals. Without it, the Components panel is read-only.
Every configurable component needs a configId
Settings can only configure a component that names itself in code. Each config-driven Statisfy component must carry a literal configId prop — <DigitalWorkerChat configId="support" /> — and that id is what the Components panel shows as the instance’s slot:
- A component with no
configId, or one built from a variable (configId={id}), fails the save and build. It has to be a plain string in the source. - Two components sharing a
configIdintentionally share one set of settings. - Don’t pass an identity prop such as
workerIdnext to aconfigId— the SDK ignores it and the save gate rejects it, so the value can’t silently diverge from what Settings shows.
Where the onboarding module gets its project
The onboarding module doesn’t take a project id — it resolves one per signed-in customer from an account field. That field is the Onboarding Project field on the Account (onboarding_project__c_), a system lookup field pointing at a project, provisioned automatically — you never create it.
In Settings → Configuration → Components it appears as the shared, Locked property “Onboarding project source”: read-only, because re-pointing it would change onboarding for every portal at once. What you do control is the value per account:
- Set each account’s Onboarding Project field to that customer’s project (on the account record, or in bulk via import, the API, or field automation).
- An account with the field empty resolves to no project, and the module renders its empty/not-configured state rather than another customer’s data.
GET /sdk/v1/config/portal — see Portal SDK: Project API.
Exposing account and people fields (Settings tab)
Portals can’t read or edit any account or contact data by default. Settings → Configuration → Account fields and Settings → Configuration → People fields control exactly which fields a portal can use:- Account fields apply to the signed-in customer’s account.
- People fields apply to the signed-in contact.
- Add field opens a searchable list of the fields you can still add. A new field starts at Read.
-
Each listed field has a Read | Edit toggle:
- The ✕ next to a field removes it from the portal (it becomes hidden again). It doesn’t change the field anywhere else in Statisfy.
- Fields with a type portals can’t show yet aren’t offered in Add field. If one is already listed, it shows Not supported in portals — remove it.
- Edit is offered only for fields that are editable in the app. Custom fields must also be user-created and not AI fields. Fields that can only be read show Read only in portals, and their Edit option is unavailable.
- A contact’s email and account associations can be read but never edited from a portal.
Saving field access needs the manage portals permission (admins and builders). Without it, the controls are read-only and show “You don’t have permission to change field access.”
- In code — through
GET/PATCH /sdk/v1/accountandGET/PATCH /sdk/v1/me. See the API Reference. - In component settings — a From a field binding (
$field) resolves only while its account field is exposed. A$fieldthat names a hidden field shows as a problem in Settings → Configuration → Components and fails the save. Locked properties, such as the onboarding project source, always resolve.
Saving Versions
Autosave keeps your latest work as a Working draft, shown at the top of the Versions tab with the files you’ve changed. When you reach a milestone you want to keep, the draft row gives you two ways to record it:- Save as version — Record a named checkpoint, nothing more. A saved-only version has no preview URL and can’t go live until it’s built.
- Build preview — Record the checkpoint and build it. The version gets its own preview URL, and that same build is what goes live.
A preview URL is a real sign-in surface: a customer can enter their email, receive the one-time code, and land on the portal signed in — even before you’ve published the portal for the first time. The session it mints is pinned to the specific preview build the URL serves, so you can walk a real customer through a brand-new portal end to end before you take it live. Preview URLs are unlisted rather than private, so share them only with people who should see unreleased work.
Customizing the Login Email
When a customer signs in to your portal, Statisfy emails them a one-time sign-in code. Settings → Sign-in lets you tailor that email to match your brand — who it comes from, its subject, and its full HTML body. You can set:- Sender email — the “From” address customers see. It must be on one of your verified sending domains; an address on an unverified domain is rejected when you save. A good pattern is
login@your-domain.com. - Sender name — the display name shown next to the address (for example, your company name).
- Subject — the email’s subject line.
- Code expires after (minutes) — how long a sign-in code stays valid (1–60, default 10). This sets both the
{{expiry_minutes}}value shown in the email and the code’s real lifetime, so the email never misstates when the code stops working. - Email body (HTML) — the full HTML of the message.
Placeholders
Use these tokens anywhere in the subject or body — Statisfy fills them in when it sends each email:
Include
{{otp_code}} somewhere in the body so customers can see their code — for example:
Send a test
Enter any email address and select Send preview to receive a sample of the login email (with a placeholder code) using your currently saved template — so you can see exactly what customers will get.You don’t have to customize this email. If you leave it as is, Statisfy sends a clean built-in default, so customer sign-in works out of the box.
Previewing and Going Live
Taking a portal live is a two-step flow, so you can review your changes at a real URL before any customer sees them:- Build a preview link. Select Preview link in the editor header. The popover names what the current link contains; when your draft has edits that aren’t built yet, select Build a new link from your draft to save your draft, build it, and deploy it to a preview address. Nothing is copied automatically — use Copy for the link, or Open to view it. This does not change your live site.
- Go live. When the preview looks right, select Make live… in the editor header and confirm — the confirmation names the exact version, for example Make 558fc88 live, the address it publishes to, and which version it replaces — or that it’s your first go-live. Promoting an older version is labelled as a rollback and tells you which version stops serving. Statisfy promotes that deployed version to your live, customer-facing site, and the portal’s status changes from Draft to Live. This step needs the manage portals permission (admins and builders). Make live… stays clickable for everyone, so without the permission it fails with a permission error rather than being hidden — you’ll need someone who has it to publish for you.
A preview deploy is for your review only — going live is always a separate, deliberate step. Your customers only ever see the version you’ve taken live.
Choosing Your Portal’s Address
Under Settings → Domain, you manage every address your portal is served at. A portal can have three kinds of address:
Adding and removing addresses needs the manage portals permission (admins and builders).
Permanent address
Statisfy gives every portal a permanent address automatically. Statisfy generates it from the portal’s name plus a short random suffix, for exampleonboarding-3f9a2c.customer.site. In Settings → Domain it’s labeled Permanent address with a lock icon.
- You can’t remove the permanent address. Statisfy rejects a removal attempt with “The portal’s permanent address cannot be removed.”
- No other portal can claim it.
- It stays with the portal when you unpublish or archive it. When you publish again, the portal comes back at the same address.
- Your own domains point at it. It’s the target of the routing record described below.
Adding a subdomain
Select Add domain and enter a subdomain. Your portal is then served on Statisfy’s managed portal domain, which in production iscustomer.site, so acme becomes acme.customer.site. Leave it blank to use the permanent address.
Subdomains use lowercase letters, numbers, and hyphens (up to 63 characters). The domain shown next to the field is appended automatically.
Live portals and previews sit on different domains: a live portal is served at
<subdomain>.customer.site, while preview builds stay on statisfy.app. The suffix shown in the dialog is always the authoritative one for your environment.Using your own domain
You can serve a portal at a subdomain of a domain your company owns, such asportal.acme.com. Statisfy issues and renews the TLS certificate for you.
Prerequisites
- The manage portals permission.
- Access to edit DNS records for your domain at your DNS provider.
- In Settings → Domain, select Use your own domain.
- Enter the hostname, for example
portal.acme.com, and select Continue. The hostname must be a subdomain. Statisfy rejects bare domains such asacme.com, IP addresses, and hostnames under Statisfy’s own portal domains. - The dialog shows two CNAME records. Add both at your DNS provider, copying each Name and Value exactly:
- 1. Proof of ownership. Its name starts with
_acme-challenge.. It proves you control the domain so Statisfy can issue a certificate. - 2. Send traffic to this portal. Its name is your hostname and its value is the portal’s permanent address.
- 1. Proof of ownership. Its name starts with
- Select Verify.
portal.acme.com the records look like this:
The dialog can also show:
- A routing warning. “We cannot see the routing record yet. The domain will not load until it points to …” means the routing record is missing or doesn’t point at the portal’s permanent address yet. Ownership and the certificate can still progress, but visitors can’t reach the portal at your domain until you fix the routing record.
- A CAA hint. While the certificate is issuing, the dialog notes: “If this stays pending, check that no CAA record on your domain blocks pki.goog.” If your domain has CAA records, make sure they allow
pki.googto issue certificates.
- Once you’ve selected Verify and Statisfy has started issuing the certificate, Statisfy activates the domain as soon as the certificate is ready. You don’t need to select Verify again.
- If a domain isn’t live within 72 hours of being added, Statisfy expires it. Statisfy removes the domain from the portal and releases the hostname. To try again, add the domain again with Use your own domain.
Rolling Back to a Previous Version
If you need to undo a change after going live, open the Versions tab, select an earlier built version, and choose Make live. Statisfy re-publishes that version to your live site. The version that’s currently live is shown as Current live.Managing Portals
- Open a portal — On the Portals page, select its card to return to Portal Studio.
- Rename a portal — In Portal Studio, select the portal’s name in the header, type the new name, and press Enter (or Esc to cancel). Renaming needs the manage portals permission and changes only the display name; the portal’s addresses are unaffected.
- Archive a portal — Use the ⋮ (more) menu on a portal card and choose Archive, or open Settings → Danger zone in the editor and select Archive portal, then confirm. Archiving needs the manage portals permission (admins and builders); without it the Archive action isn’t shown.
What archiving does
- An archived portal that’s still live keeps appearing in the list — in both views, and with an Archived badge — so you can notice it and unpublish it if that wasn’t intended. One that was also unpublished drops out of the list entirely, since there’s nothing left to manage.
- An archived portal can’t be edited — saving, previewing, and going live are all blocked. The editor will tell you the portal is archived if you try.
- The git history and built versions are kept, so nothing is destroyed — but Portal Studio has no un-archive action. Recovering an archived portal means contacting support@statisfy.com.
- It clears the live pointer and stops serving the portal at all of its addresses.
- It removes the portal’s subdomains so they free up for reuse, and releases its custom domains.
- The portal keeps its permanent address. If you publish again, the portal comes back at that address.
- This is recorded in your audit trail.
- It can’t be undone automatically — you’d publish the portal again to bring it back online.
A live portal that’s archived without unpublishing keeps serving at its URL. The Archived badge in the list is there so you can notice and unpublish it if that wasn’t intended.
Next Steps
- Access & Impersonation — Choose who can sign in and open the portal as a customer
- Portals Overview — Lifecycle, statuses, developer keys, and portal addresses
- Publishable Keys & Secrets — Authenticate embedded portal experiences