Skip to content

Export and import forms

You can download any of your forms as one file and import that file on another site. Use it to move forms from a staging site to the live one, to set up a new site with forms you already have, or to keep a backup.

The file holds each form as you built it. That means its fields, its settings, its emails and its webhooks. Submissions are not part of it.

Go to Forms → Import & export. Tick the forms you want and click Download export file.

You can also export from the forms list. Tick a few forms and pick Export from the bulk actions, or use the Export link under a single form.

The file includes the email addresses that receive your notifications, so treat it like any other file with contact details in it. It never includes webhook secrets. You set a new secret after importing (see below).

On Forms → Import & export, choose an export file and click Upload and preview. Nothing is saved yet. You first see every form in the file and decide what happens to each one:

On this site What you can do
Not on this site yet Import (the default) or Skip
A form with this slug already exists Skip (the default), Replace the existing form or Import as a copy
Callback widget form Replace the existing form or Skip, or Import when the site has none yet
  • Replace the existing form keeps its slug, so every page that shows the form keeps working. The previous settings are kept as a backup. To go back, open the form, click Saved versions & backup, then Use backup.
  • Import as a copy adds a second form with its own slug, for example contact-2, and “(copy)” after the title.
  • A callback widget form cannot be imported as a copy, because the widget only ever shows its own form.

Click Import. A short report shows what happened to each form.

Every imported form is published right away. Its emails and webhooks are all turned off, also when you replace a form that had them on. An imported form never starts emailing your team, sending a confirmation to visitors or calling a webhook before you decide it should.

The recipients, subjects, messages and webhook addresses are all kept. Open the form, go to the Emails and Webhooks tabs and turn on what you need. Until you do, the form’s screen reminds you which notifications the import turned off.

A webhook needs a new secret before you can turn it on, because the file never carries one. Click Generate next to the secret, then copy the new value into the service that receives the webhook, so it can check the signature. See Webhooks. When you replace a form, a webhook with the same address as one the form already had keeps that form’s secret, so there is nothing to generate.

A form that was paused in the file is not paused after the import. Replacing a draft publishes it.

  • A form with problems in the file is listed with the reason and left out. The other forms still import.
  • If the sender address of a form uses a different domain than the new site, the form still imports. The report repeats the editor’s warning that such emails may land in spam.
  • The file has the same shape as the files in Forms in your theme (sync). One entry of forms, without its slug, can go into data/octa-forms/{slug}.json. Give an active webhook its secret back first, or turn it off, because theme sync refuses an active webhook without one.
{
"format": "octa-forms-export",
"version": 1,
"exported_at": "2026-10-16T10:00:00Z",
"plugin_version": "1.5.0",
"site": "https://example.com",
"forms": [
{ "slug": "contact", "title": "Contact", "config": { "fields": [] } }
]
}

config is the same JSON you see in the form editor, minus the webhook secrets. The importer refuses a file from a newer version of the plugin. Update the plugin first.

The same export and import work from WP-CLI, with the same rules. See WP-CLI.

Terminal window
wp octa-forms forms export --file=forms.json
wp octa-forms forms import forms.json --on-conflict=replace