Licensing
Offline license key (SPFXFC-) for a tenant or site collection. Verification runs locally without network calls.
Community and Pro
Without a valid key, the form runs in Community (Free) mode. A valid key unlocks Pro. Keys are issued by the product vendor. The license is verified in the browser using the key's signature and does not call any external service.
| Feature | Community | Pro |
|---|---|---|
Tabs in form (maxTabs) | 2 | unlimited |
Active rules (maxRules) | 3 | unlimited |
Cascading lookups (allowCascadingLookups) | no | yes |
Custom scripts (allowCustomScripts) | no | yes |
AI Assistant in designer (allowAiAssistant) | no | yes |
| "Powered by FormCraft 365 (Community Free)" watermark in form footer | shown | hidden |
How the License Is Enforced
Limits are enforced only in the designer. Nothing is blocked at runtime: the form evaluates all rules, displays all tabs, and runs cascading lookups and scripts even if the configuration exceeds Community limits.
- Tabs and rules: once the tab limit is reached, the designer disables the add button; for rules over the limit, it shows a warning and disables toggles.
- Cascading lookups: without a Pro license, the cascading lookup in the palette is locked (Pro badge, cannot be added via button or drag-and-drop) and cascading cannot be enabled in the lookup inspector (the Depends on field control is disabled with a Pro badge). For a field that already has a cascade configured, settings can still be edited and the cascade can be removed at any time. Existing cascades in the configuration remain functional and editable; the designer shows a warning for them.
- Custom scripts: without a Pro license, the script editor is read-only with a Pro badge. Existing scripts can be viewed and continue to run, but cannot be modified. Scripts edited elsewhere (JSON, import) only trigger a warning in the designer.
- Designer banner: when the configuration exceeds the Community license, the form displays a banner above itself to form administrators (and only to them) detailing exactly what exceeds the limit (rule or tab count, cascading lookups, scripts). Regular users do not see it.
Enabling script execution at runtime is controlled independently by the script policy, not the license.
Key Scope
- Entire tenant: the key is valid on all sites in the tenant. It is bound to the tenant ID (
tidfield). - Selected site collections: the key contains a list of site collection IDs (
sidfield) and is valid only within them, including all subsites. The site collection ID (not the web ID) is compared, case-insensitively.
Key Format
The key is a string SPFXFC-<data>.<signature>. Data is base64url-encoded JSON, and the signature is ECDSA P-256 / SHA-256. Only the public key is bundled in the package, so a key cannot be generated or modified without the vendor. Changing a single character invalidates the signature. The contents (version v, tid, tier pro or trial, exp, iat, and optionally cust and sid) are displayed by the dialog after pasting the key.
tier: Pro (paid license, typically for one year) or Trial (evaluation, typically 14 to 30 days). Features are identical.exp: last valid day inclusive (until end of day in UTC).
What to Provide to the Vendor
To issue a key, the vendor needs your Tenant ID and, for a site-collection-scoped key, the Site Collection ID of each site. Both values are displayed in the license dialog in the designer, each with a Copy button.
- Open a list form and in the designer (gear icon, Form Settings), click License in the header.
- Copy the Tenant ID and Site Collection ID and send them to the vendor along with the requested validity period and customer name.
- For multiple site collections, repeat this step on a site in each one.
Entering the Key in the Designer
- In the designer, click License in the header (next to the Community Free or PRO badge).
- Paste the key into the License Key field. The key is validated as you type. A valid key displays the tier, expiration date, customer, and scope in green; an invalid key shows the reason (see Error Messages).
- Under Save for, choose the storage location (see below) and click Save key.
- On success, "Key saved and license updated" is displayed and the badge in the header changes to PRO.
"Save for" Option
| Option | Where It Is Written | Who Is Allowed |
|---|---|---|
| Entire tenant (requires App Catalog admin) | Tenant Storage Entity SpfxFormCustomizer_License in the tenant App Catalog | Tenant App Catalog administrator |
| This site collection | File SiteAssets/FormCustomizer/license.txt in the root web of the site collection (applies to subsites too). If the user lacks permissions to the root web, it is written to the current web's Site Assets. | Site owner (after storage lock, owners only) |
- If you do not have App Catalog admin permissions, the dialog automatically switches to "This site collection" and displays the PowerShell command for the tenant admin.
- A key restricted to specific site collections saved at the tenant level will not activate in other site collections. The dialog warns about this.
- Once configuration storage is locked, only a site owner can write the license file. Others see the message "Only site owners can save the license into the locked FormCustomizer folder." Read access remains open to everyone. See Permissions.
Tenant Storage Entity (PowerShell)
A tenant App Catalog administrator can write the key without using the designer:
Connect-PnPOnline -Url "https://<tenant>.sharepoint.com/sites/appcatalog" -Interactive
Set-PnPStorageEntity -Key SpfxFormCustomizer_License -Value "SPFXFC-..." -Scope Tenant
# Remove
Remove-PnPStorageEntity -Key SpfxFormCustomizer_License
The dialog displays this same command when writing to the tenant from the browser fails, along with a Copy command button.
File in Site Assets
The "This site collection" option creates (or overwrites) the license.txt file containing a single line—the key itself. You can also create the file manually: upload a text file named license.txt into the FormCustomizer folder of the Site Assets library of the root web of the site collection. The key is signed, so protecting the file from tampering is not necessary for licensing integrity.
Writing to the web property bag is not used. Modern sites with NoScript (DenyAddAndCustomizePages) block it even for owners. Legacy keys in the web or list property bag are still read, but new keys are never written there.
Lookup Order and Caching
When a form opens, the key is searched in the following order—the first valid key wins:
- Tenant Storage Entity
SpfxFormCustomizer_License. - File
SiteAssets/FormCustomizer/license.txtin the root web of the site collection. - The same file in the current web (only if it is a subsite).
- Web property bag (read-only, legacy location).
- List root folder property bag (legacy location).
- An invalid key in one location (wrong tenant, expired, invalid signature) does not block subsequent locations: lookup continues and the first key that passes validation is used.
- Cache: the browser caches only the raw key text for one hour (
localStorage, separately for tenant and site collection) to reduce REST calls. The key is re-verified on every load, so expiration takes effect immediately. - A read failure (network, permissions) never blocks the form. If all sources fail, an older cache entry is tried; otherwise Community mode applies.
- After changing the key outside the designer (PowerShell, manual file upload), the change may take up to an hour to appear, or until you clear
_fc_lic_*keys in browserlocalStorage.
Behavior Without a License and After Expiration
- A missing, invalid, or expired key = Community. The form never crashes and saving user data is never blocked by licensing (fail-open).
- After expiration, the designer shows the Community Free badge, limit exceeded warnings (more than 2 tabs or 3 rules), and the footer watermark returns. Existing configurations are not deleted.
- Expired update entitlement (
upd): a key with anupdfield is valid only for packages released on or before that date. If the package is newer, the key is recognized as genuine and the designer runs in Community mode (tab and rule limits, no scripts or AI), but it displays the customer name and maintenance end date with a renewal prompt (in the designer header and License dialog). Existing forms continue to work and end users do not see the "Community Free" watermark in this case. Older keys withoutupdremain valid. - The designer header and License dialog display the customer, tenant ID, and expiration date.
meta.licensedToandmeta.tenantIdin the saved configuration are informational metadata only (overwritten by the designer with current values on each save, and not carried over on import); they are neither protection nor proof. - Revocation: a compromised or leaked key can be revoked by adding its identifier
kid(SHA-256 of the signed payload) to theREVOKED_LICENSE_KIDSlist in a new package version. The key then stops working once that version is deployed, not immediately remotely (offline verification). Otherwise, licenses end on theexpdate, which is why keys are issued with limited validity. To renew, enter a new key using the same procedure.
Error Messages
The dialog reports why a key cannot be used. Find the resolution by message text:
| Message | Cause and Resolution |
|---|---|
| Invalid key format. | The key does not start with SPFXFC-, is truncated, or has corrupted data. Paste the full key again without quotes or line breaks that an email client may have added. |
| Key signature is invalid. | The key was modified or is not from the vendor. Alternatively, the browser cannot verify the signature (missing Web Crypto, typically an insecure context). Request a new key from the vendor. |
| Unsupported key version. | The key uses a newer format. Upgrade the solution package. |
| Key was issued for a different tenant. | The tenant ID in the key does not match the tenant where the form is running. Send the vendor the Tenant ID from the dialog (Copy button). |
| Key is not intended for this site collection. | The key lists different site collections. Send the vendor the Site Collection ID from the dialog and request an update. |
| Key has expired. | The exp date has passed. Request a new key. |
| Cannot write to tenant without App Catalog admin permissions… | Save the key to the site collection, or pass the displayed Set-PnPStorageEntity command to a tenant administrator. |
| Failed to save key: … | Another write error (e.g., Site Assets library unavailable). Use the displayed command or create license.txt manually. |
Further troubleshooting: Troubleshooting, license was not recognized.