Defer Forms

Stop writing your forms as text.

Contact Form 7 asks you to type [text* your-name] into a box. Defer Forms gives it a visual builder, a submissions database and everything CF7 leaves out — without changing a single form you already have.

Free and GPL. No account, no licence key, no data leaves your site.

Contact Form 7 is where your forms live. It was never where they were built.

CF7 renders forms and sends mail, reliably, on millions of sites. Everything past that point it leaves to you. Defer Forms fills in the rest and touches none of it.

What Contact Form 7 already does

  • Renders a form from form tags you write by hand
  • Validates what a visitor typed
  • Sends the mail, and only the mail
  • Discards uploaded files once sent
  • Keeps no record of who wrote in
  • Offers hooks, if you write PHP

What Defer Forms adds on top

  • A drag-and-drop builder that writes the tags for you
  • Every submission stored, searchable and exportable
  • Uploads kept with the entry and downloadable
  • Steps, columns and conditional fields
  • An inbox: read, reply, mark replied or done
  • Colours and spacing without writing CSS

Sixteen features, all of them free

Nothing here is held back behind a tier, and nothing needs switching on. This is the whole plugin.

Submissions

Submissions database
Every entry stored with search, filtering and CSV export.
File uploads kept
Uploaded files are stored with the entry and downloadable from it, which CF7 alone never does.
Entry workflow
Mark an entry replied or done, and answer it from the entry itself.

Building forms

Visual builder
Drag and drop every Contact Form 7 field, with live preview and undo.
Grid layout
Arrange fields in one to four columns, collapsing on small screens.
Multi-step forms
Split a long form into steps, each with its own title and progress indicator.
Conditional logic
Show or hide any field from the answers above it, combined with AND or OR.
Redirect after submit
Send visitors to a thank-you page or any URL, or leave them where they are.
Template library
Twenty-plus ready-made forms that open straight in the builder.

Design and fields

Styling controls
Colours, typography and spacing for every form on the site, plus a CSS class for the one that differs.
Extra field types
Star rating, country, password, dynamic text, product, quiz and character count.

Protection

Spam protection
A honeypot, a time-trap and a duplicate check, on by default, with no captcha for visitors to solve.
Privacy and GDPR
Submissions answer WordPress's own export and erase requests.

Tools

Import and export
Move a form between sites as a single JSON file.
Revisions
The last ten versions of a form, each one restorable.

Notifications

Instant notifications
Every submission posted to Telegram, Slack, Discord or a webhook of your own as it arrives.

Installing it takes about a minute

Defer Forms sits on top of Contact Form 7 and needs it active. Existing forms keep working exactly as they are.

  1. Install Contact Form 7 and activate it, if it is not already running.
  2. Add Defer Forms from Plugins, Add New, or upload the folder to /wp-content/plugins/.
  3. Activate it from the Plugins screen.
  4. Open Defer Forms in the sidebar. Your existing forms are already listed.
WordPress 6.5 or newer PHP 8.0 or newer Contact Form 7 required Licence GPL-2.0-or-later

Guides

How each part works, roughly in the order you will meet it.

Building a form

Open Defer Forms, Forms and either edit an existing CF7 form or start a new one — both land you in the builder. Drag fields in from the left, reorder them, set each one's label, placeholder and validation in the panel beside it, then save. What comes out is an ordinary Contact Form 7 form: the same shortcode works everywhere it did before, and CF7 still sends the mail.

Splitting a form into steps

Add a page break wherever a new step should begin. Each step carries its own title, description and CSS class, set on the page break itself, and a progress indicator appears above the form automatically. A page break carries the settings of the step that follows it, so the first one belongs at the very top.

Showing a field only when it is relevant

Every field has a conditional logic panel. Add one or more rules — equals, is not, is empty, contains — against any field above it, and combine them with AND or OR. The rules run in the browser as the visitor types, so a field appears the moment its condition is met, and a hidden field is never required.

Putting fields side by side

Drop fields into a grid row and choose one to four columns. Rows collapse to a single column on narrow screens on their own, so a two-column name and email pair still works on a phone.

Reading and answering entries

Everything arrives under Submissions, with search, per-form filters and CSV export. Open an entry to read every answer, download whatever was attached, and reply without copying the address into a mail client. Mark it replied or done and the list stops being a log and starts being an inbox — the same buttons take it back off again.

What happens to uploaded files

Contact Form 7 attaches a file to the mail and then deletes it. Defer Forms keeps a copy with the entry, downloadable from it, until the entry is deleted or your retention period removes it. There is a storage ceiling — one gigabyte by default — and once it is reached the plugin says so on screen: submissions and mail keep arriving, only the copies stop.

Getting told the moment something arrives

Under Notifications, switch on Telegram, Slack, Discord or a webhook of your own and paste in the token or URL it needs. Each destination stays off until you turn it on, and each has a send a test message button that uses the saved settings, so you can prove a token works before a real enquiry depends on it. Spam is never forwarded.

Keeping bots out

Three checks run on every form with nothing to add to it: a honeypot field real visitors never see, a time-trap that rejects submissions sent faster than a human could type, and a duplicate check for the same answers repeated within a minute. Anything caught is kept on its own spam tab rather than destroyed, because filters occasionally catch a real person.

Sending visitors somewhere after they submit

Each form's settings hold a redirect: a page on this site, any URL, or nowhere at all, which keeps CF7's ordinary on-page message. A redirect can wait a couple of seconds so the success message is readable first, and can open in a new tab.

Moving a form to another site

Export a form from the Forms screen and it downloads as one JSON file — fields, steps, conditions, styling and settings together. Import that file on another site and the form is rebuilt there. It is also the simplest backup of a form you spent an afternoon on.

Changing how forms look

Styling sets colours, typography, spacing and button shape for every form the plugin renders, with a preview that matches the front end exactly. For the one form that has to look different, give it a CSS class of its own in that form's settings and target the class from your theme.

Going back to an earlier version

Every save keeps the previous version, up to ten. Open revisions in the builder toolbar to see when each was written and restore any of them. Useful the first time a save turns out to have removed a field you meant to keep.

Common questions

Does this replace Contact Form 7?

No. Defer Forms extends CF7 and needs it installed and active. CF7 still renders the form and still sends the mail; this plugin adds the layer around that.

Will it change my existing forms?

No. Existing shortcodes render exactly as before, and every feature here is opt-in per form. A form you never open in the builder is left byte for byte as it was.

Does any of my data leave the site?

Only if you switch on a notification destination and give it your own token or URL. There is no telemetry, no licence check and no remote asset anywhere in the plugin — and, for the same reason, this page loads nothing from anywhere else either.

What happens to my entries if I delete the plugin?

Nothing, unless you ask. Deleting the plugin leaves the submissions table alone by default; a setting under Settings, General turns on full removal for anyone who wants a clean uninstall.

Is there a paid version?

Not today, and everything listed on this page is free. If a paid tier is ever built it will add new things beside these — nothing described here moves behind a paywall.

Hooks for developers

Contact Form 7's own hooks are untouched. These are the ones Defer Forms adds. A submission passes through the first four in order: whether to store it, what to store, where to announce it, and what it became.

apply_filters( 'deferforms_store_submission', $store, $contact_form, $status )

Return false to keep an entry out of the table entirely. The mail is still sent and nothing is written. $status is either submitted or spam.

apply_filters( 'deferforms_submission_data', $data, $contact_form, $status )

The fields on their way into the table. Redact a value, drop a field, or add one of your own. Keys beginning with an underscore are the plugin's own bookkeeping and are never shown as answers.

do_action( 'deferforms_notify', $entry )

One submission, described once, for sending anywhere the Notifications screen does not reach. $entry carries entry_id, form_id, title, when, at, fields and link. Submitted entries only — spam never fires it.

do_action( 'deferforms_submission_stored', $id, $data, $contact_form, $status )

The entry exists and is complete: uploads are kept and $id can be linked to. Spam fires this too, with $status saying so. It runs last, because this is where somebody else's code runs.

apply_filters( 'deferforms_capability', 'manage_options' )

The capability the admin screens and every REST route require.

apply_filters( 'deferforms_attachment_limit', $bytes )

The ceiling on kept uploads across the site. Past it, submissions and their mail arrive as normal but files are no longer copied to the server.

do_action( 'deferforms_submissions_deleted', $rows )

Entries that have just been removed, with their data, so anything mirroring them elsewhere can keep up.

What leaves your site

All four destinations are off until you enter your own credentials and switch one on. When one is on, each submission is posted to it as it arrives, carrying the form's title, the time, every field and answer, and a link back to the entry in your admin. Spam is never sent. The test button posts a message containing no visitor data.

Telegram
Sent to the Telegram Bot API at api.telegram.org, using the bot token and chat ID you supply.
Slack
Sent to the incoming webhook URL you supply, at hooks.slack.com.
Discord
Sent to the webhook URL you supply, at discord.com.
Your own webhook
No fixed service behind it: the submission is posted as JSON to whatever address you enter and to no other. Commonly an automation service such as Zapier, Make or n8n, or a server of your own — whose terms are yours to read before you paste the URL in.

Source code

The admin screens are React, compiled with Vite. The unminified source of every one of those files ships inside the plugin, in ui/, alongside the build configuration — run npm install && npm run build in the plugin folder to rebuild it. The one bundled third-party library is flatpickr, MIT licensed.

Your forms are already here. Give them somewhere to land.

Install it beside Contact Form 7 and open the Forms screen. Every form you have is listed, and nothing about them changes until you decide it should.