Move a site between Ploy workspaces

Use your coding agent and Ploy CLI 0.12.0 or newer to copy a site and its dependencies into another workspace.

Verify the copy, move traffic when ready, and delete the original only after confirmation.

The Ploy agent inside a workspace cannot perform this transfer because it has access to one workspace. Run the procedure from your own coding agent with browser-backed CLI login.

Before you start

  • Both workspaces must belong to the same organization. Your account needs admin or owner access to both.
  • Run ploy update, check ploy --version, and sign in with ploy login. Workspace API tokens cannot perform cross-workspace operations. Organizations requiring SSO are currently unsupported.
  • Identify both workspace IDs and the source site ID. Keep the original until the destination is verified.
  • If the site writes to a database, arrange a write freeze for all consumers while copying and until cutover, or use a separately verified reconciliation plan. Database copies do not synchronize later writes.

Use the Ploy site skill

Install the public Ploy site skill (ploy-site) in the project where you run your coding agent:

Install the public Ploy site skill
npx skills add Ploy-AI/ploy-tools

Then ask your agent:

Use the ploy-site skill and its workspace transfer procedure to copy site <site-id> from workspace <source-id> to workspace <destination-id>. Inventory the code, unpublished work, databases, assets, environment, forms and documents. Show preservation gaps before writing. Validate the destination yourself, then let me verify before moving traffic or deleting the original.

The skill's workspace transfer procedure is the step-by-step reference for your agent, including dependency checks, CLI commands, and recovery steps. You can also give that link directly to your agent. Install the Ploy CLI separately. CLI 0.12.0's ploy skills init installs a different, site-specific skill bundle.

What the procedure covers

ResourceTransfer behavior
Site codeImport committed source into a new site and preserve unpublished edits separately. Original Git and deployment histories are not moved.
DatabasesCopy schema and records into an independent database. Create a new access key and update destination references. FILE columns are unsupported.
AssetsCopy the public-library assets used by the site, preserve shared source assets, and update destination URLs. Tracked public files travel with code.
Variables and secretsCopy each deployment environment. Replace source database credentials before publishing.
FormsCopy captured submissions and, optionally, notification settings without sending email. Verify new submissions at the destination.
DocumentsCopy relevant Markdown and repair resource links. Comments, history, attachments, and connected integrations need separate handling.
Custom domainsMove the selected domain and its apex or WWW companion only after the destination passes verification. Verify routing and TLS.

Validate before cleanup

Test routes, mobile layout, images, database reads and writes, integrations, and form persistence on the published destination. New database access keys are created under Database options → Access keys → Create access key and bound with ploy secret set through stdin or its masked prompt.

The procedure uses separate copy and delete commands. There is no single atomic transfer. Deleting a site preserves workspace-library assets and databases. Delete a source database only when no remaining consumer uses it. Keep required backups and history before approving cleanup.

If you need unchanged site identity, deployment history, private database files, a transfer between organizations, or help resolving a failed operation, contact Ploy support before removing the source.

Recovery

If a new workspace's default site remains unprovisioned and Git clone fails, inspect its state. Import into one new site with site init --from and record the unused empty default for approved cleanup.

For HTTP 429, honor Retry-After. If it is absent, pause requests on that token for 60 seconds, then resume existing operation IDs and keys. Always check exit status and response content before comparing output files.


Keep going