MigratePolotno

PolotnoOrshot
Move Your Polotno Editor to Orshot

Give your users a Canva-like editor inside your app without hosting it. Your Polotno designs import as JSON, and the same templates render by API.

For Polotno SDK apps and Studio designs. Embed from $39/mo, API free to try. Updated September 22, 2026.

Try it live

Try the hosted editor that replaces your Polotno build

“Acme Studio” is a fake brand running a real Orshot embed. Open the video or the invoice and change anything. The demo keeps none of your edits.

Loading the editor…

“Add to App” is a custom button. Click it to send the design here as a PNG, with no store.toDataURL() code on your side.

to open the editor on a first visit
1 to 3 s
50 white-label users, renders included
$160/mo
render servers or Puppeteer to run
0

Load time measured cold in Chrome on Sep 21, 2026. Price from Orshot's current plans.

The code swap

Swap the Polotno packages for one iframe

React and Vue apps can drop in a component instead. Either way the editor loads from Orshot, and the polotno package leaves your bundle.

<iframe
  src="https://orshot.com/embeds/your-embed-id?templateId=123&userId=user_42"
  allow="clipboard-write"
  style="width: 100%; height: 100%; min-height: 600px; border: none;"
></iframe>
import { OrshotEmbed } from "@orshot/embed-react";

<OrshotEmbed embedId="your-embed-id" templateId={123} height={700} />
<script setup>
import { OrshotEmbed } from "@orshot/embed-vue";
</script>

<template>
  <OrshotEmbed embed-id="your-embed-id" template-id="123" height="700px" />
</template>
You won't pass a Polotno key. Your embed ID and allowed domains in the Orshot dashboard do that job. Integration guide
Plans and features

Polotno's license next to Orshot's plans

Both publish prices. Polotno licenses an SDK you host yourself, while an Orshot plan includes the hosted editor and renders.

FeatureLaunchGrowScalePolotno SDK
Pricefrom $39/mofrom $160/mofrom $349/mo$249/mo or $899/mo
Editor inside your productOne iframe, or the React and Vue componentsIncludedIncludedIncludednpm package, React
White-labelYour name and icon, no Orshot logoNot includedIncludedIncludedPaid license; trial shows a credit
Private library per userTheir own templates and brand libraryNot included50 to 100 users500 to 1,500 usersYou build it
Masters open as copiesNobody overwrites your originalsNot includedIncludedIncludedYou build it
Domains it can run on258One domain on Self-Serve
Download from the editorPNG, AVIF, PDF, HTML, plus MP4 for videoNot includedIncludedIncludedIncluded
Save events and webhooksYour app hears every save and downloadNot includedIncludedIncludedStore events, you add webhooks
Drive the editor from your codeLoad a design, fill in text and imagesNot includedNot includedIncludedIncluded
Custom toolbar buttons"Add to App", "Send for review"Not includedNot includedIncludedYour own UI code
Your asset library in the side panelNot includedNot includedIncludedCustom side panel, your code
Smart Resize in the editorAdapt a design to new sizesNot includedNot includedIncludedMagic resize, scales elements
Renders a month by APIA credit per image, PDF page or video second1,500 to 5,000 credits20,000 to 40,000 credits75,000 to 300,000 creditsSelf-host, or $0.004 per image

Orshot columns come from the live plans, smallest to largest size. Details on pricing. Polotno prices are the Grass Roots and Self-Serve licenses listed on Sep 22, 2026. Grass Roots needs a manual review; Self-Serve covers one domain.

From Grow up, only your branding shows. The user cap blocks new users, never the ones already in. Ask about more seats
Polotno is the better pick if you build your own editor panels or must run the editor on your own servers.
FeatureOrshotPolotno SDK
The editor
Editor hosted by OrshotAn iframe, or a React or Vue componentYesnpm package you host
Works in any stackPHP, Rails, WordPress, no-codeYesReact core; plain JS, Vue and Angular wrap it
Each user's templates and brand library stored for youImages, video, audio, colors and fonts, private to each userIdYesYou build it
Your masters stay untouchedYesYou build it
Per-user action locksSet in the dashboard or in a signed JWTYesElement locks, the rest in your code
Each user's brand library loaded by APIYesCustom side panel, your code
Usage stats for the embedSee who comes back and who tried it onceYesYou build it
Build your own side panels and pluginsOrshot lets you hide panels and add buttonsNoYes
Self-host the editorNoYes
Built-in interface languagesEnglish, Spanish, Portuguese, French, German, Russian6 built inAny, via translations
Renders and automation
An API for the designs users editPNG, JPG, WebP, AVIF, PDF, MP4, WebM, GIFYespolotno-node, or Cloud Render
Send values, not the whole designTemplate ID plus the fields that changeYesFull design JSON on every call
Video renders included in the planNot on your servers or your user's browserYesSelf-host, or Cloud Render billed extra
Async render jobs with a webhookYesOn Cloud Render
Native Zapier, Make and n8n appsPipedream and Airtable too, same parameter namesYesHTTP calls you write
Scheduled workflows without codeRender from a source and send it onYesNo
Renders from a URLDynamic URLs, a new file per query valueYesNo
Forms non-developers render withYesNo
AI agents and publishing
Claude, ChatGPT and Cursor on your templatesHosted MCP, nothing to run locallyYesLocal only: a docs MCP and a Mac app
Publish to 15 social networks on a scheduleYesNo
Import from Canva, Figma, HTML and PolotnoYesPSD, PDF and SVG; Figma via SVG export
Cost
Lowest price for a white-label editorPolotno's $249 tier needs a manual review$160/mo$249/mo or $899/mo
Renders come with the planYesSelf-host, or $0.004 per image
Several domains on one planPolotno's Self-Serve tierUp to 8One domain and brand family
01Step 1

Import your Polotno designs

Polotno designs are already JSON. Paste one, or bulk import ten at a time, and every text and image layer becomes a parameter.

  1. 1Get the JSON from store.toJSON() in your app, or export it from Polotno Studio.
  2. 2Paste it under New Template, Polotno. A preview renders right away.
  3. 3Confirm you own the design and hit Import Design to open it in the editor.
The badge and preview confirm your JSON parsed cleanly.
  1. 1Save one .json file per design, straight from store.toJSON().
  2. 2New Template, Polotno, Bulk import (paid plans). Pick up to 10 files at a time.
  3. 3Each file gets a preview, and one click saves them all to Your Templates.
  1. 1Send the JSON files and custom fonts, plus a render of each animated design.
  2. 2Up to 5 designs are free on any paid plan, and we patch what didn't convert.
  3. 3Each text_1_1 gets renamed back to your {variable} name. Send your files
PolotnoOrshot
texttext layer, parameter text_1_1
image, svgimage layer, parameter img_1_1
figurecircle stays a circle, other shapes become rectangles
linethin rectangle
page background colorpage background color
draggable: falselocked layer
Hello {name}Stays as typed. Edit to {{name}}, then send text_1_1:name
Groups, animations, video, background images and crops don't convert. Odd shapes land as rectangles. Ungroup and delete video layers before you export.

Done when each design opens in the Studio with parameters like text_1_1 and img_1_1.

02Step 2

Put the hosted editor where Polotno was

Your React tree mounts one iframe where PolotnoContainer sits today. The polotno package comes out, and the client never sees a Polotno key.

  1. 1In the dashboard, open Orshot Embed. Enable Embed is the first switch.
  2. 2Under Allowed Domains, add every site that loads the editor, plus localhost for testing.
  3. 3Grab the iframe from Embed Code, or install the React component.
The preview on the right updates as you change settings.
<iframe
  src="https://orshot.com/embeds/your-embed-id?templateId=123&userId=user_42"
  allow="clipboard-write"
  style="width: 100%; height: 100%; min-height: 600px; border: none;"
></iframe>
import { OrshotEmbed } from "@orshot/embed-react";

<OrshotEmbed embedId="your-embed-id" templateId={123} height={700} />
PolotnoOrshot Embed
createStore({ key })embed ID in the URL
<PolotnoContainer>…<iframe> or <OrshotEmbed />
polotno, polotno/ui.cssnot needed
store.loadJSON(json)?templateId=123
setTranslations(…)?lang=spanish
showCredit: falseGrow plan and up
Safari and some in-app webviews hide the referrer, which breaks the domain check. Sign a JWT on your server and add it as token.
03Step 3

Brand the editor without CSS overrides

Your theme overrides can go. Color and icon are dashboard settings now, and ?hide in the URL drops whole panels.

  1. 1Upload your icon and pick an accent color under General. Title and language are there too.
  2. 2?hide=stylesSidebar,pagesBar in the URL hides the styles sidebar and pages bar.
  3. 3Save once the live preview looks right.
Where your logo and accent color go.
PolotnoOrshot Embed
CSS theme overridesAccent color
dark theme class?theme=dark
<Toolbar />, Layers section?hide=stylesSidebar
<PagesTimeline />?hide=pagesBar
<SidePanel> insert sections, <ZoomButtons />?hide=toolsBar
Users who should only swap text and images don't need stylesSidebar or toolsBar, so hide both. templateBar stays, since it holds Save and downloads. All tokens

Done when the editor shows your color and name, minus the panels you hid.

04Step 4

Let Orshot store each user's templates and brand library

Drop the table and bucket you keep per user. With a userId in the embed URL, every user gets their own templates and a brand library of images, videos, audio, colors and fonts.

  1. 1Enable Per-User Data & Templates (under Users & Data). This replaces your per-user JSON storage.
  2. 2Append userId to the iframe src, which the React and Vue components can't do yet. A user is created when they first open the editor.
  3. 3Protect your masters with Prevent Workspace Template Overriding under Templates. Edits land in a copy.
Two switches stand in for your storage code.
PolotnoOrshot Embed
store.toJSON() saved per user?userId=abc, a private library
your designs tableMy Templates, per user
user uploads in your own bucketa Brand Library for each user
master designs in your codeWorkspace Templates, protected
draggable, removable: falseLocked layers + ?hide=stylesSidebar
hiding UI per user in your codePer-user permissions, dashboard or JWT
Each user can have their own logos and fonts too, set by API, so one embed covers many brands.

Done when a second test user can't see the first user's templates or brand library.

05Step 5

Get every save and download in your app

From Grow up, saves and downloads reach your page as events, and each save also calls your webhook.

  1. 1Switch events on in Events & Integrations, and paste the URL your server listens on.
  2. 2On the page, a message handler on window receives orshot:template:update after each save.
This section also holds editor control and the asset picker.
  1. 1Custom buttons need Scale. Add one under Custom Buttons and name it, for example Add to App.
  2. 2Choose Emit PNG as the action. Your page gets the image, the way the demo above does.
An Add to App button set to send a PNG.
PolotnoOrshot Embed
store.on("change", save)orshot:template:update + webhook
store.toDataURL(), saveAsPDF()Custom button: Emit PNG or PDF
store.loadJSON(other)orshot:embed:control { templateId }
element.set({ text })orshot:embed:control { modifications }
custom side panel of your assetsCustom asset picker

Done when one save shows up on your page and at your webhook URL.

06Step 6

Render from the API, not polotno-node

Send a template ID and the values that change, and the API returns a file URL. That retires polotno-node and Cloud Render.

PolotnoOrshot
POST /api/renders + design JSONPOST /v1/studio/render + templateId
{headline} swapped by your backend{ "headline": "…" }
polotno-node + Puppeteernothing to run
format: "mp4"response.format: "mp4"
$0.004 per image on Cloud Rendercredits in your plan

Three common renders, before and after

Cloud Render wants the whole design, while Orshot needs the template ID and values.

One image from the template imported in step 1, with text_1_1 and img_1_1 renamed to quote and avatar.

Polotno|POST api.polotno.com/api/renders
{
  "design": {
    "width": 1080, "height": 1080,
    "pages": [{ "children": [
      { "type": "text", "text": "Art is where emotion finds form." },
      { "type": "image", "src": "https://example.com/avatar.jpg" }
    ]}]
  },
  "pixelRatio": 2,
  "format": "png"
}
Orshot|POST api.orshot.com/v1/studio/render
{
  "templateId": 12345,
  "modifications": {
    "quote": "Art is where emotion finds form.",
    "avatar": "https://example.com/avatar.jpg"
  },
  "response": {
    "type": "url",
    "format": "png"
  }
}

The template is already in Orshot. Read the file link from data.content.

A two-page certificate, returned as a single PDF file.

Polotno|POST api.polotno.com/api/renders
{
  "design": { "pages": [ … ] },
  "format": "pdf"
}
Orshot|POST api.orshot.com/v1/studio/render
{
  "templateId": 12345,
  "modifications": {
    "page1@name": "Cassandra Maughne",
    "page2@course": "Studio Foundations"
  },
  "response": {
    "type": "url",
    "format": "pdf"
  }
}

Polotno pages map to PDF pages in order. page1@name only changes name on page 1.

A video render, with no Puppeteer or render server on your side.

Polotno|POST api.polotno.com/api/renders
{
  "design": { "pages": [ … ] },
  "format": "mp4"
}
Orshot|POST api.orshot.com/v1/studio/render
{
  "templateId": 12345,
  "modifications": {
    "headline": "Spring launch",
    "clip": "https://example.com/product.mp4"
  },
  "response": {
    "type": "url",
    "format": "mp4"
  }
}

A 15-second clip uses 15 credits, on any paid plan. Polotno video designs don't import. Build those in the Studio.

Moving a Zapier, Make or n8n flow too? Point it at the template ID and keep the parameter names you set in step 1. Integrations and Orshot for agents
07Step 7

Switch users over one group at a time

Your Polotno setup keeps working while you test.

  1. 1Keep PolotnoContainer live and show the Orshot embed only to users behind a feature flag.
  2. 2Have one flagged user save a design, then render it once by API. Check both arrive.
  3. 3Widen the flag in batches. A clean week later, uninstall polotno and polotno-node, and delete the env key.

Done when every flagged save and render has come through for seven days. Plans are at the top of the page.

We import up to 5 designs free on any paid plan

  • Fixes for anything that didn't convert
  • The embed set up with you, from domains to per-user data
  • You get every imported design back, rendered with your own data

Got a large library, or designs for several clients? A call is the fastest start.

Where your automations run
Free for up to 5 templates on any paid plan. Bigger moves start with a call.

Hand the Polotno swap to your AI agent

Your coding agent can do the rewrite. Give Claude Code, Cursor, Codex or ChatGPT this prompt and it replaces each polotno and polotno-node call, citing the docs as it goes.

migrate-from-polotno.md
# Replace the Polotno SDK in this project with Orshot Embed

You are helping me move this project off the Polotno SDK (the `polotno` npm package, `polotno-node` and api.polotno.com) and onto Orshot (orshot.com). Orshot runs the template editor for me: I embed it through an iframe or a React/Vue component, and Orshot's API renders images, PDFs and videos from the same templates. Orshot also has native n8n, Make, Zapier, Pipedream and Airtable apps and an MCP server (https://mcp.orshot.com/mcp, setup at https://orshot.com/agents). Connect to that MCP server first if you can: with it you can list my Orshot templates, read their parameters and run test renders. Read the linked docs before you change anything, then work through the steps in order.

## 1. List every place this project uses Polotno

Search for, and list with file paths:
- imports from `polotno`, `polotno/…`, `polotno-node`, `polotno/ui.css`
- `createStore(`, `store.toJSON`, `store.loadJSON`, `store.on(`, `store.toDataURL`, `store.saveAsImage`, `store.saveAsPDF`
- `<PolotnoContainer`, `<SidePanel`, `<Workspace`, `<Toolbar`, `<PagesTimeline`, custom side panel sections
- `api.polotno.com` render calls and the Polotno key (env vars, `key:` in createStore)
- code that stores or serves design JSON per user (database tables, S3 keys, API routes)
- code that substitutes `{variable}` tokens in design JSON before rendering

## 2. Import the designs

Designs cannot be converted from code alone. I will export each design as JSON (`store.toJSON()`, or the JSON export in Polotno Studio) and import it in Orshot myself (New Template → Polotno tab → paste the JSON, or bulk import up to 10 files on a paid plan). Guide: https://orshot.com/migrate/from-polotno · Importer docs: https://orshot.com/docs/importing-templates/import-from-polotno

After import every text and image layer is an Orshot parameter with an automatic ID (`text_1_1`, `img_1_2`), which I can rename in the Studio.
- Groups, animations, video layers, background images and image crops don't convert, and figure shapes other than circles become rectangles. Flag designs that use them; ungrouping before export keeps grouped layers. A video layer comes in as an image pointing at the video file and fails the image copy, so delete video layers before export.
- A `{name}` token inside a text layer: in Orshot the whole layer is one parameter. Rename it, or change the token to `{{name}}` and send `"<parameterId>:name"`. Docs: https://orshot.com/docs/orshot-studio/inline-parameters

Ask me for the Orshot template IDs, or read the parameters with:
- GET /v1/studio/templates/{id}: https://orshot.com/docs/api-reference/studio-template-get
- List templates: https://orshot.com/docs/api-reference/studio-templates-list

Build a mapping table: Polotno design (file or DB row) → Orshot templateId, and Polotno `{variable}` → Orshot parameter name. Show it to me before editing code.

## 3. Replace the editor

Reference: https://orshot.com/docs/orshot-embed/integration · React: https://orshot.com/docs/orshot-embed/react-sdk · Vue: https://orshot.com/docs/orshot-embed/vue-sdk

Polotno:
```jsx
const store = createStore({ key: POLOTNO_KEY, showCredit: false });
<PolotnoContainer><SidePanelWrap><SidePanel store={store} /></SidePanelWrap>
  <WorkspaceWrap><Toolbar store={store} /><Workspace store={store} /></WorkspaceWrap></PolotnoContainer>
```

Orshot (plain HTML):
```html
<iframe src="https://orshot.com/embeds/EMBED_ID?templateId=12345&userId=USER_ID" title="Editor" allow="clipboard-write" style="width:100%;height:100%;min-height:600px;border:none"></iframe>
```

Orshot (React):
```jsx
import { OrshotEmbed } from "@orshot/embed-react";
<OrshotEmbed embedId="EMBED_ID" templateId={12345} />
// Per-user libraries: use the iframe URL with &userId=… (the SDK props are embedId, templateId, modifications)
```

Rules:
- The embed ID comes from my Orshot workspace (Embed → Embed Code). Store it as `ORSHOT_EMBED_ID`. Remove the Polotno key, the `polotno` package, its CSS import and every Polotno component.
- `store.loadJSON(json)` becomes the `templateId` query parameter. `?lang=` sets the language. Docs: https://orshot.com/docs/orshot-embed/integration
- One store per user becomes the `userId` (plus optional `userName`, `userEmail`) query parameters; Orshot keeps each user's templates and brand library (images, videos, audio, colors, fonts) apart. Docs: https://orshot.com/docs/orshot-embed/per-user-data
- Appearance is set in the dashboard (accent color, title, icon, language) and with the `hide` query parameter for panels (`templateBar,pagesBar,metaBar,toolsBar,videoBar,stylesSidebar,smartResize`). Docs: https://orshot.com/docs/orshot-embed/appearance
- If the app runs on Safari or inside webviews, sign a JWT and pass it as `token`. Docs: https://orshot.com/docs/orshot-embed/jwt-authentication
- Per-user action locks (upload, delete, create) go in the `permissions` claim of the JWT. Docs: https://orshot.com/docs/orshot-embed/user-permissions

## 4. Replace store events and exports

Reference: https://orshot.com/docs/orshot-embed/events · Control: https://orshot.com/docs/orshot-embed/controlling-embed · Custom buttons: https://orshot.com/docs/orshot-embed/custom-buttons · Asset picker: https://orshot.com/docs/orshot-embed/custom-asset-picker

- `store.on('change', …)` and your own save endpoint become the `orshot:template:create` / `orshot:template:update` postMessage events plus a webhook URL set in the dashboard. Orshot stores the design; keep only the template ID in my database.
- `store.toDataURL()` / `saveAsImage()` / `saveAsPDF()` become downloads inside the embed, or a custom toolbar button that emits the PNG/PDF to the parent window (`orshot:custom_action`).
- `store.loadJSON()` at runtime becomes an `orshot:embed:control` message with `templateId`; setting element text or images becomes the same message with `modifications`.
- A custom side panel that lists my own assets becomes the Custom Asset Picker: answer `orshot:asset:request` with `orshot:asset:response`.
- Always check `event.origin` includes `orshot.com`.

## 5. Rewrite the render calls

Reference: https://orshot.com/docs/api-reference/render-from-studio-template

Polotno:
```http
POST https://api.polotno.com/api/renders?KEY=…
{ "design": { …full JSON with {variables} already substituted… }, "format": "png", "pixelRatio": 2 }
```

Orshot:
```http
POST https://api.orshot.com/v1/studio/render
Authorization: Bearer ORSHOT_KEY
{ "templateId": 12345, "modifications": { "headline": "Hello", "photo": "https://…" }, "response": { "type": "url", "format": "png" } }
```

Rules:
- The design stays in Orshot. Send only `templateId` and `modifications` keyed by parameter name. Delete the JSON substitution code.
- Style overrides use dot keys: `"headline.fontSize": 48`, `"headline.color": "#111"`. Docs: https://orshot.com/docs/dynamic-parameters
- Multi-page templates prefix the page: `"page2@headline"`.
- `response.format`: png, jpg, webp, avif, pdf, mp4, webm, gif. `response.type`: url, base64, binary.
- Sync is the default and returns `data.content`. For a webhook use `"mode": "async"` inside `response` plus top-level `webhook_url`; you get `202 { id, status: "queued" }` and can poll GET /v1/studio/render-jobs/{id}. Docs: https://orshot.com/docs/api-reference/async-render-start
- Remove `polotno-node`, Puppeteer and the Chromium layer from the server, Dockerfile and CI.
- Auth is Bearer. Store the key as `ORSHOT_API_KEY`. Keys: https://orshot.com/docs/quick-start/get-api-key
- Official SDKs (Node, Python, Ruby, PHP): https://orshot.com/docs/sdks · Errors: https://orshot.com/docs/error-reference

## 6. Automations

If a Zapier, Make or n8n step calls Polotno, add the Orshot step next to it with the same parameters, run it once, then remove the old step. Ready-made workflows are in Quick Connect (Copy as n8n workflow / Make blueprint). Docs: https://orshot.com/integrations

## 7. Verify, then switch

Put the Orshot embed behind a feature flag next to the Polotno editor. Open the same design in both, save from Orshot, confirm the webhook and postMessage events arrive, render each template once from the API and compare with the Polotno output. After a week of matching results, remove the Polotno code and the key. Tell me what you removed.

With Orshot for agents connected, the same agent can test-render the imported templates.

FAQ

What Polotno teams ask before switching

What is Orshot?

Orshot gives your app a template editor and an API for templates that makes images, PDFs and videos. Both run on Orshot's servers, so unlike the Polotno SDK there's nothing to host.

Do my Polotno designs import as they are?

Mostly. Text, images, SVGs, rectangles, circles, lines, page colors and every page come across. Groups, animations, video, background images and crops don't. Rotated layers or letter spacing may need a touch-up.

Do my {name} placeholders still work?

Not as typed. Each text layer becomes one parameter, like text_1_1, holding the whole text. Rename it to your old name, or change {name} to {{name}} to swap a single word.

Can I import many designs at once?

Bulk import takes up to 10 JSON files at a time on any paid plan and saves each one to Your Templates. For a big library, send them to us.

What about custom fonts and images?

Google Fonts load by name. Upload custom fonts to your Brand Library before you import. Images are copied to Orshot storage, so nothing points back at your old bucket.

My app isn't React. Does the embed still work?

Yes. It's an iframe, so it works from PHP, Rails, Django, WordPress or a no-code builder. There are React and Vue components too.

How heavy is the editor for my app?

It loads inside the iframe, not your bundle: about 2.6 MB, ready in 1 to 3 seconds on a cold cache.

Can I stop some users from uploading or deleting?

From Grow up, the dashboard can block uploads or deletes for each user. A signed JWT does it per session on any embed plan.

What if more users sign up than my plan allows?

Nobody gets cut off mid-project. People already using the editor keep going, and newcomers see a limit message until you upgrade or we add seats.

Can I host the editor myself or use it offline?

No. The editor always loads from Orshot over the internet, on desktop or phone. Teams that must self-host the editor should keep Polotno.

Which Orshot plan replaces my Polotno license?

Grow, for events, per-user templates and brand libraries, and white-label. The editor alone is on any paid plan from $39, and Scale adds Smart Resize, editor control, custom buttons and your asset picker.

How do I render without polotno-node or Cloud Render?

Orshot's API takes the template ID and only the fields that change, and returns a file URL. Each image, PDF page or video second costs a credit.

Can I get my designs back out of Orshot?

Yes, nothing is locked in. Copy a template's JSON straight from the editor, and download renders as regular files.

Should I keep my Polotno license during the move?

Yes, until every design is exported as JSON. Then keep both editors live behind a feature flag for the switch-over week.

What do you do in the free migration?

Up to 5 imported designs, cleaned up where they didn't convert, plus embed setup with you and a test render of each. For a larger library, book a call first.