Redesigned Inbox UI#
This release redesigned the Inbox, adding bulk actions for selected submissions, a Forwarded category, and a submission details modal that shows delivery to each Target.
It also addressed several issues, including those affecting Pull Request templates and loading a Site.
Features & Improvements
- Redesigned the Inbox UI, allowing you to review and act on many form submissions at once. Each Inbox connected to a Site appears in your Site Navigation, and on the Submissions tab of that Inbox under Org Settings.
- Added a checkbox to each submission, allowing you to select several submissions and Resend, Mark as spam, Mark as not spam, or Delete them from the Actions button. CloudCannon asks you to confirm each action before applying it.
- Replaced the Sent category with Forwarded, which shows submissions that reached at least one Target. A submission marked as spam that reached a Target appears in both Forwarded and Spam.
- A submission marked as spam shows a Spam tag alongside its Pending or Errored delivery tag, rather than one combined state.
- The toolbar at the top of the Inbox shows the number of submissions, and the refresh button shows how many new submissions have arrived.
- Moved the export button to the bottom of the Inbox. The button exports the current category (e.g., All, Spam) to CSV, or only the selected submissions if you have selected any.
- Replaced the Data and Targets tabs in the submission details modal with a single view. The Delivery section shows the status of each Target, and Resend to this target resends the submission to that Target only.
- Added Previous submission and Next submission buttons to the submission details modal. The left and right arrow keys also move between submissions.
- Added a URL for each open submission and each page of the Inbox, allowing you to link directly to a specific submission.
- The Resend action is unavailable for an Inbox with no Targets, and the Inbox explains why.
- Changed CSV exports from an Inbox to prefix any value starting with
=,+,-,@, a tab, or a carriage return with an apostrophe, so spreadsheet apps show the value as text rather than running it as a formula. - Added a
GET /api/v0/form-hooks/{form_hook_uuid}endpoint to the CloudCannon API, allowing you to get a single Inbox submission. The endpoints that list submissions for an Inbox or a Site also accept theforwardedcategory, and the Inbox export endpoint accepts auuidsparameter, allowing you to export specific submissions. - Changed CloudCannon's app copy, emails, and validation messages to use US English spelling consistently.
Fixes
- Fixed an issue where a Pull Request template's title and body were not used if you created a Pull Request without editing them. The Pull Request used the Publish via CloudCannon title and an empty body instead.
- Fixed an issue where a Site could load its configuration before the files it depends on had loaded.
- Fixed an issue where the loading screen for a Site did not update as each part of the Site finished loading.
- Fixed an issue where a success or error message could appear behind an open modal.
Guest Access and the People page#
This release renamed Client Sharing to Guest Access, renamed the Team page under Org Settings to People, and changed the Subscription page to count Seats rather than Organization Members. It also added a Rich Text Editor to Project descriptions, changed CloudCannon to renew automatic SSL certificates earlier, and read the expiry date from uploaded SSL certificates.
It also addressed several issues, including those affecting images with EXIF rotation, rich text tooltips in Safari, TOML front matter, and files uploaded to an Amazon S3 DAM with a plus sign in the filename.
Features & Improvements
- Renamed the Client Sharing feature to Guest Access, to improve clarity around who the feature gives access to. Guest Access gives anyone outside your Organization access to a Site, not only clients of agencies. For more information, please read our documentation on what Guest Access is.
- The Guest Access settings for a Site are still under the Sharing heading in your Site Settings, alongside Site Sharing. Links to the old Client Sharing settings page will redirect to Guest Access.
- The password set for a Site is now called the Guest Password, and the button that opens the login page is now Open Guest Login Page.
- Renamed the Team page under Org Settings to People, to improve clarity around the people in your Organization versus the Team Plan. Links to the old Team page will redirect to People.
- Moved the Client Sharing page under Org Settings to the Guests tab on the People page, alongside Members and Groups. The Guests tab shows each Site that has a Guest Password, and clicking a Site opens its Guest Access page under Site Settings.
- The Guests tab is visible to members of the Owners, Partner, and Developers Default Permission Groups, and to Custom Permission Groups with the
org:settings:details:readpermission.
- Updated the Subscription page under Org Settings to count Seats rather than Organization Members. The page will break down how each Seat is used; Organization Members use one Seat, and each Site with Guest Access enabled uses one Seat.
- The Seats row will only show Guest Access when at least one Site has Guest Access enabled.
- The billing summary on the Subscription page labels charges for extra Seats as Additional Seats.
- On the Members tab of a Client Organization's People page, the Card for each member of your Partner Organization shows a Partner (no Seat used) label.
- Added
guest-accessandguest-passwordendpoints to the CloudCannon API, along withguest_fields on a Site that replace theclient_fields. The previousclient-sharingandclient-passwordendpoints andclient_fields still work, but are deprecated. For more information, please read our API reference. - Changed the Description field in the Details section of Project Settings to a Rich Text Editor, allowing you to format a Project description without writing Markdown by hand. The Card for each Project in your Projects Browser shows the first line of the description.
- Changed automatic SSL certificates to renew when a third of their lifetime remains, rather than 10 days before they expire.
- Improved the error messages CloudCannon shows when an automatic SSL certificate fails to generate, including when your domain's DNS, or a proxy or CDN in front of it, does not point to CloudCannon.
- Removed the Expires field from the form for adding an SSL certificate. CloudCannon now reads the expiry date from the certificate, and checks that the certificate covers your domain before attaching it.
- Changed the actions that shorten a Client Organization's extended six-month Free Trial to end the trial in five days, rather than three.
- Changed the download link for an Inbox CSV export to a button that shows the time the export was generated.
Fixes
- Fixed an issue where the verification code CloudCannon emails during sign-up stopped working after 10 minutes. The code now works for three days.
- Fixed an issue where images with EXIF rotation were squashed when resized during upload.
- Fixed an issue where files uploaded to an Amazon S3 DAM with a plus sign in the filename had broken URLs.
- Fixed an issue where the Rich Text Editor added non-breaking spaces around content it could not recognize when saving Markdown.
- Fixed an issue affecting toolbar tooltips in the Rich Text Editor in Safari.
- Fixed an issue where saving a TOML file failed when an array contained an empty item.
- Fixed an issue where error messages from a redirect, such as authorizing a Git Provider like GitHub, did not appear once CloudCannon loaded.
- Fixed an issue where the message shown when you authorized a different Git Provider account to the one already linked told you to disconnect it "here", even when you were not on the settings page for that account.
- Fixed an issue where the Card for a Project showed a code fence marker instead of the first line of the description.
- Updated dependencies to patch security vulnerabilities.
Hide and disable Inputs with expressions#
This release added the hidden_if and disabled_if options to input configuration, allowing you to hide or disable an Input based on the values of other Inputs. It also rebuilt CloudCannon's error pages around a shared design and gave each one an error code, changed SSL certificates to generate per Site, added Google reCAPTCHA Enterprise as a captcha provider, and redesigned the emails CloudCannon sends.
It also addressed several issues, including those affecting GitLab webhooks, the Cloudinary asset picker, and the graph on the Publishing tab of a Project.
Features & Improvements
- Added the
hidden_ifanddisabled_ifoptions to input configuration, allowing you to hide or disable an Input based on an expression rather than a fixed value. Thehiddenanddisabledoptions are unchanged, and still take a boolean or the name of another key.- An Input is hidden when
hiddenis true orhidden_ifevaluates to a truthy value, and read-only whendisabledis true ordisabled_ifevaluates to a truthy value. - An Input whose expression is invalid reports the problem in the editing interface, naming the option at fault.
- Expressions support comparison, arithmetic, and logical operators, along with the
length,includes,starts_with,ends_with,lowercase,uppercase,trim,number, andstringfunctions. - An expression reads a sibling key by its name, and the Input's own value as
this. parent()reads the object containing the Input, andparent(2)the object above that.$reads the closest Structure value containing the Input, or the root of the file if the Input is not inside a Structure.get("my key")reads a key whose name is not a valid identifier, such as one containing a space or a hyphen.- For more information, please read our documentation on hiding or disabling an input with an expression.
- An Input is hidden when
_inputs:
discount_code:
type: text
hidden_if: has_discount == false
out_of_stock_reason:
type: text
disabled_if: (stock_count + ordered_stock_count) > 0{
"_inputs": {
"discount_code": {
"type": "text",
"hidden_if": "has_discount == false"
},
"out_of_stock_reason": {
"type": "text",
"disabled_if": "(stock_count + ordered_stock_count) > 0"
}
}
}- Rebuilt CloudCannon's error pages so that the pages you see in the app and error pages served on a hosted website's Custom Domain or Testing Domain share one design.
- Each page names the problem in plain language, such as Your session expired, Access is locked, or CloudCannon is down for maintenance, rather than a status number alone.
- Each page offers only the actions that apply to it. A locked account offers Email support and Log out, a maintenance page offers Check the status page, and a throttled request states how long to wait before trying again.
- Error pages on a hosted Custom Domain or Testing Domain have an Are you the site owner? section, linking you to the in-app location for resolving the error.
- Each page carries an error code, a reference for the request, and the time in UTC. Quote these when you contact support.
- Each page follows the light or dark theme of the device being viewed.
- For more information, please read our documentation on what each error code means.
- Added an Email Preferences page to your Account Settings, allowing you to request an email with a link for managing which CloudCannon emails you receive.
- Changed SSL certificates so that each Site generates its own. CloudCannon previously generated a single certificate covering every Site that shared a Base Domain, so if a Custom Domain name was not pointed at CloudCannon, it stopped certificate generation for all of them.
- SSL emails now cover one Site each, naming that Site's Custom Domain in the subject line. They previously named the shared Base Domain and listed every Site using the certificate.
- Changed the CSV export on an Inbox to generate in the background. CloudCannon prepares the file and then offers a Download CSV button, instead of holding the request open while it builds, so an Inbox with a large number of submissions no longer times out.
- Added Google reCAPTCHA Enterprise to the captcha providers you can set on an Inbox, alongside Google reCAPTCHA, hCaptcha, and Cloudflare Turnstile. It takes the ID of the reCAPTCHA key in your Google Cloud project, the project ID, and a Google Cloud API key restricted to the reCAPTCHA Enterprise API.
- Added a Minimum score field to the captcha settings on an Inbox for Google reCAPTCHA and Google reCAPTCHA Enterprise, allowing you to reject submissions that score below the threshold you set. reCAPTCHA scores each visitor from 0.0 for likely bots to 1.0 for likely people, and defaults to 0.5. Existing reCAPTCHA are set to 0 to maintain existing behavior.
- Added the Tell hCaptcha which Site key to expect setting to the captcha settings on an Inbox, allowing you to stop a form that uses a different Site Key on your hCaptcha account from submitting to that Inbox. New Inboxes will default to
true, while existing Inboxes will befalseby default for backwards compatibility. - Added an explainer to each field in the captcha settings on an Inbox, describing where the value comes from in the provider's console and what CloudCannon does with it.
- Redesigned the emails CloudCannon sends.
- Added a Syncing Paused filter to the Filter Bar in your Sites Browser, allowing you to list the Sites whose Syncing is paused.
- Changed the Failing to sync filter in your Sites Browser so that a Site with Syncing paused is reported as paused rather than failing.
- Changed the DAM connection forms under Org Settings to show the error your provider returned when a connection fails, instead of a generic message.
- Updated the CloudCannon API and the Settings tab of your Inbox so that it shows whether a secret key is set, rather than returning the value of that key.
Fixes
- Reverted the change from September 25, 2026: "CloudCannon now accepts a stronger authentication method than the one named in your AuthnContext setting, instead of requiring an exact match." This caused issues with existing providers, and we will follow this revert with a configurable option.
- Fixed an issue where CloudCannon returned an error for a GitLab webhook it does not act on, such as a merge request update that only changed labels, so GitLab could treat the webhook as failing.
- Fixed an issue where the graph on the Publishing tab of a Project drew one chain of Sites as several separate trees.
- Fixed an issue where the Cloudinary asset picker opened behind the rest of the interface.
- Fixed an issue where an error page could be cached and shown again later, so the reference and time it displayed could belong to an earlier request.
- Updated dependencies to patch security vulnerabilities.