Start with one form and one action

Install both Perfect Forms and Shopify Flow in your store. Create and publish a form, then submit a test response so you know what answers you expect the workflow to receive.

  1. In Shopify Flow, create a workflow and select Perfect Forms → Form response submitted as its trigger.
  2. Add a condition on response.formId to match the form you want to handle. Copy its Form ID from Perfect Forms.
  3. For steps that use answers, check that response.dataAvailable is true.
  4. Add an action such as Send internal email. Use Flow’s variable picker to insert the form details and response.url.
  5. Turn on the workflow, submit another test response and inspect the run in Flow.

The form condition matters. Without it, a workflow intended for wholesale applications can also run for contact enquiries and feedback from your other forms.

Shopify’s Flow introduction explains how triggers, conditions and actions fit together.

Match an answer to the right question

The trigger’s response.fields is a list of answers. Each item contains a stable field id, a readable field key, its original label, its type, a text value and a list of values.

For a condition such as “Topic is Wholesale”, match the field and the answer within the same list item. Checking that one item has the right question and a different item contains “Wholesale” can send the request down the wrong branch.

Readable keys come from field labels. A field labelled “Business email” becomes business_email; duplicate labels get numbered suffixes. Use a stable field ID for a workflow that must survive label changes. Recheck a workflow after deleting and recreating a field.

The trigger also includes data, containing answers as JSON. More advanced workflows can parse it with Flow’s Run code action and define the output fields they need. For a first workflow, the field list and response link are usually enough.

Three useful places to start

A wholesale application reaches the wholesale team

Filter to the wholesale form, then send an internal email with the form name and response link. Keep approval with the person who checks the applicant. Receipt of an application is not an approval.

A product issue goes to support

Filter the contact form by its enquiry type. Notify the team that handles product issues and link to the response so they can read the message and review any photos.

An enquiry enters your existing tracking process

If your destination has a compatible Flow connector, pass the selected answers into it. Confirm which fields the destination requires and test one submission before enabling the workflow for all enquiries. Available actions depend on the apps and plan used by your store.

A submitted email address is not automatically a Shopify customer reference. If an action needs a customer or an order, add the appropriate lookup and handle a missing match before trying to update it.

Handle files and unavailable answers

File answers contain filenames. They do not expose public download URLs. Use response.url to open the authenticated response page and download attachments there.

Some events have response metadata without answer data. This happens when a response is locked by the plan allowance or the payload is too large for Flow. In those cases, dataAvailable is false and dataUnavailableReason explains why.

Make the fallback deliberate: notify someone that a response needs review, with the response link, instead of creating an empty lead or sending an incomplete message. Branch on data availability before using an answer as a required destination field.

Test the branches you intend to rely on

  • Submit the intended form and confirm the expected action runs.
  • Submit a different form and confirm the workflow ignores it.
  • Try each dropdown answer used in a condition, including an empty optional answer.
  • Check the fallback for unavailable data before making answer-dependent steps live.
  • Revisit field mappings after changing the form or destination.

A trigger can occasionally be delivered more than once during a retry. For actions that create records or have other lasting effects, use response.id as the unique reference in the destination and check whether it has already been processed.

Keep the first version small. Once one form reaches one destination correctly, add the branches your process actually needs.

Written by Merle Studio, the team behind Perfect Forms. Need a hand with your setup? Get in touch.