wxrks Sync sends your Webflow site's Collection items, Pages, and Components to wxrks for translation, then writes the finished translations back into Webflow's own locale variants for each language you've enabled.
💡 Who is this for? This guide is for Account Admins who need to connect a Webflow site to wxrks and manage the ongoing translation sync between the two platforms.
Getting Started
You'll find wxrks Sync inside wxrks itself: go to Integrations, filter to Marketing & CMS (or search "Webflow"), and click Open app on the Webflow card — it opens the connector in a new tab, hosted separately from the rest of wxrks.
Getting from install to your first translated page only takes three steps — everything else on the Dashboard is either automatic or optional.
Prerequisites: access you'll need
Running a translation project through the connector is not a fully hands-off operation — the operator needs to be able to see, and when necessary adjust, how the site is built:
Webflow access to the site being translated — at minimum the ability to generate a site API token for the connector, and realistically Designer access, so you can inspect how content was built (page text vs. component vs. CMS vs. embed) and answer "where does this text live?" questions.
Webflow Localization enabled on the site, with the target locales added in Webflow's own Localization settings — the connector can only deliver translations to locales the site actually has.
Language versions created for your existing CMS items — see the section immediately below. This is the one prerequisite people are most often unaware of, and the most common cause of failed deliveries.
A wxrks account with credentials (access key/secret) to connect in the connector's Settings.
If you're an agency operating on a client's site, ask the client for Designer access (or a seat) before scoping — most "content is missing" questions are resolved in minutes by clicking the element in the Designer.
Before you translate: every CMS item needs its language versions
If your site had content before you enabled Localization, there is one preparation step in Webflow that no connector can do for you. It's worth doing in one pass up front — otherwise it surfaces later as failed deliveries, one item at a time.
How Webflow models translated content. An article and its French version are not two separate items. They are one item with two language versions, tied together by the same underlying ID. That shared ID is exactly what makes the language switcher work: a reader on the English article who clicks "FR" lands on that article, rather than on a different one.
Only Webflow's own interface can create that second version. Their API — which is what every connector, including this one, uses — cannot. From Webflow's own documentation: "For any Collection items that already exist, you must add the desired secondary locales in the CMS panel within the Designer. You can't add a new locale to an existing item via the API."
So if an item has never had a version in a given language, we can translate it perfectly and still have nowhere in Webflow to put the result. The delivery fails with "This item has no '…' locale variant in Webflow yet", and the translation sits waiting in wxrks until the version exists.
What to do, per language you're launching:
In Webflow's CMS panel, switch the locale selector to that language and look at the item list. Each language has its own set of items — anything missing from that list still needs its language version created.
Open an item that's missing and use Webflow's Translate all fields button, which machine-translates every field at once (or hover a single field and click the globe icon to do just that one).
The quality of that machine translation doesn't matter — the point is that clicking it creates the language version. Your real translation from wxrks overwrites it on the next delivery.
This is a one-time backlog, not an ongoing chore. It only affects content that predates the language being enabled. Once an item has its language version, it syncs automatically from then on, with no manual step ever again.
Worth checking first: whether the language is enabled on the collection itself. If an entire collection's items are missing their language versions while other collections are fine, that's a collection-level setting to fix once, rather than something to work through item by item.
If you'd rather not prepare up front, nothing breaks — you'll simply see this error on the affected items and can fix them as they appear. See the troubleshooting article for the recovery path.
1. Sign in
Access to the connector starts with an invite link from wxrks. Open it, choose a password, and paste a site API token from Webflow (in Webflow: Site settings → Apps & integrations → API access → Generate API token). That connects the site and creates your account in one go. From then on you sign in with your email and password; use Forgot password? on the sign-in screen if you ever need to reset it.
One connector account is one Webflow site. If your team works on several sites, each has its own environment, and the site switcher at the bottom of the sidebar moves between the ones you have access to. Teammates don't need a Webflow token at all — an account owner invites them from the Teams page.
The connector detects your site's primary language and every secondary locale you've enabled in Webflow's own Localization settings automatically — there's nothing else to configure on the Webflow side.
2. Connect your wxrks account
In the app, go to Settings → wxrks connection → Keys and enter your wxrks access key and secret. These are validated against wxrks the moment you click Save & test connection, so a typo is caught immediately instead of failing on your first real send.
To generate that pair, click your avatar in the top-right corner of wxrks, select Profile, open the Security tab, and click Generate under API Token — copy the API ID and the secret token shown right after, since the secret is only ever displayed once.
Every automation and one-time send under this account uses these credentials — without them, translation features are unavailable. The same tab also has a Default org unit: the wxrks org unit pre-filled whenever you start a send or a schedule. You can still pick a different one in the wizard each time.
3. Register the wxrks delivery webhook
This is the step that actually gets translated content flowing back into Webflow — without it, wxrks has no way to tell this app a translation is ready.
In the app, go to Settings → wxrks connection → Webhooks and copy the webhook URL shown there.
In wxrks, go to Settings → Account Settings → Webhooks and create two webhooks with that same URL — one with the event Work Unit Status Changed, one with Work Unit Translation File Ready. Each wxrks webhook fires on a single event, so both need their own entry.
Save each one in wxrks. The Webhooks tab in the app will show Active once the first real delivery arrives.
wxrks creates each webhook Inactive and tests the URL; it turns Active only if the app answers with an HTTP 2xx status within 3 seconds. If you created the webhook before the app was reachable, turn the Status switch on manually. If a delivery fails because the app is unavailable or busy, wxrks retries it automatically up to 3 times. See Webhooks: event notifications.
Everything else on the Dashboard
Once those 3 steps are done, the app's Dashboard tracks a few more checks — none of them block you from sending content, they're just visibility:
Localization enabled — the target languages available, pulled automatically from Webflow's own Localization settings.
Automatic field adjustment — which fields across your collections get auto-selected as translatable text.
LLM connectors (optional) — API keys for AI providers. Needed only for the features that use them: transliterating slugs into scripts the built-in table can't handle (Korean, Japanese, Chinese, Arabic, Hebrew), and image translation.
Timezone & work unit naming (optional) — controls how dates/times are displayed and how wxrks names each resource it creates.
The Dashboard's setup checklist collapses itself automatically once everything required is done, and shows an all-time summary (words translated, runs sent, active languages, active automations) front and center instead.
Connecting Your Accounts
Settings is split into tabs down the left. This section covers the ones that establish who you're syncing as and who can use the app: General, wxrks connection, LLM connectors, and the Teams page.
General
Source locale is read-only — auto-detected from your connected Webflow site's primary locale. Target locales are chosen per-send instead, in the Send to wxrks wizard.
Timezone controls how every date/time in the app is displayed — an automation's send schedule, and every timestamp on the Runs page — so everyone on the team sees the same wall-clock time regardless of their own browser's zone. A schedule set to "every Monday at 02:00" runs at 02:00 in this timezone, so set it before creating schedules.
Work unit naming sets the name pattern wxrks uses for each resource it creates — separate patterns for CMS items, Pages, and Components, each with its own placeholder (
{collection},{entry},{page},{component}) so names stay unique per project.Auto-approve wxrks projects skips manual approval in wxrks so translation starts immediately after a project is created.
Multi-collection sends controls what happens when a one-time send spans more than one collection, page, or component: combine everything into a single wxrks project (the default), or create a separate project per group, each auto-suffixed "(1 of N)".
LLM connectors
Optional API keys for AI providers — Anthropic, OpenAI, Gemini, and OpenRouter. Each key is validated against its provider before it's saved. Three tabs:
Providers — connect or remove a key per provider.
Features — choose which provider (and model) powers each AI-assisted feature: slug transliteration for non-Latin scripts, and the two halves of image translation (reading text out of an image, and drawing the translated image). Translation itself always happens in wxrks, never here.
Costs — what those features have spent this month, per provider.
Nothing here is required for ordinary text translation. Latin, Cyrillic, and Greek slugs are transliterated locally without any key.
Teams
Everyone who can open this account, and what they've done in it:
Members — each person with their role (Owner or Member) and access level. Full access can send, schedule, redeliver, and change settings; Read-only can browse everything but every action button is disabled for them — useful for a reviewer or a client who wants visibility without the ability to trigger sends.
Invites (owners only) — generate a link for a new teammate. They open it, choose a password, and land in this same account; no Webflow token is needed.
Activity Log — who sent, scheduled, redelivered, restored, or changed a setting, and when. When a delivery on the Runs page says "by …", this is where the full history lives.
Content & Field Rules
Three settings tabs decide exactly what gets translated, and how translated URLs are built: Slug handling, Field exclusions, and Component properties.
Slug handling
Every translated CMS item, page, or component keeps its own slug in each target locale. This setting controls what that translated slug looks like:
Mode | What happens |
Keep the source slug | The translated item reuses the exact same slug as the source language. |
Translate | The slug is translated into the target language's words, then slugified. |
Transliterate | The item's translated name is romanized into Latin script for the slug rather than translated word-for-word — built in for Cyrillic and Greek, with an LLM connector as a fallback for scripts it doesn't cover (Arabic, Hebrew, CJK, etc.). |
Webflow requires slugs to be dashes (not underscores), lowercase, and URL-safe — this app enforces that automatically no matter which mode is selected.
A new slug is applied automatically the moment translation completes — there's no manual review or approval step to hold it for.
Field exclusions
By default, this app auto-selects every text-type field across every collection as translatable. Expand any collection in Settings → Field exclusions to turn off specific fields that shouldn't be sent for translation — typical candidates are internal notes, IDs, or any field already handled by Slug handling above.
Field exclusions only covers CMS collection fields — static pages don't have fields, so they won't ever appear in this list, and that's by design rather than a bug. Component content has its own tab, described next.
Excluding a field or component property that holds a non-language value (an option list, a CSS class, an internal code) also prevents a common class of delivery error further down the line — see wxrks - Webflow Connector: Troubleshooting.
Component properties
The equivalent of Field exclusions for Components. Webflow's component properties are typed as plain text whether they hold a real headline or a configuration value like 48px or a CSS class, so the connector can't tell them apart on its own. Two controls:
Auto-exclude keywords — any property whose label contains one of these words is skipped automatically. The default list is width, class, style; add your own (color, icon, url…) to cover a site's naming conventions in one line.
Per-component toggles — expand a component to turn individual properties on or off by hand.
Translating Content
This is where a send starts — either everything on your site, or a chosen subset — walked through a short wizard before anything actually goes to wxrks. There are two ways to send: once, now, or on a schedule, and they have their own buttons.
What does the connector scan?
The connector reads three kinds of content from your Webflow site, and each kind is translated through its own section of the Translate page:
CMS Collections — every entry of every collection (blog posts, case studies, products…). All text fields are scanned, minus non-text fields and any fields you exclude in Settings → Field exclusions. This is the most fully automated content type: CMS content is structured data, so the connector can read all of it reliably.
Static pages — landing pages, about pages, and any other Designer-built page. The connector scans the page's own text elements (headings, paragraphs, buttons, links' visible text) plus any component property overrides placed on that page.
Components — reusable building blocks (navbars, footers, cards, menus…), previously called "Symbols." A designer creates one once and places it on many pages; when its definition is edited, every page using it updates automatically. Translation follows the same logic: the connector translates the component's definition once, and Webflow applies that translation everywhere the component is used — which also means component text never appears inside a page's own content. If you're not sure whether an element is a component, open the page in the Webflow Designer and click it: components show a clear green outline (or a CMS-binding indicator if the content actually comes from a collection).
Not scanned today: HTML embeds / custom code blocks, image alt text, link URLs, and the SEO title / meta description set directly on a static page. If a piece of text lives in one of those, it won't arrive in wxrks — click the element in the Designer to confirm where it actually lives before assuming it's missing. Text that is part of an image is a special case: it isn't part of the text scan, but it can be translated through Image translation below.
SEO metadata is worth a special mention. On a CMS-driven page — a collection template page for an article, product, or case study — the SEO title and meta description are usually bound to fields on the collection. Those are ordinary text fields, so they are translated along with the rest of the entry, and Webflow serves the localized value in each language. SEO metadata is only out of scope when it is typed directly into a static page's settings instead of pulled from the CMS. If localized SEO matters for a section of the site, binding those fields to the collection is worth doing before translation starts.
Translating navigation menus, headers, and footers
In nearly every Webflow site, the navigation bar (including its dropdown menus) and the footer are Components. Their text is not part of any individual page — so sending a page, even the page where the menu "lives," will not carry the menu's items.
What to do: in Translate's content browser, open the Components group and select the navbar / menu / dropdown / footer components, then send them like any other content. The translation is applied to the component definition, so it takes effect on every page at once.
Two nuances worth knowing:
If a specific placement of a component has overridden text (e.g. the same card component with a different title on one page), that override travels with the page that contains it, not the component — translate the page too.
If menu entries are generated from a CMS collection (common for large "mega menus"), translate that collection in the Collections section, not through Components.
Choosing what to send
All content — every Collection item, Page, and Component on the site.
Select specific content — pick collections, page folders, or Components from the list on the left, then narrow further inside each one with per-collection filters (including by linked fields like Author or Tags).
Item and word counts load progressively per collection — on a large site this can take a moment, shown as "N of M collections done" while it works in the background. Select all at the top of the list ticks the whole site at once.
The Show filter: Everything, Translated before, Never sent
Above the content list, next to the search, the Show filter narrows the whole site by translation history:
Everything — no filter.
Translated before — only content this connector has already delivered a translation for, in any language.
Never sent — only content that has never been sent.
Picking one ticks every matching collection, page folder, and component for you, across the whole site, so there's nothing to go through one by one. The line beneath it shows how many items matched. This filter works in both modes — with All content it reads "All content, translated before" — and, unlike the search, it is saved as part of a recurring pull, so a schedule keeps applying it on every run.
Typical use: a site where only some pages have been translated so far, and you want a weekly schedule that keeps exactly those pages up to date without re-selecting them — choose All content, then Translated before, then Recurring pull.
Updated after, and Find changes
In the left list, Updated after takes a date and hides everything whose last update is older. "Last update" is an item's last publish (or last edit, if it was never published) and a page's last change in the Designer; components carry no date in Webflow, so they're hidden while a date is set.
Find changes next to it asks Webflow directly what changed since that date, across every collection and page, without opening each one — and offers to select all of it. Use it to answer "what's new since the last send?" on a big site. This date is for one-time sends only: a schedule doesn't need it, because it always picks up what changed since its own last run.
Inside a collection: status and history
Open a collection, page folder, or the Components list and each item shows two pills — its Webflow publish state, and its sync status, which says whether the translation is actually up to date right now:
Status | What it means |
Never sent | Never sent for translation yet. |
Synced | Every target language is up to date with the current source content. |
Needs sync | It was translated before, but the source has been edited or republished since. |
Failed | The last delivery attempt for at least one language errored out. |
AI translated / Reviewed | Who produced the translation that is live now: machine only, or a human step in the wxrks workflow. See AI translation disclosure. |
The quick tabs above the list (All, Needs sync, Failed, AI translated, Never sent) filter on these, and + Add filter narrows by any field of the collection. The Last update column has a ⓘ explaining exactly which date it shows. Every row also has a History: a timeline of each send and delivery, automatic or manual, and by whom.
One-time send vs. Recurring pull
The bottom bar always shows the current selection (items, words, languages) and two buttons:
One-time send — creates one wxrks project now, with exactly what is selected.
Recurring pull — saves the selection as a rule and checks it on a schedule (hourly, daily, or weekly), sending whatever is new or changed each time. By default it covers future matching content only; the wizard has a checkbox to include what already exists on the first run.
A recurring pull needs a rule it can re-check on its own — whole collections, page folders, or Components, optionally narrowed by the Show filter or per-collection filters. The bar says Rule-based — can run on a schedule when that's true. A hand-picked list of individual items can be sent once, but not scheduled, because there's no rule behind it to re-evaluate next week.
Two things worth knowing before choosing All content vs. Select specific content for a schedule: with All content, a collection or page folder created later joins the rule automatically; with a specific selection, the saved list is fixed at the moment you create it. And a schedule re-lists the site every run, so items added to a covered collection are always seen — it's only new collections that differ between the two.
The Send to wxrks wizard
Settings
Target languages are pulled from Webflow's own Localization settings and all pre-selected — including locales you haven't published yet, marked with a dot: safe to translate ahead of time, they just won't be publicly visible until enabled in Webflow. The workflow starts at Translation, with optional review steps you can add; the wizard tells you if the steps differ from what the chosen org unit normally runs. Under Advanced: the wxrks org unit and the project name. If image translation is on and the selection contains images, an extra checkbox offers to translate those images too.
Schedule (recurring pull only)
How often to check — hourly, daily, or weekly — and at what time (in the account's timezone). Include existing content on the first run sends everything that matches right away instead of only what changes from now on. Leave it off for content that has already been translated, or the first run will re-send all of it.
Review
A last look at content scope (including any Show filter), run type, and translation settings — nothing is sent until this step's button is clicked. A one-time send goes straight from Settings to Review.
If a workflow has more than one step, Webflow is only updated once the last step delivers — an intermediate step finishing never partially overwrites your site.
AI translation disclosure
Under the EU AI Act's transparency rules, AI-generated text needs a disclosure unless a person reviewed it. This feature automates the "which pages need it" half: it flags translated content that never went through a human step in your wxrks workflow, so your site can show a "machine translated" notice — and clears the flag once a human step has run. Everything is written to the target language only; source content is never touched. Off by default; nothing is written to Webflow until you switch it on in Settings → AI disclosure.
Setting it up:
Automatic-translation org unit. Workflow step names are shared across a whole wxrks account, so a step alone can't tell machine translation at one org unit from human translation at another. Pick the org unit where translation runs automatically; content delivered from any other org unit counts as human-translated.
What counts as human review. Tick the wxrks steps that mean a person actually reviewed the content. "Translation" is left unticked by default: it includes AI pre-translation, so on its own it doesn't prove a human read the result.
A Switch field per collection. Add a Switch field to each collection you want flagged and name it the same everywhere (the default is ai-translated). A collection without the field still delivers normally; the run just shows a warning. Any collection can be skipped.
Where the disclaimer text lives. Recommended: in Webflow — you build the notice yourself (a text element on the template page with conditional visibility bound to the switch), and the connector only flips the switch. Alternative: written by the connector into a plain-text field on each item, in per-language wording you provide. Write those sentences with your own linguists rather than machine-translating them.
Static pages have no CMS fields, so to show a notice on a page you mark the element in the Designer with a custom attribute the settings page gives you; the connector fills it per language and hides it once the content has been reviewed.
Content translated before you set this up is still unflagged. Preview backfill checks your whole delivery history against the saved settings and shows what would change, item by item; nothing is written until you apply, and anything that can't be classified is listed rather than guessed.
The Report page
Report in the sidebar shows everything this connector has delivered, split into AI translated, Human-reviewed, and Untracked (delivered before disclosure was configured), with article and word totals, the share of words per bucket, and a searchable table you can filter by collection. Until AI disclosure is configured, everything shows as Untracked.
Image translation
Text baked into an image — a banner, an infographic, a screenshot with labels — isn't part of the text scan. Image translation handles it: the text is read out of the image, translated on wxrks like any other content (your TM, glossary, and workflows apply), and a new image is drawn with the translation. A person approves it before anything is applied to Webflow.
It's off by default, and while off nothing about it appears in the app. To use it: connect an OpenAI key under Settings → LLM connectors (it reads the text and draws the new image; expect cents per image), then switch it on under Settings → Image translation. The same tab takes a list of protected brand terms that must never be translated inside images.
How a send works:
On the Translate page, open a collection and an item. Each image field shows its per-language status. Send from there — or, in the wizard, tick Also translate the images in the selected articles to send them with the text.
Each image becomes its own Image Sync run in wxrks, to the same languages.
When the translation comes back, the redrawn image waits as a Draft on the Images page, which appears in the sidebar once the feature is on. Its tabs — Drafts, Approved, Applied, In translation — gather every image across every collection so a reviewer doesn't have to re-find the article it came from. Compare, approve, or regenerate.
Apply writes the approved image into that language in Webflow. That is the only moment Webflow is touched.
Runs & Automations
Everything that's scheduled, queued, or already happened lives on the Runs page, in four tabs: History, Recurring Automation, Pending Queue, and Didn't arrive?
History
Every past run, one-time or automation-triggered, with delivery status per document and language and any errors along the way. Filter by All, Synced, or Issues; the search matches run and document names, and you can also paste a wxrks project link into it to jump straight to that run. Expand a run to see each document with its status, an Open in Designer link, and the actions:
Diagnose — one sentence on whether this run's translations reached Webflow, and a button to push what's missing. Same check as the Didn't arrive? tab, for one run.
Force push to Webflow — sends a document's translation to Webflow regardless of what's there. It overwrites whatever is live in that language, so check the document's History first if a teammate may have delivered since.
Redeliver — on an errored row, after fixing the cause. It warns before overwriting a newer delivery.
Interrupt run — stops a mistaken run's translations from ever being applied.
Restore original text (CMS) — the undo for a delivery that shouldn't have happened: copies the source language back into a chosen language for this run's CMS items, after you type the language code to confirm. Pages and components can't be restored this way.
If a row shows an Error status, see wxrks - Webflow Connector: Troubleshooting for causes and fixes.
Recurring Automation
Every schedule created with Recurring pull is listed here with what it covers (including any Show filter), its cadence, and controls to pause, resume, or archive it. Archived automations are hidden by default — a Show archived link appears whenever any exist. A pill at the bottom shows whether the Webflow CMS webhook is healthy.
Pending Queue
New and edited Webflow content appears here in real time, as Webflow's CMS webhook delivers item-changed events — then runs under whichever automation matches it, on that automation's own schedule. Pages and components have no such webhook in Webflow, so a schedule that covers them checks their content itself each time it runs.
Didn't arrive?
For the question everyone eventually asks: "wxrks says it's done, so why isn't it on the site?" Paste the wxrks project link and click Check. You get one sentence about that content — delivered, still translating, or finished but not pushed — and, when something is missing, a Push to Webflow button that sends only what never arrived. Nothing already live in Webflow is touched. Choose one by one lets you push a single document instead, and Details for support unfolds the full check if you need to escalate.
Multiple deliveries, overwrites, and history
A CMS entry, static page, or component isn't tied to one translation forever. Every time it's sent to wxrks — by you, a teammate, or an automation — a new run is created, and once that run's translation finishes it is delivered into the same place in Webflow. Webflow keeps only one version of a locale's content, so the newest delivery always wins: a later run overwrites whatever an earlier one delivered.
Reading a document's history
On the Translate page, open a document's History to see a timeline of every send and delivery — automatic or manual, and by whom. When a delivery replaced a different run's translation, the row shows an Overridden note. On the Runs page, history is ordered by latest activity, and a run whose document was just re-delivered shows a "Redelivered … by …" note.
Restoring a specific version
Nothing needs to be translated again. Find the run that has the correct translation via the document's History, open that run on the Runs page, and click Redeliver on that document's row and language.
A few habits avoid overwrite surprises:
Check History first. Before re-sending something a teammate may have already translated or reviewed, check its History on the Translate page.
Use a test page. Prefer a test page over content a client is actively reviewing — every delivery is an overwrite.
Interrupt mistakes early. Use Interrupt on a run's card on the Runs page to stop a mistaken run's translations from ever being applied to Webflow.
Undo with Restore original text. If a delivery put the wrong language into a locale — typically source text sent by an org unit that delivers automatically — the run's Restore original text button puts the source back so the locale reads correctly until a proper translation lands.
Troubleshooting
Seeing a delivery error on the Runs page, a translation that finished in wxrks but never appeared in Webflow, a static page or component showing "0 words," a brand-new page missing from the connector, or text that didn't arrive after a send? All of that is covered symptom-by-symptom in the companion article wxrks - Webflow Connector: Troubleshooting.

























