Submissions

Understand form submissions, their lifecycle statuses, relationships, validation and how to query and export submission data.

Overview

The FormSubmission model represents a completed or in-progress form submission. Submissions track status, timing, submitter information and metadata. Each submission contains multiple FormFieldSubmission records storing individual field values.

Core Properties

PropertyTypeDescription
statusSubmissionStatusCurrent status of the submission
ip_addressstring|nullIP address of submitter (privacy configurable)
user_agentstring|nullBrowser user agent string
completion_time_secondsint|nullTime taken to complete the form (in seconds)
submitted_atdatetimeWhen the submission was finalized
metadataarrayAdditional custom data (UTM params, referrer, etc.)

SubmissionStatus Enum

Submissions use a string-backed enum to track their lifecycle:

Creating Submissions

Use the Polyform facade to submit form data with automatic validation:

app/Http/Controllers/SubmissionController.php

Draft Submissions

Save partial progress for multi-step or long forms:

Relationships

  • form - BelongsTo Form (parent form)
  • submittable - MorphTo (submitting entity, e.g., User)
  • fieldSubmissions - HasMany FormFieldSubmission (field values)

Value Bag

Access all field values as a convenient array via the value_bag computed attribute:

The value bag is cached and automatically synced with field submissions. It is ideal for displaying submitted data or passing to webhooks.

Query Scopes

  • drafts() - Filter submissions with STARTED status
  • forSubmitter($submittable) - Filter by submittable entity

Submittable Trait

Add the HasPolyformSubmissions trait to models that submit forms:

app/Models/User.php

Field Submissions

Individual field values are stored in FormFieldSubmission records:

Validation

The Polyform::submit() method validates all field values using the appropriate FieldValidator for each field type. Validation respects conditional logic and required flags.

Webhooks

Submissions trigger webhook events automatically:

Webhooks are queued, retried on failure and signed with HMAC for security. Configure retries and signing in config/polyform.php.

Exporting Submissions

Export submission data to multiple formats:

Exports respect field labels, format values appropriately and include metadata columns. CSV and Excel exports are Excel-compatible.

Metadata

Store additional context with submissions:

  • UTM parameters for tracking campaigns
  • Referrer URLs for source attribution
  • Device information (captured from user agent)
  • Custom application data (flags, tags, notes)

Best Practices

  • Use withCount('submissions') when loading forms to avoid N+1 queries
  • Enable draft saving for multi-step forms to improve completion rates
  • Set appropriate max_submissions and max_submissions_per_user limits
  • Use scopes for efficient querying of large submission datasets
  • Leverage webhooks for real-time integrations (CRM, email, Slack)
  • Export submissions regularly for backup and analysis