Skip to content
automation recipe

Give every form request a real lifecycle, not just a submission

Create the form, add workflow states like Draft → Review → Released, attach a chat button that opens it in one click, then submit, update, and transition responses until they're done — all scriptable from the terminal.

Ops leadsPeople opsEngineering managers

Forms in Dailybot aren’t “fill once and forget.” Give one a workflow — Draft → Review → Released, or any sequence up to 20 states — and every response carries its own current_state, the moves its submitter is allowed to make next (allowed_transitions), and a full history of who moved it and when.

This page walks through the whole loop: author the form and its questions, wire permissions and a chat shortcut, open it with a single click from a message, then submit, update, and transition responses until the workflow says they’re done. Build it with the CLI, the API, or by asking an agent that has the Dailybot skill pack installed.

Build it step by step

  1. Create the form and seed its first question

    dailybot form create -n "Name" needs at least one question at create time — pass --questions-file with a JSON array of text, multiple_choice, boolean, or numeric questions, or add them one at a time afterward with dailybot form questions add. A form with zero questions is rejected with 400 questions_required.

  2. Wire the workflow states, permissions, and a chat command

    dailybot form config <form_uuid> --state "Draft:#9CA3AF" --state "Review:#F59E0B" --state "Released:#10B981" turns on a workflow; --can-change-states restricted plus --change-states-team names who can move it forward, and --command opens the form from chat as @dailybot <command>.

  3. Open it straight from a chat button

    Attach callback_form to an interactive button — in the send-message API or the CLI's --buttons JSON — and clicking it opens the form for that person, no @dailybot command needed. callback_form takes the form's UUID and is mutually exclusive with the other four callback types.

  4. Fill it in, or continue a draft

    dailybot form responses <form_uuid> --latest finds an in-progress response before starting a new one. Submit fresh with dailybot form submit --content '{...}', or continue with dailybot form update — both accept --automation and --source to mark scripted submissions.

  5. Move the response through its states

    Read allowed_transitions and can_change_state off the response before moving it. dailybot form transition <form_uuid> <response_uuid> <to_state> only accepts moves the caller's audience allows — pass either the state key or its label, the CLI resolves it.

  6. See what shipped, filtered any way you need

    dailybot form responses --source automation --flow-status pending --search "vendor" narrows by submission origin, approval status, and keyword — on top of whatever the form's report channels already posted as responses landed.

See it in action

A simulated form response moving through its workflow states — no form or messages are actually sent.

dailybot APP

New vendor request ready for intake

Click "Open form" above to start the response.

Copy-paste recipes

curl -sS -X POST 'https://api.dailybot.com/v1/send-message/' \
  -H 'X-API-KEY: $DAILYBOT_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"message":"New vendor request ready for intake","target_channels":["C0123456789"],"buttons":[{"label":"Open form","button_type":"interactive","value":"open_vendor_form","callback_form":"$VENDOR_FORM_UUID"}]}'

Ready to transform how your team works?

Join thousands of teams that use Dailybot to save time, boost engagement, and make better decisions.