RFC 118: Cloud-to-cloud identifier mapping

RFCs are a way for Atlassian to share what we’re working on with our valued developer community.

It’s a document for building shared understanding of a topic. It expresses a technical solution, but can also communicate how it should be built or even document standards. The most important aspect of an RFC is that a written specification facilitates feedback and drives consensus. It is not a tool for approving or committing to ideas, but more so a collaborative practice to shape an idea and to find serious flaws early.

Please respect our community guidelines: keep it welcoming and safe by commenting on the idea not the people (especially the author); keep it tidy by keeping on topic; empower the community by keeping comments constructive. Thanks!

Project Summary

Atlassian is planning to allow customers to easily migrate between Atlassian’s clouds, including by migrating Forge app data between clouds on behalf of app partners. This requires a way for app partners to help us find and map identifiers that change during a cloud-to-cloud migration. This RFC is focused on the best way to do that.

  • Publish: 11th November 2025

  • Discuss: Until the 25th of November 2025

  • Resolve: Estimated to be by the 5th of December 2025

Problem

Atlassian is soon going to start supporting migrations between Atlassian Clouds. Specifically, we support three clouds:

  • Atlassian Commercial Cloud - the first and most familiar cloud.

  • Atlassian Government Cloud - our FedRamp Moderate cloud.

  • Isolated Cloud - for customers in highly regulated industries who need their own cloud isolated from others.

Cloud-to-cloud migrations are migrations between these clouds - for example, if a customer needs to move from Commercial to an Isolated Cloud.

We would like to ensure that customers have a wide choice of third-party apps that they can use in any cloud, and that it is easy for app partners to retain their customers through a cloud-to-cloud migration. Cloud-to-cloud Migration therefore includes app migration in its scope.

Because Isolated Cloud customers need strict control over data leaving their cloud, we’re focusing on supporting Runs on Atlassian (RoA) Forge Apps. Cloud-to-Cloud is therefore scoped to migrating Forge Apps between clouds (with a Connect-to-Forge migration within the same cloud first, if needed).

As a general principle, Atlassian will move the data for cloud-to-cloud migrations for customers on behalf of app partners. However, we are unfortunately not able to guarantee that all identifiers for entities will remain consistent between clouds. As an App Partner writing a Runs on Atlassian Forge app, you have access to Forge Storage(SQL, Key-Value Pairs and Object Store), and might choose to store entity identifiers in Forge Storage. You might also choose to store identifiers in Forge Entity Properties. Atlassian does not dictate the format of data with app partner controlled content, and so we wouldn’t be able to automatically map this data without help from app partners. This RFC seeks your input on the best interface for providing that input to Atlassian.

Proposed Solutions

This is an early stage RFC - we want to learn what would work best for our ecosystem partners. We have two proposed solutions and would love your input on which would work best for your business. At this stage, we only provide a sketch of what each interface might look like, and will refine it further once we’ve decided which path(s) to take.

Solution A: Simpler with controlled power

The first solution would be for app partners to provide information about how Atlassian can find and substitute identifiers.

App Partners already provide a Forge manifest file, in YAML, describing their app. We’d add a new optional module that provides information needed for migrations to proceed.

App partners would provide a list of identifier locations. They’d firstly specify which SQL column or key or value the identifier resides in, and what type of identifier it is. They’d need to refrain from putting identifiers in Forge Objects (i.e. Object Store would not be supported). There would be two ways to specify how to do the transform:

  • Regular expressions (limited to the RE2 syntax - no backtracking). Every regex would include a capture group around the identifier, and every non-overlapping match would have the capture group mapped, and the string put back together.

  • JsonPath - for JSON only. The JsonPath would specify how to find the JSON node, which is then transformed.

The actual manifest would look something roughly like this:

{
...,
"modules": {
...
"migrationMappings": [
{
"type": "ForgeSQL",
"table": "mytable",
"column": "mycolumn",
"transformation": {
"namespace": "identity:user",
"subType": "jira.userkey",
"regex": "([0-9]+)(?:,|$)"
}
},
{
"type": "ForgeKVS",
"matchKey": "^user-record-.*$",
"transformKey": {
"namespace": "identity:user",
"subType": "jira.userkey",
"regex": "^user-record-(.*)$"
}
},
{
"type": "ForgeKVS",
"matchKey": "^user-record-.*$",
"transformValue": {
"namespace": "jira:issue",
"jsonpath": "$.jira.favourite-issue"
}
},
{
"type": "ForgeEntityProperty",
"entityType": "issue",
"matchKey": "^most-closely-related-issue$",
"transformValue": {
"namespace": "jira:issue",
"regex": "^\s*([^\s]+)\s*$"
}
}
]
...
}
}

We would impose an upper limit on the number of transformations allowed to be defined (i.e. how many columns, not how many rows).

There are some benefits to this simpler solution:

  • Atlassian would do all the transformations as we migrate base data for customers, rather than needing to invoke customer-defined compute to transform records. This would reduce costs for Atlassian (when below the free tier) and for app partners (when above the free tier), and allow for a much faster migration of data for customers.

  • It is likely less effort for app partners to define.

However, the downside is that app partners might encode data in Forge Storage in a format that cannot be transformed using regexes or JsonPath. For example, data could be in a binary format. App Partners could work around this problem by not using those formats, but in some cases, that might mean using more storage.

Solution B: More complex, more powerful

Alternatively, we could let app partners define a Forge function that’s invoked with a batch of records, which could call an API to retrieve mappings. App Partners would then transform and save the records into Forge Storage.

This approach would give more flexibility to app partners, at the expense of being harder to implement. For large migrations, this could mean a lot of function calls, which might get expensive for app partners (once compute is monetised).

Allowing both options

If most app partners need the simplicity, but some would benefit from the more powerful solution, we could consider implementing both, as a choice for app partners on an app-by-app basis. Atlassian would most likely prioritise the option that provides the most value to our customers first.

Asks

While we would appreciate any feedback you have to this RFC, we’re especially interested to hear:

  • Do you think Solution A would work for your app, given how you plan to use of Forge Storage?

  • Which option would you prefer to implement for your app(s)?

  • If Solution A isn’t enough, are there any extensions we could make to it that’d make it work for you, without bringing the full complexity of Solution B?

  • Do you expect your Forge app will store identifiers to Atlassian objects in any vendor controlled / free text place apart from Forge SQL, Forge KVP, and Entity Properties? If so, where else would you store them?

  • Is putting the mappings in the manifest the most convenient option for you, or would another option (e.g. editing them through the developer console) be better?

Absolute madness to push this complexity onto developers. Do better.

Cloud-to-cloud migrations should happen automatically with zero thought or actions required by developers.

It’s your platform that you’re forcing us to use. Don’t make it as painful as possible to use it.

3 Likes

I don’t fully understand what identifiers are in scope for this RFC and it doesn’t seem to have been described clearly. Furthermore, the discovery of the identifier mappings would likely need to come from Atlassian platform, which the apps do not have and cannot provide, and how the mapping could be discovered doesn’t seem to have been addressed by the RFC.

If I’m to support Cloud-to-Cloud migration for our apps, there are a few identifiers come to my mind - all of them are identifiers to Atlassian entities - that requires migration/mapping:

  • Confluence Page/Blogpost IDs
  • Confluence Space IDs
  • Confluence content property ID/Names
  • Jira Issue ID/Keys
  • Jira Project ID/Keys
  • Jira issue property names

None of these entities are under our apps’ control and we’d need Forge/Atlassian to provide a method to retrieve the mapping between the source and destination cloud instances. For example, for any given Confluence page in Cloud A with ID1, what’s the ID for the same page in Cloud B. Without such mapping information, there is simply no way for the app developer to specify the data transformation.

I might be missing the point. Maybe that’s exactly what you meant by transforming the “Entity IDs” in Solution A? The example transformation definition might be the attempt to define mapping?

"transformation": {
"namespace": "identity:user",
"subType": "jira.userkey",
"regex": "([0-9]+)(?:,|$)"
}

If yes, then the scope of what entities/subtypes and what matching/transformation can be done need be more detailed for me to assess the feasibility.

And I re-read again, in Solution B, it says:

we could let app partners define a Forge function that’s invoked with a batch of records, which could call an API to retrieve mappings.

That’s the API for retrieving mapping I was talking about earlier - it’s a key feature and probably should have been highlighted better. Similarly, I’d need read through the API implementation before determine it’s feasibility.

For large migrations, this could mean a lot of function calls, which might get expensive for app partners (once compute is monetised).

This mostly means that the mapping query API needs support bulk query by default to scale - both for Atlassian and for app developers. For example, the API CANNOT require one call for each Confluence page; it has to support querying the mapping for multiple pages within one call, hundreds, if not thousands of pages in one call.

[Edit: a couple of more thoughts below]

I suspect I’d need both Solution A and B (mostly the mapping query API in solution B). I’d also need some API/events to indicate the status of the migration such that my app knows to pause duration the migration and resume afterwards.

4 Likes

Questions:

  • Why can’t the cloudID preserved when migrating cloud to cloud. Or have have a ‘compatibility’ layer on Atlassians that sends the ‘old’ cloudID to an app when it was migrated. (e.g the installation preserves the cloudID)
    • This would be in Atlassians control
    • No danger of bugs in the rewriting of the data. Both mechanisms to rewrite the data are non-trivial for some apps.
  • Good question above from Shu. What happens to other identifiers?

Otherwise: For the apps I’m working on, we luckily have mostly configuration data only. Must likely our policy will be: No migration and please reconfigure the app in the new cloud instance.

2 Likes

What about cloud identifiers in entity properties, not just Forge SQL? Since entity properties are necessary for displayConditions, we have to support them for any cloud to cloud migrations.

Also, is Forge KVS going to be supported as well?

Edit: Both seem to be considered, after re-reading the manifest example more closely :slight_smile:

1 Like

An approach where identifiers simply don’t change seems way better.

Why do identifiers have to change when an implementation detail within your infrastructure changes? Perhaps that is the better thing to solve.

Any migration solution here will be fraught. As new entity types start to exist you will need to add mappings for them. And you won’t because you will have moved onto the next thing. This feature creates maintenance work for you and for us and makes future bugs likely.

1 Like

Bit off-topic, but:

JSON? Looking at my own manifest I see it’s a YAML file. Also see https://developer.atlassian.com/platform/forge/manifest/ where it says “The manifest is a YAML file (manifest.yml)”. Or do I miss the news that we have the option now to have the manifest as a JSON file?

On-topic:
Before I can give more detailed feedback, I need to know more about the context. So: About what kind of migrations are we talking about? I see 3 kinds:

  • Complete move: Move cloud site to another platform (Commercial, Gov, Isolated). Like a complete backup and restore. → No product-specific IDs change
  • Move and merge: Merge one cloud site into another, already existing cloud site. Like moving Jira/Confluence spaces from one site to another. → Product-specific IDs do change.
  • Partial move: Only move parts of a cloud site. Either as a new cloud site, or into an existing cloud site. → I guess in both cases IDs will change.

For our app, in the scenario where no product-specific IDs change, our app most probably does not need to do any data migration.
In the other scenarios, product-specific IDs are affected; there I’m with @Shu in that we’d need Forge/Atlassian to provide a method to retrieve the mapping.

2 Likes

Hi @AndrewMiller1 ,

In your example you mention the move to isolated cloud for regulated customers. These customers very often have strict archival and immutability requirements for their data.

If the move to another cloud changes their data, most likely they will not be in compliance. Have you got feedback from these customers as how they would like to see a migration happening, and if it is acceptable if e.g. links (i.e. identifiers) get rewritten and if content changes are ok with a migration?

Thank you @AndrewMiller1 for the RFC.

There are two additional questions that come to mind when reading the RFC:

  • will Atlassian be providing partners access to Government Cloud & Isolated Cloud test instances? Especially for solution A, it can take some time to find the right regex. Having the ability to do QA ourselves seems pretty crucial for any migration feature
  • what happens to apps that do not support cloud-to-cloud migration?

With regard to the implementation:

The problem with this RFC is that you are making us choose between a rock and a hard place. Solution A is anything but simpler, as there will be edge cases that are not taken into consideration here (partners are very creative). There is no silver bullet when it comes to data migration. It is one of the reasons Atlassian has stayed very, very quiet about how partners are supposed to migrate data from Connect to Runs on Atlassian Forge apps.

Data migration is difficult. Always has, and always will be. The time Atlassian will spent on a one-size-fits-all solution with Solution A is going to be frustrating and it will create headaches for partners, customer and Atlassian alike, with a lot of contentious support requests.

It might help trying to solicit feedback from partners with regard to JCMA and CCMA. Atlassian might learn a lot about how frustrating data migration can be for partners. There is a reason why there is a whole solution partner industry involved in migrating from DC to Cloud, incl. writing custom scripts & solutions for data migration.

One the other hand, the more appropriate Solution B, where the Marketplace Partner is in control will never be cost efficient for partners, which will result in higher pricing for Government Cloud and Isolated Cloud versions of apps even though migration is a one-time effort. It is surprising that Atlassian is willing to foot the bill for Solution A, but not for Solution B.

It would be great if Atlassian would be willing to create a special type of Forge module for cloud-to-cloud migrations which are excluded from Forge usage costs. This would make Solution B more viable for Marketplace Partners. Given that Atlassian has already indicated that it accepts a cost for migrating from cloud-to-cloud, it makes sense to extend this offer to Solution B as well.

6 Likes

Hi @AndrewMiller1 ,

Thank you for this RFC, it’s quite something.

As others pointed out already, data migrations are hard, and from my own experience they are best to be avoided. So of course, our preferred solution would be Secret Solution C – No Identifiers Change. But as you ruled that out, let’s see how the two proposed solutions would affect us.

Do you think Solution A would work for your app, given how you plan to use of Forge Storage?

I really cannot say, tbh. Depending on the app we do store some identifiers, so how feasible Solution A would be depends on what identifiers are affected. Is it account ids, content ids, issue ids? Do you already have a list of identifiers that will need to be mapped?

I also do not understand how the mapping would happen in Solution A: Why would the vendor provide the regex to find an identifier – wouldn’t Atlassian know which identifiers need to be replaced? Or is this meant to help Atlassian find a place where the identifier is that needs replacement?

Which option would you prefer to implement for your app(s)?

We would obviously prefer to not implement either of these two solutions. If we had to, I would likely opt for Solution B, as that one seems like it will be easier to test. The downside being, that we will incur cost – potentially a lot of costs as you already said. But, as we do not know which identifiers might change and how the API looks that we’d need to work with, it is impossible for us to give a preference.

Is putting the mappings in the manifest the most convenient option for you, or would another option (e.g. editing them through the developer console) be better?

Putting mappings in the manifest is not really convenient, I’d prefer it if we could put those mappings in a separate file, like we can already do with Rovo agent prompts. Also, as @AndreasEbert already mentioned, since when do we have JSON manifests in Forge?

To wrap up, I am worried that this would introduce risks, instability and bugs into our products; the RFC does not even mention a way to test the migration. And as @remie pointed out already: We will need to test whatever we implement before any code goes live. This goes for either solution. If this went live today as is, we would likely opt-out and ask our customers to reconfigure on the new instance.

3 Likes

I would encourage Atlassian to think slightly larger than just moves between different cloud perimeters. There have already been efforts underway at Atlassian to help vendors deal with backup and restore, as well disaster recovery across cloud sites in the same perimeter, and these all have the same problem with mutated identifiers.

It would be great if the solution you create here could be one-size-fits-all (to avoid having to invent another similar-but-different solution later for cloud-to-cloud moves within the same perimeter).

Even if you are targeting only RoA for phase 1, it would also be helpful if you could think about Forge Remote when designing this feature.

As others have pointed out, option B is effectively mandatory for more complex data types. Option A might be helpful for many apps, but it can never be 100% sufficient.

For large migrations, this could mean a lot of function calls, which might get expensive for app partners (once compute is monetised).

Atlassian controls the entire platform, so how about thinking outside the box here too? Why not make function invocations free for calls generated by migration of customers to another cloud site? It does not seem right to saddle vendors with the cost for events that are outside of their control and for which they will have little visibility (due to the closed nature of Isolated Cloud and the inability to access logs without customer approval). I would guess that migrations can be invoked an arbitrary number of times by the customer when staging a migration, so this could easily lead to extraordinary costs with no notice to the vendor.

Atlassian is presumably making bank on the AGC and Isolated Cloud instances and I find it difficult to envisage that it would be losing money on such a proposition.

6 Likes

@AndrewMiller1 – Thank you for sharing this RFC early, and I’m happy Atlassian is considering Marketplace app migrations as part of the cloud-to-cloud migrations.

To answer your direct questions:

Do you think Solution A would work for your app, given how you plan to use of Forge Storage?

Yes, Solution A would probably work, especially if the constraints are known up front. (Much easier for new apps than existing apps.)

Which option would you prefer to implement for your app(s)?

None of the above (more on that below). Or Solution A if I have to choose.

Do you expect your Forge app will store identifiers to Atlassian objects in any vendor controlled / free text place apart from Forge SQL, Forge KVP, and Entity Properties?

Probably not.

Is putting the mappings in the manifest the most convenient option for you, or would another option (e.g., editing them through the developer console) be better?

In my opinion, the mappings should be part of source control. So, definitely not in the developer console. The manifest or a dedicated configuration file could work.

Now, some general feedback:

My immediate concerns when reviewing the RFC were:

  1. How can I test this initially?
  2. How can I detect regressions as my app evolves?

Here’s the problem in my view: The intended use case is:

  • Fringe: Realistically, how often will one of my customers migrate to/from Government or Isolated Cloud? (Migrating from Server/DC to isolated cloud is much more likely in my opinion.)
  • Complex: If it happens, it will only be the largest customers doing it. And of course, they have the largest and most complex datasets, which will be the most likely to fail during an automated migration.

This means Atlassian is asking us to support a feature that won’t be exercised very often (relatively speaking), but when it is exercised, it had better work right, or it will be a big customer that gets pissed off.

So, if I were to support this use case, I would not only need the ability to test the migration mappings, but I would also need the ability to test them repeatedly as part of my automated regression tests. Otherwise, it will be too risky to support.

Therefore, I would expect:

  1. The ability to provision, seed, and tear down an isolated cloud environment as part of automated testing. (It can be a simulated isolated cloud…just needs to provide valid testing.)
  2. The ability to trigger a migration from a long-lived test environment to the temporary isolated cloud environment.
  3. The ability to force the isolated cloud to change IDs during the migration. (Otherwise, what’s the point?)
  4. The ability to do all that for free. (I won’t pay for yet another cloud site to support testing a fringe case.)

All that being said:

PLEASE DON’T DO THIS!

I’m investing in the Runs on Atlassian platform to avoid this sort of complexity. Atlassian is adding unnecessary risk, which is precisely what ROA is intended to prevent.

4 Likes

Thank you Nathan for your valuable feedback on this - and I absolutely think we should be making things as easy as possible for partners.

In a world where partners have the flexibility to chose how and where to store identifiers, the only way we’d ever entirely get away from partners having to think about mappings would be if identifiers were stable.

Migrations have edge cases like if two customers merge companies, they may merge to one cloud site, but have clashing identifiers. Any non-UUID identifier is unfortunately going to have this problem, and moving towards only using UUIDs for any stored identifier would also be a significant change for partners.

The hope with Solution A is that it would allow app partners to define once how to find the identifiers, and have Atlassian do all the work. I’d welcome any suggestions you have on how we could solve this problem, while reducing the burden on partners.

Thank you for your detailed input @Shu!

I don’t fully understand what identifiers are in scope for this RFC and it doesn’t seem to have been described clearly

Here is a list of all the types of mappings that exist for migrations - this would be a general solution across user, Jira, JSM & Confluence mappings:

I suspect I’d need both Solution A and B (mostly the mapping query API in solution B)

I should say I’m keen to avoid app partners needing to use solution B unless there is no better option available - solution A would allow us to do things like incrementally migrate (to avoid significant downtime for the customer), without any extra effort from the app partner.

Is there anything we could do to extend solution A that would save you the burden of needing solution B - e.g. more sophisticated mapping options? Would you mind sharing a bit about what your apps would do that solution A (Atlassian doing the mapping for you before your invocations / containers even run in the new cloud) wouldn’t work for.

I’d also need some API/events to indicate the status of the migration such that my app knows to pause duration the migration and resume afterwards

I think if you don’t have Forge remotes storing identifiers, we would be able to automatically pause invocations not related to the migration. That said, if you are using a Forge container, that you might have internal jobs running that need to be paused - so I can see how if we chose solution B, we’d need to deliver those events.

This needs to be solved entirely on Atlassian’s end and should have been solved years ago.

The issue is not isolated to this RFC. Every other week there’s a new fundamental change to Forge that forces more complexity onto developers because this entire platform is poorly planned and executed.

1 Like

Thanks @RomanStoffel for your input on this.

Why can’t the cloudID preserved when migrating cloud to cloud. Or have have a ‘compatibility’ layer on Atlassians that sends the ‘old’ cloudID to an app when it was migrated. (e.g the installation preserves the cloudID)

I think long term we would like to minimise the need to change IDs. However, some identifiers like Jira issue IDs are not UUIDs, and are based on incrementing integers per projects. Customers may even do a merge (e.g. following M&A activity) where they migrate two cloud sites into one - so I think changing small integer IDs is never going to be avoidable completely.

For those short IDs, we theoretically could create ‘virtual’ IDs for app installations, as you suggest. However, that would also have complications - e.g. if an app displays a virtual ID to a customer (or embeds it in a link), it would be confusing.

Good question above from Shu. What happens to other identifiers?

We’d consider all the identifiers here as being in scope: https://developer.atlassian.com/platform/app-migration/mappings/#mappings-namespaces-and-entities

App Partner assigned identifiers would not be covered by this. For the simple case where it isn’t a merge of two cloud sites into one (or is a merge where there was only one installation before), I don’t think any kind of mapping is needed for partner assigned IDs. For a cloud site merge where both cloud sites had the same installation previously, we’ll probably need to do a separate RFC (this is much more of an edge case right now).

Otherwise: For the apps I’m working on, we luckily have mostly configuration data only. Must likely our policy will be: No migration and please reconfigure the app in the new cloud instance.

Useful input - I think that could be the default if app partners do nothing. However, do your configurations actually have any identifiers in them? If they do not, then migration might be trivial - perhaps under solution A expressed as an empty array of migrationMappings? That potentially would be a better customer experience (and less chance that you lose the revenue because a customer decides not to install your app in the new cloud site), with minimal effort from you.

Thank you for your input here @hitsthings - and I agree with you that ideally we’d be able to avoid identifiers changing (and particularly to avoid introducing new types of identifiers that have to change; for UUIDs, it is less of an issue).

For anything customer supplied (Jira usernames for example), or allocated a small integer ID (Jira issues), mapping is sometimes going to be unavoidable (especially in cases where the previous ID might already exist for a different entity because two cloud sites are being merged).

So we could reduce the growth of new ID types that need mapping, but unfortunately not do away with needing mappings entirely.

Good call-out - I’ve updated the RFC to say it’s a YAML file. Note that YAML is almost a subset of JSON, so you can actually put JSON in your manifest and have it work (save a few corner cases around escaping in strings) if that’s more convenient for you.

On-topic:
Before I can give more detailed feedback, I need to know more about the context. So: > About what kind of migrations are we talking about? I see 3 kinds:

  • Complete move: Move cloud site to another platform (Commercial, Gov, Isolated). Like a complete backup and restore. → No product-specific IDs change
  • Move and merge: Merge one cloud site into another, already existing cloud site. Like moving Jira/Confluence spaces from one site to another. → Product-specific IDs do change.
  • Partial move: Only move parts of a cloud site. Either as a new cloud site, or into an existing cloud site. → I guess in both cases IDs will change.

We are looking at a general solution that could encompass all of the above; the destination cloud site is created first, and the migration happens after (but for many but not all customers, the destination cloud site would be empty).

For our app, in the scenario where no product-specific IDs change, our app most probably does not need to do any data migration.
In the other scenarios, product-specific IDs are affected; there I’m with @Shu in that we’d need Forge/Atlassian to provide a method to retrieve the mapping.

Is that because you’d need to do quite complex transforms based on the ID, and Solution A wouldn’t be sufficiently expressive - and is there anything we could add to make it expressive enough without forcing you to call an API and do the mapping yourself? Or is this more to help with informing Forge Remotes of the change?

Thank you @marc for your input on the RFC - appreciate it. I don’t personally know the answer to your question, but have passed on a link to your comment internally.

I think there would likely be compliance reasons we wouldn’t be able to give all app partners access to the real Atlassian Government Cloud. Entire Isolated Cloud instances are high-cost (due to the fact they are running isolated versions of a lot of platforms), although in theory we could offer cloud sites on a shared IC instance. However, that would require a way for app partners to provision cloud sites on that instance, and as far as I’m aware, there is nothing on the roadmap to build such an offering.

However, I think you’d be able to test your migration logic with a migration between two cloud sites in Commercial Cloud. This should be equivalent from your app’s perspective.

  • what happens to apps that do not support cloud-to-cloud migration?

We still need to decide that. Data Center to Cloud migrations will give some idea of what it could look like; for DC to Cloud, the user experience helps customers to create a list of apps they are going to migrate, and surfaces whether the migration is supported. Customers can decide to not migrate apps that are not supported (or potentially decide not to migrate app data, and do a clean reinstall in the new cloud site). We’d like to reduce the risk that you lose customers who migrate, so making it easy for your app to support migration is important to us.

With regard to the implementation:

The problem with this RFC is that you are making us choose between a rock and a hard place. Solution A is anything but simpler, as there will be edge cases that are not taken into consideration here (partners are very creative).

Do you have any examples from your apps around which edge cases might be missing?

There is no silver bullet when it comes to data migration. It is one of the reasons Atlassian has stayed very, very quiet about how partners are supposed to migrate data from Connect to Runs on Atlassian Forge apps.

That’s out of the scope of this RFC, but please stay tuned on that one. I acknowledge the pathways for Connect to Forge migration are a long way from complete.

Data migration is difficult. Always has, and always will be. The time Atlassian will spent on a one-size-fits-all solution with Solution A is going to be frustrating and it will create headaches for partners, customer and Atlassian alike, with a lot of contentious support requests.

It might help trying to solicit feedback from partners with regard to JCMA and CCMA. Atlassian might learn a lot about how frustrating data migration can be for partners. There is a reason why there is a whole solution partner industry involved in migrating from DC to Cloud, incl. writing custom scripts & solutions for data migration.

I acknowledge the complexities you’re facing here. We ideally want to make cloud-to-cloud migrations simpler than Jira DC to Forge migrations (where there is the added complexity of changing data shape, and not just identifiers).

One the other hand, the more appropriate Solution B, where the Marketplace Partner is in control will never be cost efficient for partners, which will result in higher pricing for Government Cloud and Isolated Cloud versions of apps even though migration is a one-time effort.

Do you have any specific examples of data mapping where you feel Solution B would be required? Would this be a case where most of your migration problems were solved with Solution A, but there was a small amount of residual work to do with Solution B, or would most of your migration need to run through Solution B?

It is surprising that Atlassian is willing to foot the bill for Solution A, but not for Solution B.

It would be great if Atlassian would be willing to create a special type of Forge module for cloud-to-cloud migrations which are excluded from Forge usage costs. This would make Solution B more viable for Marketplace Partners. Given that Atlassian has already indicated that it accepts a cost for migrating from cloud-to-cloud, it makes sense to extend this offer to Solution B as well.

The difference between the two is that Solution A is Atlassian-created transformation logic based on a declarative specification by partners, optimised by Atlassian, while Solution B is general-purpose compute running code provided by partners.

It is another internal team that is responsible decisions around Forge compute pricing, so I have passed on a link to your suggestion internally.