{"id":87671,"plugin_id":"plugin_asdk_app_6ac768a541148191adc9588132f9f44c","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-11-09T18:08:40.488Z","digest":"1f8ba0bf2d76848054aab7b5a8ae34751a443d4f852aa337b0f90262a31b4d63","against":null,"payload":{"description":"Build, edit and publish Captino forms (multi-question lead forms, qualification forms, surveys, applications, quizzes) from a brief and put them into a funnel as a form step, using the form MCP tools. Use when the user asks to \"create a form\", \"build a lead form\", \"add a survey to my funnel\", \"change the questions on my form\", \"add a question\", \"restyle the form\", \"publish the form\", or wants a form written or changed without opening the form builder.","included_files":[{"relative_path":"agents/openai.yaml","size_in_bytes":477}],"name":"form-builder","skill_md_contents":"---\nname: form-builder\ndescription: Build, edit and publish Captino forms (multi-question lead forms, qualification forms, surveys, applications, quizzes) from a brief and put them into a funnel as a form step, using the form MCP tools. Use when the user asks to \"create a form\", \"build a lead form\", \"add a survey to my funnel\", \"change the questions on my form\", \"add a question\", \"restyle the form\", \"publish the form\", or wants a form written or changed without opening the form builder.\n---\n\n# Form builder\n\nWrites or changes a standalone Captino form as a form configuration (questions,\nintro, completion, labels, style), saves it as a draft, publishes it when the\nuser wants, and shows it in a funnel through a form step. The result is the\nsame as a form made in the form builder, so the user can keep editing it there.\n\nA form shows one question per screen with Back/Next navigation and lives on its\nown funnel step. For a simple name-and-email opt-in inside a landing page, use\nthe `page-builder` skill and its `captino-optin-form` component instead.\n\n## Prerequisites\n\nUses the Captino MCP tools `list_forms`, `get_form`, `create_form`,\n`update_form`, `publish_form`, `list_funnels`, `get_funnel`,\n`list_funnel_steps`, `create_funnel_step`, `set_funnel_step_form` and\n`set_form_step_completion`. Needs **Form: write** access to author forms and\n**Funnel: write** to add them to a funnel, granted when connecting Captino. If\nthe tools are missing or fail with 401/403, run the `captino-setup` skill.\n\n## Workflow\n\n### 1. Understand the brief\n\nBefore writing anything, know: what the form is for (capture leads, qualify\nthem, book a call, collect feedback), the audience, the questions the user\nneeds answered, the language of the form, where respondents go after\nsubmitting, and any brand colors, font or logo. Ask only for what you cannot\ninfer. Keep it short: every extra question lowers completion. Use the user's\nown wording for questions when they gave some. Never invent claims about the\nuser's product.\n\n### 2. Find or create the form\n\n- Editing: `list_forms` with `query` = the name, then `get_form`. Note\n  `hasDraft` and `linkedFunnels`. A form can be used by several funnels, and\n  publishing changes it in all of them; tell the user when `linkedFunnels` has\n  more than the one they mean.\n- New form: `create_form` with a `name` and the full `config`. The config is\n  saved as a draft; nothing is live yet.\n\n### 3. Author the configuration\n\nThe configuration is one JSON object:\n\n```json\n{\n  \"intro\": { \"enabled\": true, \"title\": \"…\", \"description\": \"…\" },\n  \"questions\": [ { \"id\": \"…\", \"question\": \"…\", \"type\": \"…\", \"required\": true, \"options\": [], \"placeholder\": \"\" } ],\n  \"completion\": { \"message\": \"…\", \"redirectUrl\": \"\" },\n  \"labels\": { \"start\": \"Start\", \"back\": \"Back\", \"next\": \"Next\", \"submit\": \"Submit\", \"acceptTerms\": \"I accept the terms and conditions\", \"continue\": \"Continue\" },\n  \"style\": { \"accentColor\": \"#7581F0\", \"accentForegroundColor\": \"#ffffff\", \"foregroundColor\": \"#111827\", \"backgroundColor\": \"#ffffff\", \"font\": \"Inter\", \"corners\": \"Default\", \"brandAssetUrl\": \"\", \"brandAssetSize\": \"Small\" }\n}\n```\n\nQuestion types (exact spelling):\n\n| Type | Use | Notes |\n| :-- | :-- | :-- |\n| `Name` | Respondent's name | Stored as the contact's name |\n| `Email` | Email address | Creates or updates the contact |\n| `Mobile` | Phone number | Creates or updates the contact |\n| `ShortText` / `LongText` | Free text | `placeholder` optional |\n| `SingleChoice` / `MultipleChoice` | Pick one / pick several | `options` is a list of strings |\n| `Scale` | Rating | `scaleMin` and `scaleMax` within 0 to 10, min below max; defaults 0 and 10 |\n\nRules:\n\n- Each question needs an `id` that is unique within the form. Use short,\n  readable slugs (`email`, `company-size`). Per-question statistics are keyed\n  by the id, so never change the id of an existing question.\n- A response only becomes a lead when it has an `Email` or `Mobile` answer.\n  For a lead form, include a required `Email` (or `Mobile`) question and a\n  `Name` question.\n- Put the easy questions first and contact details near the end, unless the\n  user wants the lead captured before the qualifying questions.\n- `options` only apply to choice questions and `placeholder` only to text\n  questions (`Name`, `Email`, `Mobile`, `ShortText`, `LongText`).\n- `intro` is an optional welcome screen with a Start button. Turn it on when\n  the form needs context (\"Takes 2 minutes\"); leave it off for short forms.\n- Write every label in the form's language. The defaults are English.\n  `acceptTerms` is shown next to Submit only when the funnel has GDPR turned\n  on.\n- `style.corners` is one of `Default`, `Sharp`, `Rounded`, `Pill`;\n  `brandAssetSize` one of `Small`, `Medium`, `Large`. `brandAssetUrl` is an\n  absolute image URL the user provided; do not make one up.\n\nCompletion (what happens after submit):\n\n- `message` only: the message is shown after submit.\n- `redirectUrl` only (set `message` to `\"\"`): the respondent goes straight to\n  that URL.\n- Both: the message is shown with a Continue button that opens the URL.\n\nThe form's `completion` applies in every funnel that uses the form. Set a\nredirect here only for a target outside Captino or a form used in one place;\na thank-you page in the funnel belongs on the step (step 5), which points at\nthe step itself instead of a typed-in URL.\n\nMinimal lead form:\n\n```json\n{\n  \"intro\": { \"enabled\": false, \"title\": \"\", \"description\": \"\" },\n  \"questions\": [\n    { \"id\": \"goal\", \"question\": \"What do you want help with?\", \"type\": \"SingleChoice\", \"options\": [\"More leads\", \"Better conversion\", \"Something else\"], \"required\": true },\n    { \"id\": \"name\", \"question\": \"What is your name?\", \"type\": \"Name\", \"required\": true },\n    { \"id\": \"email\", \"question\": \"Where should we send your plan?\", \"type\": \"Email\", \"required\": true }\n  ],\n  \"completion\": { \"message\": \"Thanks! Your plan is on its way.\", \"redirectUrl\": \"\" },\n  \"labels\": { \"start\": \"Start\", \"back\": \"Back\", \"next\": \"Next\", \"submit\": \"Send me the plan\", \"acceptTerms\": \"I accept the terms and conditions\", \"continue\": \"Continue\" },\n  \"style\": { \"accentColor\": \"#7581F0\", \"accentForegroundColor\": \"#ffffff\", \"foregroundColor\": \"#111827\", \"backgroundColor\": \"#ffffff\", \"font\": \"Inter\", \"corners\": \"Rounded\", \"brandAssetUrl\": \"\", \"brandAssetSize\": \"Small\" }\n}\n```\n\n### 4. Save and publish\n\n1. `create_form` (new) or `update_form` (existing) saves the configuration as\n   the draft. The live form does not change.\n2. Publishing makes the draft live and re-renders every funnel step that uses\n   the form, in every funnel. Only do it when the user asked for it or\n   confirms: `publish_form` with the form id.\n\n### 5. Put it in a funnel\n\n1. Find the funnel with `list_funnels`, then `get_funnel` for its steps.\n2. New form step: `create_funnel_step` with the funnel id, a name such as\n   \"Application\" and `formId`. The step is appended with a path derived from\n   the name. If the form is already published, the step goes live at once, so\n   confirm first; otherwise it goes live on the first `publish_form`.\n3. Existing form step (`type: Form`): `set_funnel_step_form` swaps the form it\n   shows. Site steps cannot show a form.\n4. Thank-you page: `set_form_step_completion` with the funnel id, the form\n   step id and `redirectStepId` = the id of a site step in the same funnel. It\n   applies to this step only and wins over the form's own completion. The\n   step's URL is looked up each time the form step's page is rendered (on this\n   call and on every `publish_form`), so it picks up a renamed path or a new\n   domain on the next render. Publish the thank-you page too, or respondents\n   land on a 404.\n   - `message` replaces the form's message for this step; `redirectUrl` (an\n     absolute URL) is for targets outside the funnel. Pass `redirectStepId` or\n     `redirectUrl`, not both.\n   - Empty fields keep the form's value, so a step cannot blank the message.\n     For a redirect without a message, the form's own `completion.message`\n     must be `\"\"`; otherwise the message shows with a Continue button.\n   - Each call replaces the step's previous override; resend `message` to\n     keep it. A call with no fields removes the override.\n   - Form steps in `get_funnel` and `list_funnel_steps` show their current\n     `completionOverride`. Check it before changing the form's completion:\n     an override wins, so the change would not show on that step.\n5. To send visitors to the form, link to the step's path from a page (a\n   `captino-button` with `href` `/{path}`, see `page-builder`), or share the\n   step URL.\n\n### 6. Editing an existing form\n\n1. Start from `draftConfig` when `hasDraft` is true, otherwise from `config`.\n   Tell the user when there are unpublished changes that the edit builds on.\n2. Change only what the user asked for and send the whole configuration back\n   with `update_form`. It replaces the draft: any section you leave out falls\n   back to its defaults.\n3. Keep existing question ids and order unless the user asked to change them.\n4. Publish as in step 4.\n\n### 7. Report\n\nState what was built or changed in a few lines: the form name, the questions\nin order with their types, whether it is a draft or live, the funnel step and\nits URL when it is in a funnel (`visitUrl` plus `/{path}`), where\nrespondents go after submitting, and the other funnels a publish affected. Offer the next step once: publish the draft, add\nit to a funnel, or add a thank-you page.\n\n## Pitfalls\n\n- `update_form` and `create_form` take the whole configuration, not a patch.\n  Always send every section.\n- Question `type`, `corners` and `brandAssetSize` are case-sensitive strings.\n- The default completion `message` is not empty. Set it to `\"\"` explicitly\n  when the form should redirect straight away.\n- Publishing a shared form changes it in every linked funnel. Check\n  `linkedFunnels` first; for a funnel-specific variant, create a new form and\n  `set_funnel_step_form` on that funnel's step.\n- `delete_form` fails while any step uses the form and cannot be undone. Only\n  call it when the user asks, after confirming.\n- Changing the form's `completion` has no visible effect on a step with a\n  `completionOverride`; change the step with `set_form_step_completion`\n  instead.\n- There is no tool for detaching a form from a step; send the user to the\n  Captino app for that.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}