Auto-Converting XD Prototypes to Figma — Pro Scope and Honest Limits from the Figma API
“When you move XD prototype interactions over to Figma, do you have to rewire them all by hand?” “Do tap, hover, and Smart Animate just keep working?” “Does Component States switching also reproduce automatically?” — When migrating from XD to Figma, how much of the prototype carries over has a direct impact on rework cost.
XD has a capable prototype system built around Trigger / Action / Destination / Animation, letting you design screen transitions, overlays, Smart Animate, and Component States switching without code. Moving this to Figma, whether you’re rebuilding it by hand or auto-converting it shapes the entire migration estimate.
This article walks through, based on Pixel Fine Converter’s actual prototype conversion behavior, the detailed mapping from XD prototypes to Figma interactions. We cover the Pro-feature auto-conversion scope, Component States → variants, and the limits where Figma’s API can’t reproduce certain behaviors — the technical details migration practitioners need.
Related reading
For the end-to-end XD → Figma migration process, see Adobe XD to Figma migration — a practical guide. For artboard-level mapping, see Mapping XD Artboards to Figma Frames. For the Free / Pro boundary overview, see Free XD to Figma Conversion — When Paid Plugins Are Worth It. This article focuses specifically on prototype-level auto-conversion.
📝 Introduction — How XD prototypes carry over to Figma
When you convert an XD prototype to Figma, three realistic scenarios are on the table.
- Rewire everything by hand — Rebuild every connection one at a time in Figma. Reliable, but the work explodes as screens multiply.
- Partial auto-conversion + manual touch-up — Shapes and components convert automatically, only prototype connections stay manual. Many conversion tools sit here.
- Prototype-included full auto-conversion — Triggers, actions, animations, state transitions all reproduced in one pass. Pixel Fine Converter’s Pro feature falls into this category.
This article is about scenario 3. We’re going to organize, at the implementation level, how much of XD’s prototype features auto-reproduce in Figma and where the code logic + Figma API spec stop being able to reproduce the original.
The discussion points are:
- How Triggers (tap / hover / drag) map across
- The auto-conversion scope for Actions (screen transition / overlay / back / Smart Animate / scroll)
- Animations (dissolve / slide / push / smart-animate) and easing correspondence
- Whether Component States switching becomes Figma variant state-transition
- Where Figma API limitations prevent faithful reproduction
We’ll walk through each in order.
🎯 The building blocks of XD prototypes
First, the four elements that make up an XD prototype, alongside their Figma equivalents.
| Element | XD | Figma | Role |
|---|---|---|---|
| Trigger | tap / hover / drag | ON_CLICK / ON_HOVER / ON_DRAG | User input type |
| Action | navigate / overlay / back / Smart Animate / scroll | NAVIGATE / OVERLAY / BACK / SCROLL_TO | Transition type |
| Destination | Target artboard ID | destinationId (Frame ID) | Destination reference |
| Animation | dissolve / slide / push / auto-animate | DISSOLVE / SLIDE_IN / PUSH / SMART_ANIMATE | Transition animation |
XD and Figma share a similar prototype design philosophy, and the four elements map roughly 1:1. That said, easing types, push direction, drag distance, overlay anchor position — the fine-grained behaviors differ subtly. We’ll dig into the details in the next sections.
🔧 Pixel Fine Converter’s prototype conversion behavior
Pixel Fine Converter reads the interactions.json (prototype connection data) inside the XD file and calls Figma’s setReactionsAsync API to restore connections.
Processing flow
Pixel Fine Converter restores prototype connections in this order:
- Map node IDs — Match each XD node to its corresponding Figma node during conversion
- Map state transitions — Associate symbol definitions and each state with Figma variant names (
State=xxx) - Collect instances — Per symbol, gather all converted instances
- Apply interactions — For each connection, resolve trigger / action / destination and set it as a Figma reaction (
setReactionsAsync)
The critical point here is: if XD node IDs can’t be resolved to corresponding Figma nodes accurately, connections can’t be restored. Nodes removed during component conversion or destinations that fail to resolve cause the connection to be counted as unconvertible and skipped.
Auto-conversion targets
Pixel Fine Converter auto-converts the following actions from XD’s interactions.json:
- artboard-transition — Screen transition to another artboard
- overlay-transition — Overlay display
- previous-artboard — Back to the previous artboard
- auto-animate — Smart Animate (interpolated changes)
- scroll-transition — Scroll to a position within the same artboard
- state-transition — Component States switching (variant
CHANGE_TO)
This covers nearly everything you can set in XD’s prototype mode.
What it means to call setReactionsAsync directly
Pixel Fine Converter’s prototype conversion calls Figma’s official API (setReactionsAsync) directly to restore connections. This isn’t “a workaround that you fix up manually afterward” — it means reconstructing the same data model XD had, using Figma’s native representation. Prototype play mode works correctly.
📊 Supported interaction matrix
Concrete mapping in table form. This is the scope Pixel Fine Converter Pro auto-converts.
Triggers
| XD | Figma | Notes |
|---|---|---|
tap | ON_CLICK | Standard click / tap |
hover | ON_HOVER | Mouse hover (doesn’t fire on mobile) |
drag | ON_DRAG | Fires at drag start |
| Unknown trigger | ON_CLICK | Fallback (mapped to ON_CLICK) |
Actions / Navigation
| XD action | Figma navigation | Behavior |
|---|---|---|
artboard-transition | NAVIGATE | Navigate to another frame |
overlay-transition | OVERLAY | Overlay display (layered on top) |
previous-artboard | BACK | Back to the previous frame |
auto-animate | NAVIGATE + SMART_ANIMATE | Differential animation between same-named layers |
scroll-transition | SCROLL_TO | Scroll to a position within the same frame |
state-transition | CHANGE_TO | Switch Component States to another variant (next section covers this) |
Transitions
| XD transition | Figma transition | Notes |
|---|---|---|
none | None | Instant switch (no animation) |
dissolve | DISSOLVE | Fade in / out |
auto-animate | SMART_ANIMATE | Interpolation between same-named layers |
slide-left / right / up / down | SLIDE_IN + direction | All four directions preserved |
push | PUSH | ⚠️ Direction unified to LEFT (see below) |
Easings
| XD | Figma |
|---|---|
ease-out | EASE_OUT |
ease-in | EASE_IN |
ease-in-out | EASE_IN_AND_OUT |
linear | LINEAR |
| Unspecified / unknown | EASE_OUT (default) |
Duration is also preserved from properties.duration. When missing, the default 0.3 seconds is applied.
🔄 Component States → Figma variants
XD’s Component States feature lets a single symbol carry multiple states (Default / Hover / Pressed, etc.) and switch between them in prototype mode. Figma represents the same idea with variants + state-transition.
Conversion flow
For Component States, Pixel Fine Converter builds these correspondences:
- Symbol definition
node.id→symbolId— Resolve which component is the target state.id→"State=xxx"variant name — Resolve which state to switch to- Symbol ID → default variant — Reverse map for returning to the original state
XD state names are preserved as-is in State=<name> variant names (when the name is empty, fallback to State=Variant).
Application scope
state-transition is applied to every instance of the symbol placed on artboards after conversion. The transition isn’t applied to the component definition itself — it’s set on each instance actually used in the design, via CHANGE_TO reactions.
This means buttons or interactive elements that used state switching in XD end up working with the same trigger / animation on the Figma side, switching variants exactly as before.
Merges with existing reactions
state-transition merges with any other reactions the instance already has (artboard-transition / overlay-transition / etc.) — it doesn’t overwrite the original connections.
🔓 Free / Pro boundary
Prototype auto-conversion is a Pixel Fine Converter Pro feature. In the UI, it’s exposed as the Convert prototype interactions checkbox under Convert Options.
- Free plan: The option isn’t shown at all — prototype conversion and the other Pro options appear only on the Pro plan, with an upgrade prompt shown on Free instead
- Pro plan: The option is shown, ON by default (checked); you can explicitly turn it off to skip conversion
Trying it on Free
If you want to evaluate prototype conversion without subscribing yet, two practical paths:
- Try Pro once on a small file — Compare Free vs. Pro accuracy in person, use it as a Pro purchase decision
- Validate baseline conversion on Free first — Confirm shape / text / style conversion accuracy on Free before evaluating Pro
Free XD to Figma Conversion — When Paid Plugins Are Worth It walks through a comprehensive comparison of Pro features (including prototype conversion) against Free features.
⚠️ Honest limits from the Figma API
XD and Figma’s prototype features sit close to each other in design, but a handful of behaviors can’t be reproduced faithfully due to Figma’s API spec. These aren’t Pixel Fine Converter implementation issues — they’re platform-level constraints. Surfaced here for transparency.
1. Push direction unifies to LEFT
The push transition becomes Figma’s PUSH + direction: 'LEFT'. Any push direction in XD (up / down / left / right) collapses to LEFT.
→ Impact: Push-heavy prototypes may feel directionally different
→ Workaround: Use slide-left / right / up / down for transitions where direction matters — slide preserves all four directions
2. Drag offset distance isn’t preserved
XD’s drag interactions let you set an offset value that fires after a specific drag distance. Figma’s ON_DRAG trigger has no equivalent parameter, so drag distance settings don’t carry over.
→ Impact: “Fire after dragging X pixels” becomes “Fire at drag start” → Workaround: Drag-distance control needs to be redesigned on the Figma side — Pixel Fine Converter only detects the interaction
3. Overlay / scroll anchor position and scroll preservation
Neither overlay-transition nor scroll-transition explicitly sets anchor position (overlay display offset) or preserveScrollPosition (whether the background’s scroll position is preserved). Figma’s defaults apply. Only artboard-transition and auto-animate propagate preserveScrollPosition from the XD source — for overlay and scroll connections, the setting is dropped.
→ Impact: Overlay positioning, background scroll behavior, and scroll-to connections may differ subtly from XD — especially noticeable on scroll-heavy prototypes → Workaround: For overlays and scroll connections that matter, confirm anchor / scroll behavior on the Figma side and adjust
4. Fallbacks for unknown triggers / actions / transitions
Depending on the XD version, the file may contain triggers / actions / transitions that aren’t in Pixel Fine Converter’s mapping table. The fallback logic:
- Unknown trigger →
ON_CLICK - Unknown transition →
DISSOLVE - Unknown action → Skip (counted as an unconvertible connection)
→ Impact: Prototype still works, but it isn’t a faithful reproduction → Workaround: After conversion, replay the main transitions in Figma’s prototype play mode and manually fix any connection that doesn’t behave as intended
5. Skip on destination resolution failure
When the destination references an artboard / node that was removed during component conversion, or when ID matching fails, the interaction is skipped. Because the connection simply doesn’t carry over and no error is shown, this is an easy class of issues to overlook.
→ Impact: In large files, a portion of connections may not carry over → Workaround: After conversion, use Figma’s prototype play mode and verify the main transitions
6. State=Default variant naming is enforced
When XD’s Component States are converted, the symbol’s base state is always mapped to a Figma variant named State=Default — even if XD used a different label (e.g., Off, Idle, Normal) for the default state. Non-default states keep their XD-side names (e.g., State=Hover, State=Pressed).
→ Impact: Design systems that relied on the XD-side “default” state label end up with a renamed variant after conversion, surfacing as a mismatch between component documentation and the actual Figma variant set
→ Workaround: After conversion, either rename the State=Default variant in Figma to match your design system convention, or update the documentation to match the converted naming — pick one path explicitly
Verify in prototype play mode after converting
The reliable way to confirm prototype connections came across as intended is to replay the main transitions in Figma’s prototype play mode after conversion. Push direction, overlay position, scroll behavior, and Component States switching are especially worth checking visually by replaying them.
✅ Prototype migration checklist
Items to check when working through an XD → Figma prototype migration.
Before migration
- ✅ Pixel Fine Converter Pro plan purchased (prototype conversion is a Pro feature)
- ✅ Main transitions listed from XD prototype mode (priorities assigned)
- ✅ Symbols using Component States enumerated
- ✅ Push-transition usage points confirmed (direction unification impact mapped)
Right after migration
- ✅ Launch Figma’s prototype play mode and verify main transitions
- ✅ Confirm Component States switching transitions to the expected variant
- ✅ Verify Smart Animate (differential interpolation between same-named layers) plays smoothly
- ✅ Verify overlay display position matches the intent
Items needing manual touch-up
- 📝 Push direction off → Set direction manually in Figma
- 📝 Drag distance setting needed → Adjust separately on the Figma side
- 📝 Overlay anchor / scroll preservation → Adjust via Figma’s OVERLAY settings
- 📝 Connections that didn’t carry over → Check the transitions in prototype play mode and fix manually
One-click install from Figma Community
💬 Frequently asked questions
Q1. Can I try prototype conversion on Free?
No. Prototype auto-conversion is a Pro feature, and on Free the option isn’t shown at all (prototype conversion and the other Pro options appear only on the Pro plan). Baseline conversion (shapes / text / component structure) without prototypes is available on Free.
Q2. Will every connection from my XD prototype carry over?
Triggers (tap / hover / drag), actions (screen transition / overlay / back / Smart Animate / scroll), and Component States switching are converted comprehensively. That said, fine-grained details — push direction unification, drag distance, overlay anchor — can hit Figma API constraints (see Honest limits from the Figma API).
Q3. Are Component States converted to Figma variants?
Yes. Each XD state becomes a State=<name> variant in Figma, and state-transition actions become CHANGE_TO reactions on the corresponding instances. The default state is preserved as State=Default.
Q4. How do I see which interactions didn’t convert?
After conversion, replay the main transitions in Figma’s prototype play mode and check for any connection that doesn’t behave as intended. On prototypes with many screens, focusing on push direction, overlay position, and Component States switching helps you efficiently narrow down where touch-up is needed.
Q5. Is it faster than rewiring connections manually in Figma?
The bigger the connection count, the bigger the effect. For small prototypes (10–20 connections) you can rewire manually in maybe 30 minutes, but once screens get into the dozens the manual rebuild can stretch to hours or days. Pixel Fine Converter Pro processes everything in one pass during conversion — the time-efficiency gap grows with file size.
Q6. If I edit the prototype in Figma after migration, what happens when I re-convert?
Pixel Fine Converter outputs each conversion to a new Figma page, so existing edits aren’t overwritten. Re-running the conversion produces another fresh page, letting you keep manual edits in parallel with re-conversions.
🎯 Wrapping up
Migrating XD prototypes to Figma by hand piles up workload fast. Pixel Fine Converter Pro takes that workload off the table by auto-converting triggers / actions / animations / Component States comprehensively.
Auto-conversion scope:
- Triggers: tap / hover / drag
- Actions: navigate / overlay / back / Smart Animate / scroll / state-transition
- Animations: dissolve / slide (4 directions) / push / smart-animate
- Easings: ease-out / ease-in / ease-in-out / linear
- Component States → automatic switching to Figma variants
Honest limits from the Figma API:
- Push direction unifies to LEFT
- Drag offset distance not preserved
- Overlay anchor position / scroll preservation
- Fallbacks for unknown triggers / actions / transitions
You can spot these limits by replaying the main transitions in Figma’s prototype play mode after conversion, making it easy to pinpoint where manual touch-up is needed.
Decision guide for prototype migration
- Large projects with many connections → Pro auto-conversion + prototype play mode to find touch-up points
- Small one-off migrations with few connections → Free for baseline conversion, then decide on Pro
- Heavy Component States usage → Pro’s state-transition auto-conversion is where the value is most concentrated
Ultimately, prototype migration accuracy depends on file structure and Component States design. Validating against the actual conversion result is the most reliable path to a decision.
One-click install from Figma Community
Related pages
- Mapping XD Artboards to Figma Frames — Migration mapping cluster #1, artboard-level 1:1 correspondence
- Adobe XD to Figma migration — a practical guide — End-to-end process and three approaches
- Free XD to Figma Conversion — When Paid Plugins Are Worth It — Pro feature scope and decision axes
- Migrate XD to Figma — A 5-Step Playbook for Engineering Teams — Team migration approach
- Features: Components — Symbol → component, state → variant conversion
- Features: Conversion notes — The accuracy-difference reporting feature