Skip to content

Analytics events

As of 2026-10-19 (vulture-ios 3176c4cc4, vulture-android 85fd9cc6).

iOSAndroid
SDKMixpanel (vulture-ios/Modules/App/Sources/Services/Analytics/MixpanelAnalyticsReporter.swift)None yet. Mixpanel is planned (TODO(analytics) in 6 places). Firebase Analytics is not used (decision P8B-D15): only Crashlytics
BuildsRelease only. The app installs the reporter in Release alone, so Debug builds send nothing (vulture-ios/Packages/Analytics/Sources/Analytics/Analytics.swift)LoggingSubscriptionAnalytics writes each paywall event to logcat with the tag VultureAnalytics (adb logcat -s VultureAnalytics)
Event nameThe Analytics.Event raw value (vulture-ios/Packages/Analytics/Sources/Analytics/Event.swift)The same names (vulture-android/data/billing/src/main/kotlin/be/fousa/vulture/data/billing/SubscriptionAnalytics.kt)
Opt-outSettings › privacy toggle (Analytics.isTrackingEnabled). The site’s privacy page describes it as non-identifiable usage analyticsLocal, unsynced setting isAnalyticsEnabled (vulture-android/data/prefs/.../LocalSettings.kt)
Property valuesAll stringsThe logging implementation passes isTrial as a Boolean

When Android adds Mixpanel, it must reuse the iOS names and properties exactly, so that one Mixpanel report covers both apps. Events for Apple-only surfaces (force touch, Siri, Spotlight) have no Android counterpart. Android’s app shortcuts or share actions may reuse the matching names if they are built.

Analytics.PropertyKey. Only the paywall events carry properties.

KeyValuesOn
triggerlaunch, promoted, settings, firstLaunch, or a ProFeature raw value (severalFlights, customAirspace, debrief, thermalAnalysis, taskPlanning, recording, skySight, statistics, uploads, taskOverride, raceRanking, and on Android also syncStorage). See SubscriptionsEvery paywall event
planmonthly, yearly: the last component of the product idPurchase events
isTrialtrue, falsepaywallPurchased
outcomesubscribed, dismissedpaywallClosed
errorThe store error code (NSError.code on iOS, the store’s code on Android)paywallPurchaseFailed, paywallRestoreFailed

93 events are declared in Event.swift. Notes on the columns:

  • iOS sent. “Declared, never sent” ³ means the case exists, but nothing in Modules/ or Packages/ reports it (checked with a search for each case name).
  • Android. ¹ Logged only: the event is fired with the same name and properties, but goes to logcat, not to an analytics service. ² Planned: a TODO(analytics) marks where it will be sent (vulture-android/feature/soaringspot/.../SoaringSpotRoutes.kt, vulture-android/feature/upload/.../DefaultUploadCoordinator.kt). “No” means Android does not send it yet, whether or not the feature exists there.
EventGroupWhenPropertiesiOS sentAndroid
forceTouchFlightPanelCellForce touchThe pilot force-touches the flight panel cell.noneYesn/a (Apple-only)
forceTouchTurnpointListCellForce touchThe pilot force-touches the task list cell.noneYesn/a (Apple-only)
forceTouchLegListCellForce touchThe pilot force-touches the leg list cell.noneYesn/a (Apple-only)
presentInFlightActionsPopupScreensThe pilot opens the actions pop-up from the in-flight screen.noneYesNo
presentPhaseSelectionPopupScreensThe pilot opens the phase selection pop-up from the phases list pop-up.noneYesNo
presentEditFlightScreenScreensThe pilot opens the edit flight screen.noneDeclared, never sent ³No
presentInFlightScreenScreensThe pilot opens the in-flight screen.noneYesNo
presentHomebaseSelectionScreenScreensThe pilot opens the home base selection.noneYesNo
presentThermalSheetScreensThe pilot taps a thermal and opens its detail.noneYesNo
presentAirspaceSheetScreensThe pilot long-presses the map and opens the airspace detail.noneYesNo
presentImportFlightSelectionPopupScreensThe pilot opens the import selection pop-up.noneYesNo
presentCompareScreenScreensThe pilot opens the compare screen.noneYesNo
presentStatisticsScreenScreensThe pilot opens the yearly statistics screen.noneYesNo
presentInFlightSkySightScreensThe pilot opens the SkySight picker while flying.noneYesNo
toggleSkySightOverlayFunctionalityThe pilot toggles the SkySight weather overlay on the task map.noneYesNo
toggleSatelliteOverlayFunctionalityThe pilot toggles the satellite overlay on the flight map.noneYesNo
shareMapSnapshotFunctionalityThe pilot shares the flight map as an image.noneYesNo
startMeasuringFunctionalityThe pilot starts the two-finger measure gesture on a map.noneYesNo
openSoaringSpotCompetitionFunctionalityThe pilot opens a Soaring Spot competition.noneYesPlanned ²
openCharronCompetitionsFunctionalityThe pilot opens the Charron.line competition list.noneYesNo
openFlightsFromFilesFunctionalityThe pilot opens flights straight off the device, from the sidebar’s Files row.noneYesNo
downloadFlightFromFlarmOverWiFiFunctionalityThe pilot downloads a flight from a FLARM over Wi-Fi.noneYesNo
sendTaskToFlarmOverWiFiFunctionalityThe pilot sends a task to a FLARM over Wi-Fi.noneYesNo
selectGlidingSportFunctionalityThe pilot selects gliding in Settings.noneDeclared, never sent ³No
selectParaglidingSportFunctionalityThe pilot selects paragliding in Settings.noneDeclared, never sent ³No
selectHangglidingSportFunctionalityThe pilot selects hang gliding in Settings.noneDeclared, never sent ³No
markFlightAsFavoriteFunctionalityThe pilot marks a flight as a favourite.noneYesNo
markFlightAsContestFunctionalityThe pilot marks a flight as a contest flight.noneYesNo
markFlightAsFieldLandingFunctionalityThe pilot marks a flight as a field landing.noneYesNo
dropAFlightAndReplaceFunctionalityThe pilot drops a flight on the map to replace the flights shown.noneYesNo
dropAFlightAndAddFunctionalityThe pilot drops a flight on the map to add it to the flights shown.noneYesNo
dropAFlightFromFlightListFunctionalityThe pilot drops a flight from the list on the map.noneYesNo
dropAFlightFromOtherAppFunctionalityThe pilot drops a flight from another app on the map.noneYesNo
dropATaskFunctionalityThe pilot drops a task on the map to override the task of every flight shown there.noneYesNo
dragASelectionOutOfTheListFunctionalityThe pilot drags a picked block of flights or tasks out of the list, towards another app.noneYesNo
dropFilesOnTheListFunctionalityThe pilot drops flights or tasks from another app onto the list, which imports them into the library.noneYesNo
dropFilesOnTheSidebarFunctionalityThe pilot drops flights or tasks from another app onto the sidebar, which imports them into the library.noneYesNo
centerThermalFunctionalityThe pilot taps the title in the thermal sheet to centre the thermal.noneYesNo
centerPhaseFunctionalityThe pilot taps a phase to see it on the map.noneYesNo
centerInfoItemFunctionalityThe pilot taps an info item to see it on the map.noneYesNo
centerTurnpointFunctionalityThe pilot taps a turnpoint to see it on the map.noneYesNo
requestReviewFunctionalityThe app asks for an App Store review.noneYesNo
updateXCSoarFileImportA file is updated from XCSoar.noneYesNo
importWaypointFileFromDiskImportThe pilot picks a waypoint file from disk to import.noneYesNo
importWaypointFileFromXCSoarImportThe pilot picks an XCSoar waypoint file to import.noneYesNo
importAirspaceFileFromXCSoarImportThe pilot picks an XCSoar airspace file to import.noneYesNo
importAirspaceFileFromOpenAIPImportThe pilot picks an openAIP airspace file to import.noneDeclared, never sent ³No
importFlightFromActionImport from Vulture actionA flight is imported through the Vulture share action.noneDeclared, never sent ³No
importWaypointsFromActionImport from Vulture actionWaypoints are imported through the Vulture share action.noneDeclared, never sent ³No
importTaskFromActionImport from Vulture actionA task is imported through the Vulture share action.noneDeclared, never sent ³No
importAirspaceFromActionImport from Vulture actionAirspace is imported through the Vulture share action.noneDeclared, never sent ³No
shareWaypointsAsSingleFileShareThe pilot shares waypoint files as one file.noneDeclared, never sent ³No
shareWaypointsAsMultipleFilesShareThe pilot shares waypoint files as separate files.noneDeclared, never sent ³No
shareAirspaceAsSingleFileShareThe pilot shares airspace files as one file.noneDeclared, never sent ³No
shareAirspaceAsMultipleFilesShareThe pilot shares airspace files as separate files.noneDeclared, never sent ³No
backupAllDataShareThe pilot backs up all data from Settings.noneYesNo
uploadFlightFromFlightPanelToSkyLinesShareA flight is uploaded to SkyLines from the flight panel.noneYesPlanned ²
uploadFlightFromFlightPanelToWeGlideShareA flight is uploaded to WeGlide from the flight panel.noneYesPlanned ²
uploadFlightFromFlightPanelToCharronShareA flight is uploaded to Charron.line from the flight panel.noneYesPlanned ²
uploadTaskFromTaskListToWeGlideShareA task is uploaded to WeGlide from the task list.noneDeclared, never sent ³No
shareTaskFromTaskListShareThe pilot shares a task from the task list.noneYesNo
shareTaskFromTaskPopupShareThe pilot shares a task from the task pop-up.noneYesNo
shareTaskFromFlightPopupShareThe pilot shares a task from the flight pop-up.noneYesNo
saveTaskToVultureShareThe pilot saves a task to Vulture.noneYesNo
shareTaskToCupFileShareThe pilot shares a task as a CUP file.noneYesNo
shareTaskToFlarmShareThe pilot shares a task as a FLARM declaration.noneYesNo
shareTaskToLxNavNanoShareThe pilot shares a task as an LXNAV Nano declaration.noneYesNo
renameWaypointTaskThe pilot renames a waypoint.noneYesNo
cancelTaskTaskThe pilot cancels a task.noneYesNo
cancelTaskDuringNavigationTaskThe pilot navigates away and cancels a task edit.noneYesNo
duplicateTaskTaskThe pilot duplicates a task.noneYesNo
reverseWaypointsTaskThe pilot reverses a task’s waypoints.noneYesNo
createTaskFromShortcutShortcutsA task is created from the app icon shortcuts.noneYesNo
openMapFromShortcutShortcutsThe map is opened from the app icon shortcuts.noneYesNo
startRecordingFromShortcutShortcutsA recording is started from the app icon shortcuts.noneYesNo
stopRecordingFromShortcutShortcutsA recording is stopped from the app icon shortcuts.noneYesNo
createTaskFromSiriSiriA task is created from Siri or Shortcuts.noneYesn/a (Apple-only)
startRecordingFromSiriSiriA recording is started from Siri, Shortcuts or Control Center.noneYesn/a (Apple-only)
stopRecordingFromSiriSiriA recording is stopped from its Live Activity (despite the name).noneYesn/a (Apple-only)
openFlightFromSpotlightSpotlightThe pilot opens a flight from Spotlight.noneYesn/a (Apple-only)
paywallShownPaywallThe paywall appears.triggerYesLogged only ¹
paywallClosedPaywallThe paywall goes away. outcome is subscribed or dismissed.trigger, outcomeYesLogged only ¹
paywallPurchaseStartedPaywallThe pilot picks a plan.trigger, planYesLogged only ¹
paywallPurchaseCancelledPaywallThe pilot cancels the store’s purchase sheet.trigger, planYesLogged only ¹
paywallPurchaseFailedPaywallA purchase fails. error is the store error code.trigger, plan, errorYesLogged only ¹
paywallPurchasedPaywallA purchase unlocks Pro. isTrial says whether it started a trial.trigger, plan, isTrialYesLogged only ¹
paywallRestoreStartedPaywallThe pilot taps Restore.triggerYesLogged only ¹
paywallRestoredPaywallA restore unlocks Pro.triggerYesLogged only ¹
paywallRestoreFoundNothingPaywallA restore finds no active subscription.triggerYesLogged only ¹
paywallRestoreFailedPaywallA restore fails. error is the store error code.trigger, errorYesLogged only ¹
openFlightInVultureOpen in VultureAn IGC file is opened in Vulture from another app.noneYesNo
openWaypointsInVultureOpen in VultureA CUP file is opened in Vulture from another app.noneYesNo
openAirspaceInVultureOpen in VultureAn airspace file is opened in Vulture from another app.noneYesNo

These 14 are declared but never sent: presentEditFlightScreen, the three select…Sport events, importAirspaceFileFromOpenAIP, the four import…FromAction events, the four share{Waypoints,Airspace}As{Single,Multiple}File(s) events, and uploadTaskFromTaskListToWeGlide. Do not port them to Android as they are. Either wire them up on iOS first, or remove them on both platforms.

Some names do not match what they record. stopRecordingFromSiri fires from the Live Activity, and toggleSkySightOverlay has a doc comment left over from a removed wind-indicator event. Keep the names as they are, because renaming an event splits its history in Mixpanel.