Portal Community

The Publishing Lifecycle

1

Draft

Default state for all new forms. The form is editable in the designer. Not visible via the API. Only accessible in Form Studio by form authors.

2

In Review

Click Submit for Review. The form is locked — no further design edits until reviewed. A reviewer receives notification. The reviewer can approve (move to Published) or reject (return to Draft with comments).

3

Published

The form is live. Callers can fetch it via getFormByName() or getFormById(). Workflow nodes referencing this form will use the published schema.

Version History

Every publish creates a new version entry in the form's history. You can view all previous versions in the History tab of the designer. Each version entry shows:

Updating a Published Form

You cannot directly edit a published form. To make changes:

  1. Click Create New Version on the published form
  2. This creates a Draft copy of the current schema
  3. Make your edits in the designer
  4. Submit for Review and Publish as normal
  5. The new published version replaces the old one
  6. The old version remains in history (accessible for rollback)

Rollback

If a newly published form has an issue, you can rollback to a previous version:

  1. Open the form's History tab
  2. Click Restore on any previous version
  3. This creates a new Draft from the historical schema
  4. Review and publish as a new version
Rollback Creates a New Version Rolling back does not time-travel — it creates version N+1 from the historical schema. Version history is always append-only for audit integrity.

Archive vs Delete

Forms are never permanently deleted via the Studio UI. Archiving is the end-of-life action:

ActionEffectReversible
ArchiveSoft-delete — hidden from API, marked inactive in DBYes (un-archive in admin)
Hard DeletePhysical DB row removal — API only, not in Studio UINo

Publish API Call

Publishing is a status update on the form record:

// Update form status to published
await apiClient.updateForm(formId, {
  ...currentDefinition,
  metadata: {
    ...currentDefinition.metadata,
    status: 'published',
    publishedAt: new Date().toISOString(),
    publishedBy: currentUser.id
  }
});