# Pattern For Handling Chat App Cards With Multiple Input Components

**URL:** <https://devforum.zoom.us/t/pattern-for-handling-chat-app-cards-with-multiple-input-components/135439>\
**Category:** Team Chat Apps\
**Created:** [July 19, 2025, 1:04pm UTC](https://devforum.zoom.us/t/pattern-for-handling-chat-app-cards-with-multiple-input-components/135439 "2025-07-19T13:04:18Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Luke7](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/luke7/32/70316_2.png) [@Luke7](https://devforum.zoom.us/u/Luke7)\
**Post date:** [July 19, 2025, 1:04pm UTC](https://devforum.zoom.us/t/pattern-for-handling-chat-app-cards-with-multiple-input-components/135439/1 "2025-07-19T13:04:18Z")

</div>

I have created a Chat Bot that, upon some event, sends a message to the user that renders a Zoom Chat App Card (see [Sign In | Zoom](https://zoom.us/account/chatAppcardBuilderKit))

But the way this works seems EXTREMELY limited. Is it really true that a post message is sent for EVERY interaction and that there is no way to develop a simple form-submit design pattern?

This is CRAZY to me. All I want to do is have the user fill in a few fields, click a submit button and have my chatbot endpoint URL receive all the submitted data. This seems impossible without some elaborate caching technique on the backend.

Slack has a proper architecture for this and it seems like Zoom is misrepresenting how functional their alternative is here. The examples lead you to believe it is straightforward to build a submit form when it really, really isn’t.

Not to mention there is no documentation on how to handle multi-part forms.

Please, Zoom, provide some guidance here.

---

<div class="post-metadata">

**Author:** ![elisa.zoom](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/elisa.zoom/32/47836_2.png) [@elisa.zoom](https://devforum.zoom.us/u/elisa.zoom)\
**Post date:** [July 21, 2025, 3:49pm UTC](https://devforum.zoom.us/t/pattern-for-handling-chat-app-cards-with-multiple-input-components/135439/2 "2025-07-21T15:49:18Z")

</div>

Hi @Luke7  
Thanks for reaching out to us and welcome to the Zoom Developer Forum, I am happy to help here!  
Have you looked into the Customize chatbot messages section in our docs here:

> **[Customize chatbot messages](https://developers.zoom.us/docs/team-chat/customizing-messages/)**
>
> The Zoom Developer Platform is an open platform that allows third-party developers to build applications and integrations upon Zoom’s video-first unified communications platform.

Please let me know if this helps

---

<div class="post-metadata">

**Author:** ![Luke7](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/luke7/32/70316_2.png) [@Luke7](https://devforum.zoom.us/u/Luke7)\
**Post date:** [July 22, 2025, 2:53pm UTC](https://devforum.zoom.us/t/pattern-for-handling-chat-app-cards-with-multiple-input-components/135439/3 "2025-07-22T14:53:47Z")

</div>

Yes. This is similar to the link I posted in my message. The only way I can achieve true multi-form behaviour is to open a modal dialog but … those don’t seem to work on ios as far as I can tell.

So, I have multiple issues with Zoom here and documentation is limited.

---

<div class="post-metadata">

**Author:** ![donte.zoom](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/donte.zoom/32/24412_2.png) [@donte.zoom](https://devforum.zoom.us/u/donte.zoom)\
**Post date:** [May 14, 2026, 2:33pm UTC](https://devforum.zoom.us/t/pattern-for-handling-chat-app-cards-with-multiple-input-components/135439/5 "2026-05-14T14:33:09Z")

</div>

> [@Luke7](#):
>
> But the way this works seems EXTREMELY limited. Is it really true that a post message is sent for EVERY interaction and that there is no way to develop a simple form-submit design pattern?
> 
> This is CRAZY to me. All I want to do is have the user fill in a few fields, click a submit button and have my chatbot endpoint URL receive all the submitted data. This seems impossible without some elaborate caching technique on the backend.

@Luke7 , Thank you for posting in the Zoom Developer Forum. It is to develop a simple form-submit design pattern. You want to leverage the **Simple Form found** in the template section.

 ![image](https://us1.discourse-cdn.com/flex016/uploads/zoomdeveloper/original/3X/0/c/0c8e84add2520e8a760546f3602b5aeee46e0204.jpeg)

 ![image](https://us1.discourse-cdn.com/flex016/uploads/zoomdeveloper/original/3X/9/7/97f2d3917c50f9ba96862954139c889d5262da19.jpeg)

Here is example of what the JSON looks like for the Card form structure. Also, it a card form is a standard bot message with two additions:

1. `settings.form: true` — marks the entire card as a form

2. `submit: true` on the action button — designates that button as the form’s submit trigger

**Example JSON:**

```json
{
  "content": {
    "settings": {
      "form": true
    },
    "head": {
      "text": "Entertainment",
      "style": {
        "bold": true
      }
    },
    "body": [
      {
        "type": "section",
        "sections": [
          {
            "type": "message",
            "text": "Sign up entertainment club",
            "style": {
              "bold": true
            }
          },
          {
            "type": "plain_text_input",
            "action_id": "action_id_001",
            "text": "First name:",
            "value": "",
            "placeholder": "Input first name"
          },
          {
            "type": "plain_text_input",
            "action_id": "action_id_002",
            "text": "Last name:",
            "value": "",
            "placeholder": "Input last name"
          },
          {
            "type": "message",
            "text": "Sex:"
          },
          {
            "type": "radio_buttons",
            "options": [
              {
                "value": "male",
                "text": "Male"
              },
              {
                "value": "female",
                "text": "Female"
              }
            ],
            "action_id": "action_id_003"
          },
          {
            "type": "select",
            "text": "Entertainment Club:",
            "select_items": [
              {
                "text": "basketball",
                "value": "basketball"
              },
              {
                "text": "tennis",
                "value": "tennis"
              },
              {
                "text": "badminton",
                "value": "badminton"
              }
            ]
          },
          {
            "type": "actions",
            "items": [
              {
                "value": "submit",
                "text": "Submit",
                "style": "Primary",
                "submit": true
              }
            ]
          }
        ]
      }
    ]
  }
}

```

**## Webhook event: `chat_message.submit`**

Fired when a user clicks a `submit: true` button on a card form. All input field values are delivered in `payload.object.submit_items`.

**Event payload structure:**

```json
{

"event": "chat_message.submit",

"payload": {

"account_id": "your_account_id",

"object": {

"bot_msg_id": "20260514...",

"parent_msg_id": "uuid",

"reply_main_message_id": "uuid",

"robot_jid": "your_bot_jid",

"submit_form_id": "",

"submit_items": [

        {

"actionItem": {

"text": "Submit",

"value": "my_submit_action",

"action": "command",

"action_id": "my_submit_action"

          }

        },

        {

"plain_text_input": {

"text": "What was done?",

"value": "Helped review a critical blog post before publication.",

"action_id": "what_was_done"

          }

        },

        {

"plain_text_input": {

"text": "Why it mattered",

"value": "The blog needed to be published same day.",

"action_id": "why_it_mattered"

          }

        },

        {

"plain_text_input": {

"text": "Who it helped",

"value": "The entire marketing organization.",

"action_id": "who_it_helped"

          }

        }

      ],

"to_jid": "recipient_jid",

"user_jid": "submitting_user_jid",

"trigger_id": "...",

"timestamp": 1778709054515

    },

"operator_id": "...",

"operator_status": "authorized"

  }

}

```
