# Connect Webflow > Map a CMS collection to a knowledge base, and keep it in step as items change. Source: https://welcomeai.dev/docs/webflow-sync Category: Integrations Updated: 2026-09-11 --- ## What it does Maps one Webflow CMS collection to a knowledge base. Every published item in the collection becomes a document, and Webflow tells us when an item is published, changed or deleted. ## What it can access The collections in the site you choose, and the published items in them. Read only -- nothing is ever written back to Webflow, and no other site in your Webflow account is touched. It does not read your Designer, your page structure, your assets, your form submissions, your site users or your Ecommerce orders. ## What it needs before you start - A Webflow account with a **CMS-enabled site** and at least one collection. - Permission on that Webflow workspace to authorise an app. - A WelcomeAI workspace on **Pro** or above. - Content that is actually published. Draft items are not visible to us. ## Authentication A **site API token** that you create in Webflow and paste here once. In Webflow: **Site settings → Apps & integrations → API access → Generate API token**. Webflow shows the token once, so copy it before you close the dialog. Tick these permissions when you create it: | Permission | Why | |---|---| | `sites:read` | To list your sites so you can pick one. Without it the very first screen fails. | | `cms:read` | To read the collections, their fields, and the published items. | | `sites:write` | Optional. Lets us register the webhooks for you instead of you adding four of them by hand. | A token missing one of these is still a valid token, so Webflow answers 403 rather than 401 and we tell you which permission is missing by name. Create a new token with it ticked and reconnect. The token is encrypted before it is stored and is never sent back to a browser. Deleting it in Webflow revokes our access immediately. ## Setting it up 1. Integrations → Connect a platform → **Webflow**. 2. Paste the site API token. (The **App client secret** field below it is optional: fill it in only if you want us to verify the signature Webflow puts on its webhooks.) 3. Choose the **site**, then the **collection**, then the **knowledge base** it feeds. 4. Map the fields: which one is the title, which one is the body, which one is the URL. The defaults are usually right and you can change them. 5. Save. The first sync runs immediately, and the webhooks are registered at the same time. ## How syncing works Webhooks, not polling. Webflow calls us when an item is created, changed, deleted or unpublished, so a change appears within seconds of you publishing it in Webflow. **We register those four webhooks for you** when the source is created, and remove them again when you delete the source. Nothing to paste. If your token does not have `sites:write`, the screen says so and shows the URL to add by hand instead: Webflow → Site settings → Apps & integrations → Webhooks → Add webhook, once per event, with that URL as the destination. A webhook we register fires for every collection on the site, because Webflow has no way to filter one. Items from a collection you did not map are ignored on arrival. A scheduled sweep also runs daily, to catch anything a missed webhook would otherwise have lost. That is the safety net rather than the mechanism. ## Turning your Webflow forms into leads The forms already on your Webflow site can become leads here, next to the ones the widget collects -- the same list, the same CRM routes, the same outgoing webhooks, the same export. Integrations -> the Webflow connection -> **Capture form submissions**. We register a `form_submission` webhook on every site your token can see, and the URL carries a secret of its own: nothing in it names your workspace, so nobody who does not have it can post into your leads. What arrives: - **The email, the phone and the name** are picked out of your form's own fields, in English or Spanish, by what you called them -- `Email`, `Correo electrónico`, `Teléfono`, `Nombre`, `First Name`. If none of the field names look like an address, the answer that *is* one is used. - **Everything else is kept as it is**, under the name you gave the field, so it can be mapped onto a CRM property later. - **The same person is one lead.** A visitor who filled in your Webflow form last month and your chat widget today is one record, marked Returning. Two things it deliberately does not do: - **A submission with no email and no phone does not become a lead.** A newsletter checkbox is not somebody you can reply to, and every CRM refuses a contact with no way to reach them. - **No campaign attribution.** Webflow reports the submission from its own servers, so the browser that filled the form never reaches us and there are no UTM parameters to record. A lead from the widget has them; one from a Webflow form does not. **Stop capturing form submissions** removes the webhooks and revokes the URL in the same act. ## What is imported For each published item: the field you mapped as the title, the field you mapped as the body (rich text is converted to Markdown, keeping headings and lists), and the item's live URL for citations. Any other field you map is stored as metadata alongside the document. Items in draft, and items in a collection you did not map, are not imported. ## How updates are handled Documents are keyed on the Webflow item id. Editing an item updates the same document. Unpublishing or deleting one removes the document, its chunks and its embeddings. Renaming a collection or changing a field's name does not break the mapping -- it is stored by id. Deleting a mapped field does: the source will report that it can no longer find the body, and you re-map it. ## What people use it for A marketing site whose help content lives in a CMS collection. A product catalogue that visitors ask questions about. A changelog or blog that customers ask "when did you change X" about. ## How to check it is working 1. Connected sources shows the source as **Connected** with a last-sync time. 2. Sync log lists each run: how many items it found, created, updated and skipped. 3. Publish a small edit in Webflow and watch the document's updated time change. 4. Ask the Playground something only that collection answers. ## Common errors **"Credential expired"** -- the token was deleted in Webflow, or the site was moved to another workspace. Create a new token and reconnect. Retrying will not help. **"Webflow accepted the token but it does not have the sites:read permission"** -- the token is current and belongs to the right account; it was created without that box ticked. Webflow cannot add a permission to an existing token, so create a new one and reconnect. **"Action required: not found"** -- the collection was deleted or renamed to something we can no longer resolve. Re-map it. **Nothing syncs after a publish** -- Webflow's webhook may have been removed. Use **Test connection** on the source: it re-checks the credential right now and tells you whether the problem is the token or the webhook. **Items appear empty** -- the field mapped as the body is empty on those items, or it is a field type with no text in it (an image, a reference). Check one item in Webflow. ## Reconnecting Integrations → the connection → **Reconnect**, and paste a new site API token. Existing sources keep their mapping and nothing is re-imported. ## Disconnecting Removing the connection stops the syncing. Deleting the source asks whether to keep its documents: "connection only" leaves them in place and answering, which is usually what you want if the content is still accurate. Deleting the token inside Webflow has the same effect from the other end, and the source will show as Credential expired. Deleting a source also removes the webhooks we registered for it, so Webflow stops posting to an address that no longer answers.