Version coverage, answered before you ask
Which source versions the target platform's own importer reads is published on this page, with the document it came from and the day it was read. Where your version falls inside that list the migration is a bounded import; where it falls outside, it is conversion work built for your schema. Both are achievable and they are not the same project, which is why the answer is given before anything is scoped.
See the coverage matrix →Source audit and version identification
Establishing which platform and which version, from the installation, not from what anyone believes. Extensions, direct modifications and undocumented customisations are catalogued, because they determine what can be converted and what has to be decided.
Importer compatibility assessment
Determining plainly whether the source falls inside the target platform's own importer coverage. That answer is given in writing before anything is scoped, because it is the difference between a supported import and custom conversion work.
Custom importer development
Where the source falls outside coverage, building the conversion for that schema, including the legacy structures a general-purpose importer cannot know about. This is genuinely different work from running a supported import, and it is priced and sequenced as such.
Content and identity mapping
A written decision for each source construct: forums to nodes, threads to threads, groups to permission sets, private messages, subscriptions, polls, attachments, and an explicit outcome for the structures with no direct equivalent.
Permission and membership reconciliation
Accounts, primary and secondary group memberships, moderator assignments and custom permission sets mapped onto the target's model. Years of permission configuration are the least visible thing to get wrong and the most disruptive when it is.
Redirect strategy
A complete inventory of indexable URLs and a rule for each, activated with the new platform rather than after it. The gap between the two is where search visibility is lost.
Rehearsal and reconciliation by counting
Repeated runs against a copy of the real database, with counts compared per content type between source and destination. A migration without reconciliation has an unknown error rate, which is not a defensible position to take a community into.
Cutover and post-migration verification
A rehearsed single cutover with a tested rollback and a defined trigger, followed by discussion, messaging, attachments and permissions exercised with real data: plus search signals monitored after the move.