As a best practice Ionic recommends incrementing the version in all three locations whenever a change is required.
The version reported by the native layer of your app is defined by the version attribute in the widget node of config.xml.
<widget id="io.ionic.briandevtest" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
This is the version used by Live Deploy when checking native versioning requirements, and returned by plugins like cordova-plugin-app-version. This value is set in the native binary for iOS or Android native builds. Modifications to the version in config.xml will only take effect on the next native build. In Ionic Appflow, native builds are managed using the Package feature.
The version reported by the Angular/web code in your app is governed by the value of the version property in package.json.
"homepage": "https://ionic.io/", ... }
Modifications to the version defined in package.json take effect on the next web build. Typically web builds are run using the
npm run build command with ionic-app-scripts. Apps employing Ionic Framework v1 or v4 may use a different build process.
The Appflow Client (if you're making use of it) requires a version when it's initialized. The version is defined in a call to the Pro.init method in app.module.ts.
Modifications to the version defined in the init method will take effect on the next web build. This version is used to create source maps for the Monitoring feature. If this version is out of alignment with the web version of an app errors will no be accurately mapped back to their source.