You are viewing beta documentation for Formie 4.x. View the latest stable version (3.x) →
Getting Elements

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.

ParamDescription
afterNarrows the query to submissions created on or after a date.
anyStatusClears Formie’s default incomplete and spam filters.
asArrayReturns arrays instead of Submission objects.
beforeNarrows the query to submissions created before a date.
fieldNarrows the query by a Formie field value.
formNarrows the query by form handle or Form object.
formIdNarrows the query by form ID.
isIncompleteNarrows the query by incomplete state.
isSpamNarrows the query by spam state.
statusNarrows the query by submission status handle.
statusIdNarrows the query by submission status ID.
userNarrows the query by owner user object, username, or email.
userIdNarrows the query by owner user ID.
dateCreatedNarrows the query by creation date.
dateUpdatedNarrows the query by last-updated date.
fixedOrderReturns results in the order specified by id.
idNarrows the query by element ID.
inReverseReverses the result order.
limitLimits the number of results.
offsetSkips a number of results.
orderBySets the result order.
titleNarrows the query by submission title.
trashedReturns soft-deleted submissions.
uidNarrows 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();