← All migration plugins

Migrate from Docusign to Anvil

Anvil converts a Docusign template directly into an Anvil template, field geometry intact. The plugin maps the APIs, rewrites your integration, and verifies it end to end.
Install in Claude Code
/plugin marketplace add anvilco/anvil-plugins
/plugin install docusign-anvil-migration@anvil-plugins
Type both into Claude Code: the first adds Anvil's plugin catalog, the second installs the Docusign plugin. Then ask Claude to migrate.
The mental model
A Docusign envelope built from a template becomes an Anvil Etch packet built from a Cast, and Docusign’s roles, tabs, captive recipients, and Connect events become Anvil signer IDs, fields, embedded signers, and webhook actions.
Cast is Anvil's word for a template: a reusable document with named fields your code fills through the API.

Lossless template conversion

Docusign is the one source that moves without re-tagging. Anvil rebuilds each template from the Docusign JSON with field coordinates, field types, and signer roles intact.
export-docusign-templates.ts
Pulls your templates out of Docusign as converter-shaped JSON. Standalone – no Docusign SDK required.
import-docusign-json.ts
Uploads that JSON to Anvil’s createCast, returning a new castEid per template.

Docusign to Anvil, term by term

Most of a migration is vocabulary. Here is the map the plugin works from – it keeps these names straight so you do not have to.
DocusignAnvilWhat it is
EnvelopeEtch packetThe signing transaction. createEtchPacket returns an etchPacketEid.
Template (templateId)Cast (castEid)A reusable PDF template with tabs.
Template role (roleName)Signer idA named signing slot; in Anvil an arbitrary signer id you map to fields.
Tab (signHere, text, date…)FieldA signable or fillable box, each with a type.
tabLabel / tabIdField alias (aliasId)Your data key for a field.
Tab value / prefillTabsFill data (data.payloads)Prefilled field values.
clientUserId (captive recipient)signerType: 'embedded'In-app signing, with no email sent.
createRecipientViewgenerateEtchSignURLThe embedded signing URL.
Connect / eventNotificationcreateWebhookActionEvent delivery.
envelope-completedetchPacketCompleteAll signers done; documents downloadable.
recipient-completedsignerCompleteOne signer finished.
Integration key + JWT + accountIdANVIL_API_KEYAuth. One key per org, no account discovery. OAuth or child orgs act for a client.

What the rewrite looks like

Sending from a template is one call on both sides, but Anvil drops the JWT and account-discovery handshake and carries prefill data as a keyed payload.
Before – Docusign
const envelopesApi = new docusign.EnvelopesApi(apiClient)

const envelope = { ... }

const results = await envelopesApi.createEnvelope(
  account.accountId,
  {
    envelopeDefinition: envelope,
  }
)
const envelopeId = results.envelopeId
After – Anvil
const {
  data,
  errors,
} = await anvilClient.createEtchPacket({
  variables: {
    files: [ ... ],
    data: { ... },
    signers: [ ... ],
  },
})

How the migration runs

The plugin works through six steps, showing you what it found and what it plans to change before it touches your Docusign integration.
Step 1 of 6
Discovery
Scans your codebase for every integration point – SDK imports, API calls, environment variables, webhook handlers, and database columns holding provider IDs.

Where Docusign and Anvil differ

No migration is a pure find-and-replace. These are the gaps the plugin raises during mapping – each tagged with what it will cost you to close, from a straight swap to a decision worth making up front.
Works the sameA direct equivalent – nothing to decide.
Minor changeThe same capability, reached a different way in the API call.
Plan for reworkSupported, but you will write code for it.
Needs a decisionNo direct equivalent – worth discussing before you start.
Signing order
Works the same
routingOrder is a direct equivalent – equal values sign in parallel.
Embedded signing
Works the same
createRecipientView becomes generateEtchSignURL rendered in AnvilEmbedFrame.
Template roles and prefill
Minor change
The template converter reconstructs role-to-field associations, so this is mostly a naming exercise.
Carbon copies and certified deliveries
Minor change
Becomes a non-signing recipient or an app-level notification – a one-time decision per template.
Envelope expiration and reminders
Minor change
Handled as app-level scheduling if hard deadlines matter.
Bulk send
Plan for rework
A loop over createEtchPacket instead of a batch call; the client handles rate limiting.
Signer authentication (access code, SMS, ID check)
Plan for rework
Build an auth wall in front of the sign URL if verification is compliance-critical.
OAuth multi-tenant
Plan for rework
Docusign’s OAuth lets your app act on behalf of other accounts. Anvil supports this: register an Anvil OAuth app for each tenant to authorize, or give each tenant a child organization with its own API key. Both are Enterprise features.
Agents, editors, and intermediaries
Needs a decision
No direct equivalent – the flow needs rethinking at the app level. The plugin confirms whether you actually use it before planning around it.

Coming from somewhere else?

We publish a purpose-built migration plugin for each of these too.
See every migration plugin

Get a demo
(from a real person)

Schedule some time on our calendar to talk through your specific use case and see which Anvil products can help.
    Want to try Anvil first?
    Want to try Anvil first?