How can I extract dynamic Tally fields into variables from a webhook payload?

:bullseye: What is your goal?

I’m using a Tally form and Webhook in Make.com. I want to extract multiple values from the JSON data into “Set multiple variables.” My end goal is to use these values in downstream steps like email or database updates.

:thinking: What is the problem & what have you tried?

I’m receiving data from a Tally form via webhook in Make. The structure uses an array under data.fields, where each entry has a key, label, type, and value. I want to extract each field dynamically (like full name, email, photos, etc.) using a Set multiple variables module.

I’m trying this expression:

get(first(select(1.data.fields; key=“question_01”)); “value”)

But I’m unsure how to apply this correctly for each field, especially when some values are arrays (like dropdowns and multiple choice) or even objects (like file uploads with multiple images). Also: mapping toggle doesn’t appear in Set multiple variables and pasting these expressions just treats them as text.

How can I properly map these and extract all the fields (including multi-photo uploads) cleanly and cheaply?

Sample JSON Payload (redacted)

:clipboard: Error messages or input/output bundles

{
  "data": {
    "formName": "Redacted Intake Form",
    "submissionId": "xyz123",
    "responseId": "abc789",
    "fields": [
      {
        "key": "question_01",
        "label": "Full Name",
        "type": "INPUT_TEXT",
        "value": "John Smith"
      },
      {
        "key": "question_02",
        "label": "Email",
        "type": "INPUT_EMAIL",
        "value": "john.smith@example.com"
      },
      {
        "key": "question_03",
        "label": "Phone Number",
        "type": "INPUT_PHONE_NUMBER",
        "value": "+15555555555"
      },
      {
        "key": "question_04",
        "label": "What best describes you?",
        "type": "DROPDOWN",
        "value": [
          "option-id-1"
        ],
        "options": [
          {
            "id": "option-id-1",
            "text": "Customer"
          },
          {
            "id": "option-id-2",
            "text": "Business Owner"
          }
        ]
      },
      {
        "key": "question_06",
        "label": "Preferred Contact Method",
        "type": "MULTIPLE_CHOICE",
        "value": [
          "option-id-3"
        ],
        "options": [
          {
            "id": "option-id-3",
            "text": "Email"
          },
          {
            "id": "option-id-4",
            "text": "Phone"
          }
        ]
      },
      {
        "key": "question_07",
        "label": "Upload project photos",
        "type": "FILE_UPLOAD",
        "value": [
          {
            "id": "img001",
            "name": "project_photo1.jpg",
            "url": "https://storage.tally.so/private/project_photo1.jpg?id=img001&accessToken=EXAMPLE123TOKEN&signature=signature123abc"
          },
          {
            "id": "img002",
            "name": "project_photo2.jpg",
            "url": "https://storage.tally.so/private/project_photo2.jpg?id=img002&accessToken=EXAMPLE456TOKEN&signature=signature456def"
          }
        ]
      },
      {
        "key": "question_hidden",
        "label": "hidden_fields",
        "type": "INPUT_TEXT",
        "value": "NPP.v1_xxxxxxxx"
      }
    ]
  }
}

:camera_with_flash: Screenshots (scenario flow, module settings, errors)

Didn’t post in last post for some reason

You can handle this Tally > Make pattern using expressions only, with no extra modules.

The trick is to think in 3 layers: first find the field by key, then grab its value, then post process any arrays or objects.

I hope this helps you!

1 Like

Those aren’t functions in your set variables module, those are just text strings. Select the functions from the menu instead.

1 Like

I appreciate it, the one thing that is wrong on the webhook photo as you can see, is that the fields is an array, but the webhook is viewing it as it’s own object, when it is actually an array of objects.

The structure my form on Tally is similar to this:

{
  "data": {
    "formName": "Redacted Intake Form",
    "submissionId": "xyz123",
    "responseId": "abc789",
    "fields": [
      {
        "key": "question_01",
        "label": "Full Name",
        "type": "INPUT_TEXT",
        "value": "John Smith"
      },
      {
        "key": "question_02",
        "label": "Email",
        "type": "INPUT_EMAIL",
        "value": "john.smith@example.com"
      },
      {
        "key": "question_03",
        "label": "Phone Number",
        "type": "INPUT_PHONE_NUMBER",
        "value": "+15555555555"
      },
      {
        "key": "question_04",
        "label": "What best describes you?",
        "type": "DROPDOWN",
        "value": [
          "option-id-1"
        ],
        "options": [
          {
            "id": "option-id-1",
            "text": "Customer"
          },
          {
            "id": "option-id-2",
            "text": "Business Owner"
          }
        ]
      },
      {
        "key": "question_06",
        "label": "Preferred Contact Method",
        "type": "MULTIPLE_CHOICE",
        "value": [
          "option-id-3"
        ],
        "options": [
          {
            "id": "option-id-3",
            "text": "Email"
          },
          {
            "id": "option-id-4",
            "text": "Phone"
          }
        ]
      },
      {
        "key": "question_07",
        "label": "Upload project photos",
        "type": "FILE_UPLOAD",
        "value": [
          {
            "id": "img001",
            "name": "project_photo1.jpg",
            "url": "https://storage.tally.so/private/project_photo1.jpg?id=img001&accessToken=EXAMPLE123TOKEN&signature=signature123abc"
          },
          {
            "id": "img002",
            "name": "project_photo2.jpg",
            "url": "https://storage.tally.so/private/project_photo2.jpg?id=img002&accessToken=EXAMPLE456TOKEN&signature=signature456def"
          }
        ]
      },
      {
        "key": "question_hidden",
        "label": "hidden_fields",
        "type": "INPUT_TEXT",
        "value": "NPP.v1_xxxxxxxx"
      }
    ]
  }
}

Welcome to the Make community!

You can use the built-in functions map and get to access variables within an array.

To do this, you can use the built-in function map

{{ map(complex array; key; [key for filtering]; [possible values for filtering separated by a comma]) }}

and the built-in function get (or first) —

{{ get(object or array; path) }}

so you get something that looks like this —

{{ first(map(1.data.fields; "target"; "key"; "value_of_key")) }}

e.g.:

{{ first(map(1.data.fields; "value"; "label"; "Full Name")) }}
{{ first(map(1.data.fields; "value"; "label"; "Email")) }}
{{ first(map(1.data.fields; "value"; "label"; "Phone Number")) }}
{{ first(map(1.data.fields; "value"; "label"; "What best describes you?")) }}
{{ first(map(1.data.fields; "value"; "label"; "Preferred Contact Method")) }}

etc.

For more information, the function’s documentation can be found in the Help Centre and the “Mapping with Arrays” link below. You should also complete the tutorials in the Make Academy, especially Using get() and map() functions.

I’d recommend going through the Make Academy if you haven’t yet!

Here are some useful links and guides you can use to learn more on how to use the Make platform, apps, and app modules. I found these useful when I was learning Make, and hope they might benefit you too —

Learn Make

How-Tos

Hope this helps! If you are still having trouble, please provide more details.

@samliew

1 Like

That’s just how Make shows arrays - it displays only the first item so you can see the structure of the items inside. You can still use the order index of specific items to access them, or use the map() function to dynamically find them.

Just make sure the select the function from the menu instead of typing it.

1 Like

Ok, I am able to get the value from collections within the array that are simple such as the first collection within the fields array,

{
        "key": "question_01",
        "label": "Full Name",
        "type": "INPUT_TEXT",
        "value": "John Smith"
}

using this copied

{{1.data.fields[1].value}}

^^ This was simple. Now how do i get the following out from this array:

{
        "key": "question_04",
        "label": "What best describes you?",
        "type": "DROPDOWN",
        "value": [
          "option-id-1"
        ],
        "options": [
          {
            "id": "option-id-1",
            "text": "Customer"
          },
          {
            "id": "option-id-2",
            "text": "Business Owner"
          }
        ]
}

In my set multiple variables module, I have the above variable name as user_type_ids. What is the syntax to extract “text” value from the correct collection in the array given the option-id-1 as the value?

{{1.data.fields[4].options}}

^^ this gives me the array, “options”, I need the “text” from the associated “value” of the this collection assigned to my variable value,

“Customer” → to my variable value b/c
User selected “option-id-1”

All this considering the entire webhook from my Tally response:

{
  "data": {
    "formName": "Redacted Intake Form",
    "submissionId": "xyz123",
    "responseId": "abc789",
    "fields": [
      {
        "key": "question_01",
        "label": "Full Name",
        "type": "INPUT_TEXT",
        "value": "John Smith"
      },
      {
        "key": "question_02",
        "label": "Email",
        "type": "INPUT_EMAIL",
        "value": "john.smith@example.com"
      },
      {
        "key": "question_03",
        "label": "Phone Number",
        "type": "INPUT_PHONE_NUMBER",
        "value": "+15555555555"
      },
      {
        "key": "question_04",
        "label": "What best describes you?",
        "type": "DROPDOWN",
        "value": [
          "option-id-1"
        ],
        "options": [
          {
            "id": "option-id-1",
            "text": "Customer"
          },
          {
            "id": "option-id-2",
            "text": "Business Owner"
          }
        ]
      },
      {
        "key": "question_06",
        "label": "Preferred Contact Method",
        "type": "MULTIPLE_CHOICE",
        "value": [
          "option-id-3"
        ],
        "options": [
          {
            "id": "option-id-3",
            "text": "Email"
          },
          {
            "id": "option-id-4",
            "text": "Phone"
          }
        ]
      },
      {
        "key": "question_07",
        "label": "Upload project photos",
        "type": "FILE_UPLOAD",
        "value": [
          {
            "id": "img001",
            "name": "project_photo1.jpg",
            "url": "https://storage.tally.so/private/project_photo1.jpg?id=img001&accessToken=EXAMPLE123TOKEN&signature=signature123abc"
          },
          {
            "id": "img002",
            "name": "project_photo2.jpg",
            "url": "https://storage.tally.so/private/project_photo2.jpg?id=img002&accessToken=EXAMPLE456TOKEN&signature=signature456def"
          }
        ]
      },
      {
        "key": "question_hidden",
        "label": "hidden_fields",
        "type": "INPUT_TEXT",
        "value": "NPP.v1_xxxxxxxx"
      }
    ]
  }
}

Here, I made it in a blueprint so you can track the logic and adjust it as you need it.

Welcome to the Make community!

You can do that using the map and first functions. This is a rough guide:

{{ first(map(1.data.fields[1].options; "text"; "1.data.fields.1.value"; 1.data.fields.1.value.1)) }}

Screenshot 2025-12-13 153040

Ideally though, you want to avoid “hard-coding” the array index 1 into your fields, as the order may change.