Submission Queries
You can fetch submissions in your templates or PHP code using submission queries.
{# Create a new submission query #}
{% set submissionQuery = craft.formie.submissions() %}// Create a new submission query
$submissionQuery = \verbb\formie\elements\Submission::find();Once you’ve created a query, set any parameters you need, then fetch the result with .one() or .all(). A submission query returns Submission objects unless you use asArray().
Formie submission queries build on Craft element queries. See Element Queries (opens new window) in the Craft docs if you want the broader query syntax.
Fetch submissions for a form
The most common use is fetching submissions for a specific form.
{% set submissions = craft.formie.submissions()
.form('contactForm')
.limit(10)
.all() %}
{% for submission in submissions %}
<p>{{ submission.title }}</p>
{% endfor %}$submissions = \verbb\formie\elements\Submission::find()
->form('contactForm')
->limit(10)
->all();Query by field value
Submission queries can also filter by Formie field handles. Use field(handle, value) when the handle is dynamic, or call the field handle directly when it is known.
{% set submissions = craft.formie.submissions()
.form('contactForm')
.field('emailAddress', '[email protected]')
.all() %}
{% set matchingSubmissions = craft.formie.submissions()
.form('contactForm')
.emailAddress('[email protected]')
.all() %}$submissions = \verbb\formie\elements\Submission::find()
->form('contactForm')
->field('emailAddress', '[email protected]')
->all();
$matchingSubmissions = \verbb\formie\elements\Submission::find()
->form('contactForm')
->emailAddress('[email protected]')
->all();When you query by a field handle, Formie uses that field type’s query handling. Text fields, option fields, element fields, and nested fields may not all compare values in exactly the same way.
Parameters
Submission queries support Formie-specific parameters as well as Craft’s standard element query parameters.
| Param | Description |
|---|---|
after | Narrows the query to submissions created on or after a date. |
anyStatus | Clears Formie’s default incomplete and spam filters. |
asArray | Returns arrays instead of Submission objects. |
before | Narrows the query to submissions created before a date. |
field | Narrows the query by a Formie field value. |
form | Narrows the query by form handle or Form object. |
formId | Narrows the query by form ID. |
isIncomplete | Narrows the query by incomplete state. |
isSpam | Narrows the query by spam state. |
status | Narrows the query by submission status handle. |
statusId | Narrows the query by submission status ID. |
user | Narrows the query by owner user object, username, or email. |
userId | Narrows the query by owner user ID. |
dateCreated | Narrows the query by creation date. |
dateUpdated | Narrows the query by last-updated date. |
fixedOrder | Returns results in the order specified by id. |
id | Narrows the query by element ID. |
inReverse | Reverses the result order. |
limit | Limits the number of results. |
offset | Skips a number of results. |
orderBy | Sets the result order. |
title | Narrows the query by submission title. |
trashed | Returns soft-deleted submissions. |
uid | Narrows the query by UID. |
after
Narrows the query to submissions created on or after a date.
{% set submissions = craft.formie.submissions()
.after(date('2026-01-01'))
.all() %}$submissions = \verbb\formie\elements\Submission::find()
->after(new \DateTime('2026-01-01'))
->all();anyStatus
Clears Formie’s default incomplete and spam filters.
By default, submission queries only return submissions where isIncomplete and isSpam are both false. Use anyStatus() when you need to include incomplete or spam submissions in the same query.
{% set submissions = craft.formie.submissions()
.anyStatus()
.all() %}$submissions = \verbb\formie\elements\Submission::find()
->anyStatus()
->all();asArray
Returns arrays of data instead of Submission objects.
{% set submissions = craft.formie.submissions()
.asArray()
.all() %}$submissions = \verbb\formie\elements\Submission::find()
->asArray()
->all();before
Narrows the query to submissions created before a date.
{% set submissions = craft.formie.submissions()
.before(date('2026-02-01'))
.all() %}$submissions = \verbb\formie\elements\Submission::find()
->before(new \DateTime('2026-02-01'))
->all();dateCreated
Narrows the query by the submissions’ creation dates.
{% set start = date('first day of last month')|atom %}
{% set end = date('first day of this month')|atom %}
{% set submissions = craft.formie.submissions()
.dateCreated(['and', ">= #{start}", "< #{end}"])
.all() %}$start = new \DateTime('first day of last month')->format(\DateTime::ATOM);
$end = new \DateTime('first day of this month')->format(\DateTime::ATOM);
$submissions = \verbb\formie\elements\Submission::find()
->dateCreated(['and', ">= {$start}", "< {$end}"])
->all();dateUpdated
Narrows the query by the submissions’ last-updated dates.
{% set lastWeek = date('1 week ago')|atom %}
{% set submissions = craft.formie.submissions()
.dateUpdated(">= #{lastWeek}")
.all() %}$lastWeek = new \DateTime('1 week ago')->format(\DateTime::ATOM);
$submissions = \verbb\formie\elements\Submission::find()
->dateUpdated(">= {$lastWeek}")
->all();field
Narrows the query by a Formie field value.
{% set submissions = craft.formie.submissions()
.form('contactForm')
.field('emailAddress', '[email protected]')
.all() %}$submissions = \verbb\formie\elements\Submission::find()
->form('contactForm')
->field('emailAddress', '[email protected]')
->all();You can also call the field handle directly when you know it ahead of time.
{% set submissions = craft.formie.submissions()
.form('contactForm')
.emailAddress('[email protected]')
.all() %}$submissions = \verbb\formie\elements\Submission::find()
->form('contactForm')
->emailAddress('[email protected]')
->all();fixedOrder
Returns results in the same order as the IDs passed to id.
{% set submissions = craft.formie.submissions()
.id([3, 1, 2])
.fixedOrder()
.all() %}$submissions = \verbb\formie\elements\Submission::find()
->id([3, 1, 2])
->fixedOrder()
->all();form
Narrows the query by form handle or Form object.
{% set submissions = craft.formie.submissions()
.form('contactForm')
.all() %}$submissions = \verbb\formie\elements\Submission::find()
->form('contactForm')
->all();formId
Narrows the query by form ID.
{% set submissions = craft.formie.submissions()
.formId(1)
.all() %}$submissions = \verbb\formie\elements\Submission::find()
->formId(1)
->all();id
Narrows the query by element ID.
{% set submission = craft.formie.submissions()
.id(1)
.one() %}$submission = \verbb\formie\elements\Submission::find()
->id(1)
->one();inReverse
Reverses the result order.
{% set submissions = craft.formie.submissions()
.inReverse()
.all() %}$submissions = \verbb\formie\elements\Submission::find()
->inReverse()
->all();isIncomplete
Narrows the query by incomplete state.
{% set incompleteSubmissions = craft.formie.submissions()
.isIncomplete(true)
.all() %}
{% set submissions = craft.formie.submissions()
.isIncomplete(null)
.all() %}$incompleteSubmissions = \verbb\formie\elements\Submission::find()
->isIncomplete(true)
->all();
$submissions = \verbb\formie\elements\Submission::find()
->isIncomplete(null)
->all();isSpam
Narrows the query by spam state.
{% set spamSubmissions = craft.formie.submissions()
.isSpam(true)
.all() %}
{% set submissions = craft.formie.submissions()
.isSpam(null)
.all() %}$spamSubmissions = \verbb\formie\elements\Submission::find()
->isSpam(true)
->all();
$submissions = \verbb\formie\elements\Submission::find()
->isSpam(null)
->all();limit
Limits the number of submissions returned.
{% set submissions = craft.formie.submissions()
.limit(10)
.all() %}$submissions = \verbb\formie\elements\Submission::find()
->limit(10)
->all();offset
Skips a number of results.
{% set submissions = craft.formie.submissions()
.offset(3)
.all() %}$submissions = \verbb\formie\elements\Submission::find()
->offset(3)
->all();orderBy
Sets the result order.
{% set submissions = craft.formie.submissions()
.orderBy('elements.dateCreated asc')
.all() %}$submissions = \verbb\formie\elements\Submission::find()
->orderBy('elements.dateCreated asc')
->all();status
Narrows the query by submission status handle.
{% set submissions = craft.formie.submissions()
.status('approved')
.all() %}$submissions = \verbb\formie\elements\Submission::find()
->status('approved')
->all();statusId
Narrows the query by submission status ID.
{% set submissions = craft.formie.submissions()
.statusId(1)
.all() %}$submissions = \verbb\formie\elements\Submission::find()
->statusId(1)
->all();title
Narrows the query by submission title.
{% set submissions = craft.formie.submissions()
.title('*Jane*')
.all() %}$submissions = \verbb\formie\elements\Submission::find()
->title('*Jane*')
->all();trashed
Returns submissions that have been soft-deleted.
{% set submissions = craft.formie.submissions()
.trashed()
.all() %}$submissions = \verbb\formie\elements\Submission::find()
->trashed()
->all();uid
Narrows the query by UID.
{% set submission = craft.formie.submissions()
.uid('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')
.one() %}$submission = \verbb\formie\elements\Submission::find()
->uid('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')
->one();user
Narrows the query by owner user object, username, or email.
{% set submissions = craft.formie.submissions()
.user(currentUser)
.all() %}$submissions = \verbb\formie\elements\Submission::find()
->user($currentUser)
->all();userId
Narrows the query by owner user ID.
{% set submissions = craft.formie.submissions()
.userId(currentUser.id)
.all() %}$submissions = \verbb\formie\elements\Submission::find()
->userId($currentUser->id)
->all();