MigrateFrom EmailEngine 2.x

Move off EmailEngine without signing anyone in again.

We copy your EmailEngine accounts, OAuth apps and stored templates into your workwae workspace, grants and all. Mailboxes keep working with the consent they already gave, and our team runs the import for you: there is nothing to install.

  • Dry run first
  • Safe to rerun
  • Your EmailEngine is only read
dry-run-plan.txt
# The plan we review with you (example)
Accounts    40 found
            37 import with their existing grants
             3 need a reconnect through hosted connect
OAuth apps   2 become workspace OAuth apps
Templates    6 import

# Nothing is written until you approve the plan
Why move

More than a mailbox connection

The accounts you bring over land in a hosted, multi-tenant platform with mail, calendars, contacts and meetings behind one API.

Multi-tenant by design

Your accounts live in a tenant with its own API keys, members and roles, audit log, usage metering and data exports.

A synced index in Postgres

Mailboxes, messages and threads are indexed as they sync, with full-text search over subjects, addresses, snippets and stored bodies. API writes show up immediately.

Calendars, contacts, meetings

Every calendar the account can see, with recurring series, RSVP and free/busy, plus contacts, CalDAV and CardDAV, and Zoom and Webex meetings on events.

Hosted connect

Hosted and headless connect flows for Google, Microsoft and IMAP, with your own OAuth apps and a consent page that names your organization.

Change feed and webhooks

A change feed paged by transaction id, so nothing committed out of order is skipped, and signed webhooks from the same feed with a delivery log and replays.

Credentials sealed in Vault

Refresh tokens, passwords and app secrets are sealed with Vault before they are stored. Imported grants are sealed as they arrive.

How it works

We run the import with you

workwae is a hosted service, so our team runs the import on our side and you don't install or run anything. It reads EmailEngine's Redis directly instead of its API, because connecting through an API would sign every account in again.

  1. Share read access

    You share read access to your EmailEngine's Redis and the EENGINE_SECRET it runs with through a one-time encrypted link we send. We use them only for the import and delete them when it finishes.

  2. Dry run

    We start with a dry run that writes nothing. It lists, per account, what imports, how it signs in, what needs a reconnect and which fields are not carried over.

  3. Review together

    We go through the plan with you. To move a few mailboxes first, we limit the import to the accounts you name.

  4. Apply

    Each account is written in its own transaction and announced with account.connected. A JSON report records every account and template.

  5. Accounts start syncing

    Nothing is refreshed against Google or Microsoft during the import. workwae checks each account on its first sync, which ends with account.initialized.

  6. Reconnect the rest

    Accounts reported as needing a reconnect sign in again through hosted connect. Then you point your app at the workwae API.

What carries over

Accounts, apps and templates

A refresh token works only with the client that issued it, so your OAuth apps move with the same client id and secret.

In EmailEngine In workwae
OAuth2 account, API mode A Gmail or Microsoft Graph account (Microsoft cloud taken from the app), with its refresh token, a still valid access token and the granted scopes
OAuth2 account, IMAP mode An IMAP account using XOAUTH2 on the provider's servers
Password account An IMAP account; EmailEngine's copy becomes appendSent
OAuth2 app A tenant OAuth app with the same client id and secret, or an existing matching one; an app holding our platform client id maps to the platform app
Gmail service account app A Google domain-wide delegation connection with the same key and scopes
Outlook application app A Microsoft app-only connection for the same directory
Shared mailbox opened through another account's grant A shared mailbox of that account, when its grant has Mail.ReadWrite.Shared
Account name displayName; calendar and contacts turn on only if the grant covers them
Stored templates Public templates become shared templates, account templates follow their account; Markdown templates stay Markdown

Listed as not carried over

Every other EmailEngine field is named per account in the plan and the report, so nothing is dropped silently:

  • Folder path and folder overrides
  • Webhooks and notifyFrom
  • Proxy and TLS options
  • Locale and time zone

Reported as needing a reconnect

These accounts are reported, the run goes on, and they sign in again afterward:

  • Accounts whose OAuth app is gone or uses the old settings-based configuration
  • Credentials from EmailEngine's authentication server
  • IMAP logins with integrator-supplied access tokens
  • Shared mailboxes opened with their own grant, and grants that only send
  • Service account apps without a key file, and Mail.ru accounts
The import

Careful by default

What keeps the import safe, and what stops it before anything is written.

  • Dry run first

    Nothing is written to your workspace until you have seen the plan and approved it.

  • Stops on a wrong secret

    If the secret can't decrypt your stored credentials, the import stops before writing anything.

  • Only the accounts you choose

    Move everything at once, or a few named mailboxes first and the rest later.

  • Safe to rerun

    An account already in the workspace, by provider and address or by its EmailEngine id, is skipped. Imported templates are skipped the same way.

  • Plan limits respected

    An account refused by your plan's account limit is reported, and the run goes on with the others.

  • Template names kept

    A template whose name is already taken gets its EmailEngine id appended instead of replacing yours.

  • Read-only on your side

    The import reads EmailEngine's Redis and changes nothing in it, so your EmailEngine keeps running until you switch over.

FAQ

Questions teams ask

Will our users have to sign in again?

Not for accounts that carry over. Their refresh tokens, passwords and granted scopes move with them, and your OAuth apps keep the same client id and secret, so the existing grants keep working.

Only the accounts the plan reports as needing a reconnect sign in again, through hosted connect. You see the full list in the dry run before anything is written.

Is there downtime?

The import only reads EmailEngine's Redis, so EmailEngine keeps serving your app while it runs. Each account starts syncing in workwae once it is written, and you switch your app over when you are ready.

You can move a few mailboxes first and the rest later. Message ids are new in workwae, and each account's first sync builds its index before change events start.

What happens to our webhooks?

EmailEngine webhook settings are not carried over; the plan lists them per account. You add webhook endpoints in workwae, filtered by event type or account, and verify deliveries with the SDK's parseWebhook.

Each imported account emits account.connected, and its first sync ends with one account.initialized. The change feed carries the same events if you would rather poll. See the webhooks guide.

Do our own OAuth apps keep working?

Yes. Each EmailEngine app becomes a tenant OAuth app with the same client id and secret, which existing refresh tokens need. To connect new accounts through the same app, add workwae's callback URL to it.

Accounts on your own Google app are polled until you set up Gmail push for that app; the connect guide covers both.

Do calendars and contacts come along?

Calendar and contacts sync turn on for an imported account only when its grant already covers them. Otherwise they stay off until the account grants more access.

Which EmailEngine versions are supported?

EmailEngine 2.x. The import reads its Redis storage directly and needs the EENGINE_SECRET the instance runs with.

How do we share the secret and Redis access safely?

Through a one-time encrypted link we send you, never by email or chat. We use them only to run the import and delete them when it finishes. Closing that Redis access on your side afterwards is a good idea too.

Who runs the import?

Our team. workwae is a hosted service, so the import runs on our side: a dry run, a review with you, then the import. You don't install or run anything.

Ready to move off EmailEngine?

Tell us about your EmailEngine setup and we will plan the import with you.