Skip to main content

Migration Guide — WordPress → Association App Platform

Who this is for: Associations currently running their site on WordPress with the 2DC Association App WordPress Plugin installed, and migrating to the new Association App Platform (Spring Boot backend + React Admin Dashboard + updated mobile app).


What Is Changing

ComponentBefore (WordPress)After (New Platform)
Backend / APIWordPress REST API (/api/v1/)Spring Boot API (new URLs)
Admin interfaceWordPress Admin (/wp-admin)Association Dashboard (web app)
DatabaseWordPress MySQLPostgreSQL
AuthenticationCustom JWT + FirebaseJWT with 1-hour access tokens + 30-day refresh
File storageWordPress Media LibraryCloud storage (GCS / S3 / Local)
Multi-tenancySingle site per WordPress installMultiple organisations on one platform
Member directoryWordPress user listOrganisation Members page
Eventsevent custom post typeEvents module
Documentsdocument, policy, recall post typesDocuments module
Push notificationsFirebase connected via pluginFirebase connected via platform settings

What stays the same

  • All your existing members, events, documents, conferences, companies, articles, and notifications are migrated
  • Member profiles are preserved (name, email, phone, job title, address, certifications)
  • The mobile app continues working during the migration window — it switches APIs after the cutover update is published
  • Document folders (taxonomy) are recreated automatically
  • Sync is idempotent — running it more than once does not create duplicates

What does not migrate

  • Member passwords — WordPress password hashes cannot be used in the new platform; members set a new password via email
  • WordPress page content (standard pages, blog comments, widget configurations) — only association-specific content types are migrated
  • WordPress user roles beyond membership status — roles are mapped to membership status (see Member mapping)
  • Plugin-specific shortcodes and blocks embedded in pages

Migration Phases

Phase 1  ──▶  Prepare WordPress (update plugin, get sync key, backup)
Phase 2 ──▶ Set up your new platform account
Phase 3 ──▶ Connect WordPress to the platform (Connector wizard)
Phase 4 ──▶ Run the Initial Import (full data migration)
Phase 5 ──▶ Verify your data
Phase 6 ──▶ Migrate member accounts (send password reset emails)
Phase 7 ──▶ Coordinate mobile app update with 2DC
Phase 8 ──▶ Cutover (go live)
Phase 9 ──▶ Post-migration cleanup

Each phase is reversible until Phase 8. You can safely pause between any two phases. The WordPress site continues operating normally throughout.

Estimated total time: 2–4 hours of active work, spread over 1–2 weeks.


Phase 1 — Prepare WordPress

1.1 Update the Plugin

Confirm you are running plugin version 1.2.0 or later.

  1. Go to WordPress Admin → Plugins → Installed Plugins
  2. Find 2DC Association App and check the version number
  3. Click Update Now if an update is available
  4. Confirm the plugin is active (not deactivated)

The sync API uses pretty permalinks. If your WordPress site does not use them:

  1. Go to WordPress Admin → Settings → Permalinks
  2. Select Post name
  3. Click Save Changes

1.3 Get the Sync API Key

  1. Go to WordPress Admin → Settings → Association App
  2. Open the Sync tab
  3. Copy the Sync API Key — store it somewhere safe (you will paste it in Phase 3)
  4. If no key exists, click Generate Key and Save Settings

1.4 Verify Sync Endpoints Respond

Open each URL in a browser (replace your-site.com). A 401 response is correct — it means the endpoint exists and is protected by the key:

GET https://your-site.com/api/v1/sync/ping
GET https://your-site.com/api/v1/sync/members
GET https://your-site.com/api/v1/sync/events
GET https://your-site.com/api/v1/sync/articles
GET https://your-site.com/api/v1/sync/documents
GET https://your-site.com/api/v1/sync/conferences
GET https://your-site.com/api/v1/sync/companies
GET https://your-site.com/api/v1/sync/notifications

If you receive a 404, the plugin is not registering its routes. Fix: Settings → Permalinks → Save Changes.

1.5 Take a Full Backup

Do not skip this step

A backup is your only rollback safety net. Export both the database and all uploaded files. Download the backup to your local machine — not just to the server.

Recommended tools:

  • UpdraftPlus (free version is fine)
  • Your hosting control panel (cPanel, Plesk, Kinsta backup, WP Engine backup)
  • mysqldump on the command line for the database

Phase 2 — Set Up the New Platform Account

  1. Open the Association Dashboard URL provided by your 2DC account manager
  2. Log in with the temporary credentials and set a permanent password
  3. Go to Organisation → Settings → General and confirm your organisation name and slug
  4. Go to Organisation → Branding and upload your logo, set your colours, and upload a favicon
  5. Go to Organisation → Settings → Mail Settings and configure your email (SMTP or leave as platform default for now)

Phase 3 — Create the WordPress Connector

The Connector is the bridge between your WordPress site and the new platform. Creating it does not start any sync — it just saves the configuration.

  1. In the dashboard sidebar, click Connectors
  2. On the Integration Hub page, find WordPress and click Connect
  3. Complete the 5-step wizard:

Step 1 — Basic Info

FieldValue
Connector Namee.g. My Association WordPress (any descriptive name)

Step 2 — Authentication

FieldValue
WordPress Site URLhttps://your-wordpress-site.com.au (exact URL, no trailing slash)
Sync API KeyThe key from Phase 1.3

Click Test Connection — all 5 diagnostic checks must pass before continuing.

Step 3 — Sync Settings

Enable the entity types you want to migrate. Recommended: enable all:

  • Articles (WordPress posts / news)
  • Members (WordPress users)
  • Events
  • Documents (includes Policies and Recalls)
  • Conferences
  • Companies
  • Notifications

Set Sync Interval: 60 minutes (for ongoing sync after migration).

Enable Copy Images and Copy Document Files so that files are stored in platform storage and remain accessible if WordPress is later decommissioned.

Step 4 — Field Mapping

The default field mappings work for the standard plugin setup. Only change these if your WordPress site uses custom meta keys different from the plugin defaults.

Review the mappings (see Data Mapping Reference below for full details) and click Next.

Step 5 — Review & Connect

Confirm the settings and click Connect. The connector is created.


Phase 4 — Run the Initial Import

The Initial Import is a one-time bulk operation that imports all your existing WordPress data.

This can only be run once

After the Initial Import completes, the button is permanently disabled. Subsequent syncs use Full Sync or Incremental.

  1. Go to Connectors → [your WordPress connector]
  2. Click Run Initial Import
  3. Confirm in the dialog

The import processes entities in this order:

  1. Articles (WordPress posts)
  2. Members (WordPress users)
  3. Events
  4. Conferences
  5. Companies
  6. Documents
  7. Notifications

Watch the Live Sync Panel — it updates every 2 seconds with the current phase, records processed, and any errors.

What to expect

Data typeImport behaviour
ArticlesImported as news articles. Status mirrors WordPress (publishPUBLISHED, draftDRAFT). Original WordPress publish date is preserved in sourceCreatedAt. HTML content is parsed into structured content blocks.
MembersImported with all profile fields. Status mapped from WordPress role (see mapping table). Passwords are NOT migrated.
EventsImported with full location and date details. Start/end timestamps converted from WordPress Unix milliseconds to ISO-8601 UTC.
ConferencesImported as events with type CONFERENCE. Same fields as events.
DocumentsMetadata imported (title, folder, file URL). If Copy Document Files is enabled, the actual files are downloaded to platform storage. Otherwise only the URL is recorded.
CompaniesImported with description, contact details, and logo (if image mirroring enabled).
NotificationsImported with type and link data.

The import is idempotent — if you re-run it (via Full Sync), records are matched by their WordPress ID (externalId) and updated rather than duplicated.


Phase 5 — Verify Your Data

Before cutting over, verify that data has migrated correctly. Work through this checklist:

Members

  • Total member count matches your WordPress user count (check WordPress Admin → Users → All Users count)
  • Spot-check 5–10 members: open each in the platform and verify name, email, phone, membership status
  • Members with association-member role show as ACTIVE
  • Members with pending-review role show as PENDING

Events

  • Upcoming events appear with correct title, dates, and location
  • Past events are present and correctly marked
  • Virtual events have isVirtual: true
  • Event date/times are in the correct timezone (see Timezone note)

Articles

  • Article count matches WordPress post count
  • Published articles show as PUBLISHED
  • Featured images load correctly (if image mirroring was enabled)
  • Article content displays without broken layout

Documents

  • All folders were created (matching your WordPress taxonomy)
  • Documents are inside the correct folders
  • Download a document to confirm the file is accessible

Sync errors

  • Go to Connectors → [connector] → Sync Jobs → [import job] → Logs
  • Review all FAILED entries and resolve each one before proceeding

Timezone note

WordPress stores event start/end times as Unix milliseconds in post meta, in the local timezone of the WordPress server. The platform converts these to UTC using the WordPress Timezone setting in the connector. If events appear offset by several hours, update the timezone setting in the connector (e.g. +10:00 for AEST) and re-run a Full Sync.


Phase 6 — Migrate Member Accounts

Members are imported but cannot log in until they set a new password. This is by design — WordPress password hashes are not compatible with the new platform.

Send password reset emails

  1. Go to Organisation → Members
  2. Click Actions → Send Password Reset to All
  3. Confirm — each member receives an email with a secure link to set their new password

Best practice: Send to a small group first (your committee or board) to verify the email flow and the member experience before sending to all members.

Member communication

Send members a notice before cutover explaining:

  • The association is upgrading its platform
  • They will receive an email to set a new password — they must do this to continue using the app
  • Their membership, events, documents, and history are all preserved
  • Include the cutover date and what to do if they need help

Phase 7 — Mobile App Update

Contact your 2DC account manager to request the app configuration update. Provide:

  • Your new platform API URL
  • Your Organisation Slug (shown in Organisation → Settings → General)
  • Confirmation that the Initial Import is complete and data is verified
  • Your target cutover date

The 2DC team will prepare and submit a new app version. After App Store / Google Play review (typically 1–3 days), the update is available for members to install.

API endpoint changes (for technical reference)

The mobile app communicates with a new set of API endpoints after the update:

FeatureOld WordPress endpointNew platform endpoint
LoginPOST /api/v1/authPOST /api/auth/org/login
RegisterPOST /api/v1/auth/signupPOST /api/auth/org/register
Refresh tokenPOST /api/v1/auth/refreshPOST /api/auth/refresh
User profileGET /api/v1/userGET /api/orgs/{orgId}/users/{userId}
Events listGET /api/v1/eventsGET /api/orgs/{orgId}/events
DocumentsGET /api/v1/documentsGET /api/orgs/{orgId}/documents
MembersGET /api/v1/membersGET /api/orgs/{orgId}/users
Articles/NewsGET /api/v1/postsGET /api/orgs/{orgId}/news
NotificationsGET /api/v1/notificationsGET /api/notifications

Phase 8 — Cutover (Go Live)

Pre-cutover checklist
  • Initial Import completed with no unresolved errors
  • All data verified (members, events, documents, articles)
  • At least 5 members (including you) have logged in with their new passwords
  • Mobile app update is published and you have tested it on both iOS and Android
  • Firebase push notifications are configured and tested
  • Email configuration is verified (send a test email from platform settings)
  • Member communication sent
  • Maintenance window communicated to members

Recommended maintenance window: Weekend night, 10 PM – 2 AM local time.
Expected member downtime: 15–30 minutes (time to install the app update).

Cutover steps

  1. Run a final incremental sync — Connectors → Run Incremental Sync. This catches any last-minute WordPress changes.

  2. Enable Read-Only Mode in WordPress — WordPress Admin → Settings → Association App → Sync → toggle Read-Only Mode ON. This prevents content edits in WordPress from being overwritten after cutover.

  3. Publish the mobile app update — Confirm with 2DC that the app update is live on App Store and Google Play.

  4. Notify members — Send the "We are now live!" message with instructions to update the app and set their new password if they haven't already.

  5. Monitor — Watch the platform dashboard for login activity and member support queries.


Phase 9 — Post-Migration Cleanup

Week 1

  • Monitor Audit Logs daily (Platform → Audit Logs)
  • Watch for member support queries — most will be password-reset related
  • Leave the WordPress connector active with auto-sync running in case content updates are still being made in WordPress

After 30 days

  • If your team has moved fully to managing content in the new platform, disable the WordPress sync endpoints — WordPress Admin → Settings → Association App → REST API → Disable
  • Optionally pause or delete the connector if WordPress sync is no longer needed

Ongoing (optional)

  • If your team prefers to continue managing some content in WordPress (e.g. articles/news), leave the connector enabled with auto-sync. Changes in WordPress will sync automatically at your configured interval.

Data Mapping Reference

Member field mapping

WordPress sourceWordPress meta keyPlatform fieldNotes
User emailuser_emailemail
User metafirst_namefirstName
User metalast_namelastName
User fielddisplay_namedisplayName
User metamobile_numberphoneNumber
User metajob_titlejobTitle
User metacompany_organizationcompany
User metabirthdaydateOfBirth
User metastreet_addressaddressLine1
User metacitycity
User metazippostalCode
User metais_certifiedisCertifiedBoolean
User metarenewal_datemembershipRenewalDate
User metais_exclude_listingisExcludedFromListingBoolean
User fielduser_registeredcreatedAt

WordPress role → membership status:

WordPress role(s)Platform membership status
association-memberACTIVE
pending-reviewPENDING
administratorADMIN
Any other roleINACTIVE

Article / News field mapping

WordPress sourcePlatform fieldNotes
post_titletitle
post_contentcontentHTML parsed into content blocks
post_excerptsummaryFalls back to first 30 words of content if empty
post_nameslugURL slug
post_statusstatuspublishPUBLISHED, otherwise DRAFT
Featured imagefeaturedImageUrlFull-size image URL
display_name (author)authorName
user_email (author)authorEmail
Category namescategoryFirst category name is used
Tag namestagsAll tags as an array
post_date_gmtsourceCreatedAtOriginal WordPress publish date preserved
post_modified_gmtsourceUpdatedAt

Event field mapping

WordPress meta keyPlatform fieldNotes
post_titletitle
post_contentdescription
post_excerptexcerpt
_event_date_time_startstartDateUnix ms → ISO-8601 UTC
_event_date_time_endendDateUnix ms → ISO-8601 UTC
_event_all_dayisAllDayBoolean
_event_is_virtualisVirtualBoolean
_event_costcost
_event_urlregistrationUrl
_location_addresslocation.address
_location_citylocation.city
_location_statelocation.state
_location_zip_codelocation.postalCode
Featured imagefeaturedImageUrl
_event_attending_countattendingCount
post_date_gmtcreatedAt
post_modified_gmtupdatedAt

Event status mapping:

WordPress post_statusPlatform status
publishPUBLISHED
draftDRAFT
privateDRAFT (review required)
trashNot imported

Conference field mapping

Same as events, with eventType: 'CONFERENCE' set automatically. Conference-specific meta keys:

WordPress meta keyPlatform field
_conference_date_time_startstartDate
_conference_date_time_endendDate
_conference_all_dayisAllDay
_conference_is_virtualisVirtual
_conference_urlregistrationUrl
_conference_costcost
_location_*location.*

Document field mapping

Covers three WordPress post types: document, policy, recall

WordPress sourcePlatform fieldNotes
post_titletitle
_document_file (or _policy_file, _recall_file)fileUrlFile attachment URL
File extensionmimeTypeDetected automatically from URL
Taxonomy term (document_folder, policy_folder, recall_folder)folderFolder name and hierarchy
post_statusstatuspublishPUBLISHED
post_date_gmtuploadedAt
post_modified_gmtupdatedAt

Document folder mapping:
WordPress document folder taxonomy terms are mapped directly to platform document folders. Folders are created automatically if they don't exist. Documents with no taxonomy are placed in a root folder named after the post type (Document / Policy / Recall).

Company field mapping

WordPress sourcePlatform field
post_titlecompanyName
post_contentdescription
_company_urlwebsite
_company_phonecontactPhone
_company_emailcontactEmail
Featured imagelogoUrl
post_statusstatus

Notification field mapping

WordPress sourcePlatform fieldNotes
post_titletitleHTML entities decoded
post_excerptcontentHTML entities decoded
post_datedateFormatted as Mon, Jan 1, 2024
_notification_typetype
Link metalinkDepends on notification type (see below)

Notification link types:

WordPress _notification_typePlatform link structure
post-type{type, id, slug} from linked post
external-link{type: 'external-link', url: '...'}
website-page{type, slug}
notificationnull (no link)

Rollback Plan

If you need to roll back after completing Phase 8:

  1. Disable Read-Only Mode — WordPress Admin → Settings → Association App → Sync → Read-Only Mode OFF
  2. Re-enable the REST API if it was disabled
  3. Contact 2DC to roll back the mobile app to point to the WordPress API
  4. Notify members of the temporary rollback and expected timeline for the next cutover attempt

Your database backup from Phase 1 is the ultimate safety net for the WordPress side. The new platform data is not affected by a rollback.


Troubleshooting

ProblemSolution
Test Connection fails (step 1)Check HTTPS, no trailing slash on URL, site is publicly accessible
Test Connection fails (step 4 — key invalid)Re-copy key from WordPress Admin → Settings → Association App; regenerate if needed
Sync endpoint returns 404Plugin not active, or permalinks not flushed — Settings → Permalinks → Save Changes
Members imported as INACTIVE unexpectedlyCheck WordPress user roles — only association-member maps to ACTIVE
Duplicate email error during member syncFind and merge the duplicate in Organisation → Members
Documents imported but files 404Enable "Copy Document Files" in connector settings and re-run sync
Events missingConfirm they are publish or draft in WordPress (not trash)
Event dates wrongSet correct WordPress Timezone in connector settings and re-run Full Sync
Articles have broken image URLsEnable image mirroring in connector and re-run sync
Sync stuck in RUNNING for 1+ hourOpen the sync job and click Force Stop; check Diagnostic Panel; re-trigger
Member cannot log in after migrationSend password reset from Members page; verify email config in Settings
Push notifications not workingVerify Firebase Server Key (not Web API Key) in Platform → Settings
Sync API key error 503Key not generated in WordPress — go to Settings → Association App → Generate Key

For the full troubleshooting guide, see Connector Troubleshooting.


Support

ChannelUse forResponse time
In-app chat (dashboard)Quick questions, connector issues< 4 hours (business hours)
[email protected]Non-urgent issues, data questions< 1 business day
Phone (account manager)Migration day support, critical issuesImmediate (scheduled)

To book live migration support, contact your account manager at least 3 business days before your planned cutover date.