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.