Skip to main content
Additional fields choose what extra data Stratos sends to your own backend (phpVMS, vmsACARS or your own) on top of the core fields every report carries. You tick each field for the flight phases it should ride along on, and for the completion PIREP. This page shows how to set it up, then lists every field with the exact key, type and unit your backend receives.
At a glance
  • Set it on Plugins → Flight Tracking → Additional fields in Console: one row per field, one column per flight phase, and a PIREP column.
  • Tick a phase to send the field on position updates during that phase; tick PIREP to send it once with the completed flight.
  • Example payload shows exactly what your backend will get.
  • Where PIREP fields go picks Nested (one additional_fields object, which the stock phpVMS module saves as custom PIREP fields) or Top level.
  • Changes apply from each pilot’s next flight.

Choose your fields

Open Plugins → Flight Tracking in Console, then the Additional fields tab.
Flight Tracking's Additional fields tab, a matrix of fields by flight phaseFlight Tracking's Additional fields tab, a matrix of fields by flight phase
Every optional field is a row. The 15 flight phases are columns, with a final PIREP column. Tick a phase cell to add the field to position updates while the flight is in that phase; tick PIREP to include it in the completion PIREP. Any combination works. Position updates go out on your airline’s Position report interval, set on Flight Tracking’s settings. The selection applies to every pilot from their next flight: Stratos fixes Flight Tracking’s settings for each flight when it starts.
Lower the Position report interval and tick more phase cells only if your VA backend actually consumes them. Each extra field is more bytes per pilot per tick: fine in isolation, noticeable at scale across hundreds of pilots flying simultaneously. Restricting a field to the phases that matter (for example winds only during CLIMB / CRUISE / DESCENT) keeps every other tick lean.

Check what your backend gets

The Example payload button on the Additional fields tab shows the position update for your own selection, phase by phase, with your fields highlighted:
Example payload, the position update Stratos sends with the airline's additional fields highlightedExample payload, the position update Stratos sends with the airline's additional fields highlighted

Choose where PIREP fields go

Where PIREP fields go, the Nested / Top level switch above the matrix, decides where the PIREP-ticked fields sit in the /flights/complete body:
Where PIREP fields go, the Nested or Top level switch on the Additional fields tabWhere PIREP fields go, the Nested or Top level switch on the Additional fields tab
  • Nested (default for new airlines): the ticked fields, plus simulator_version, arrive as one additional_fields object. The stock Stratos phpVMS module writes every entry to pirep_field_values as a custom PIREP field (source ACARS).
  • Top level (the original shape): each ticked field is a flat key next to the thirteen always-on completion keys. The stock Stratos phpVMS module ignores these extra keys, so use this when another module reads them or already writes custom PIREP fields for Stratos flights.
The fields are never sent in both places at once. A nested completion looks like:

Rules worth knowing

  • A field is appended on a tick only when the live phase is one you ticked for it.
  • Live fields are read from the sim every tick; when the sim can’t supply a value the raw default rides along (0, false, or ""): live fields are never blank.
  • Milestone fields are null until their capture milestone passes; the same applies to a PIREP-ticked milestone field whose milestone never fired.
  • block_fuel and zfw on the completion PIREP are omitted entirely (not 0) when never captured.
  • A few live fields are aliases or derived rather than direct telemetry: flaps_left_position / flaps_right_position (aliased to flaps_control) and cruise_altitude (current altitude rounded). The table notes call each one out.
  • Anything you turn on later starts appearing from the next flight onwards.

Field reference

The rest of this page is the reference: what every report always carries, then every optional field. It’s kept in step with the Stratos code: when a new field is added, it’s added here.

What every report always carries

Two sets of fields are sent unconditionally, regardless of what you tick.

Position update: the always-on keys

Every position update POSTed to your backend’s /flights/update opens with these eleven keys, in this order, before any optional fields are appended:
The opt-in miles_to_go field carries the same value as distance_remaining, which is already always present, so there is no need to enable miles_to_go separately.

Completion PIREP: the always-on keys

The completion POST to /flights/complete always includes these thirteen keys, before any PIREP-ticked fields are merged on top: When Flight Tracking’s Ask which network pilots are flying on is on, the completion also carries network: the network the pilot picked, as its Sent as value.
landing_rate, fuel_used, simulator_version and network (when networks are asked for) are always included here with their authoritative completion values, so PIREP is disabled for them in the matrix: ticking it would only override the authoritative value with the live one, so there is nothing to add.

How optional fields are delivered

Every optional field is one of two kinds. This determines what your backend receives and when:
  • Live: read from the simulator on every tick and sent at its current value. If the sim can’t supply it, the raw default is sent: 0 for numbers, false for booleans, "" for strings. Live fields are never blank.
  • Milestone: captured once when the flight passes a milestone (block-off, takeoff, touchdown, block-on) and stored in the PIREP snapshot. A milestone field appended to a position update before its capture milestone is sent as null; the same applies to a PIREP-ticked milestone field whose milestone never fired.
Each table below marks the kind. Per-simulator caveats are folded into the description, because the matrix’s simulator badges (MSFS only, MSFS & X-Plane) don’t capture every gap.

Optional live fields

Grouped as they appear in the matrix in Console. The Key column is the exact key your VA backend sees in the JSON payload.

Position & Navigation

Orientation

Flight Controls

Engine Data

engines_count reports how many engines the current aircraft has: use it to ignore engine3_* / engine4_* on twins. Per-engine fields exist for all four slots; on X-Plane the unused slots are masked to 0 / false. For each engine there are two “running” signals: engineN_firing is the raw combustion flag (it can flicker on some MSFS 2024 aircraft), while engineN_on is a debounced, composite running flag that is more stable. Prefer engineN_on for “is the engine running”.

Fuel

Weather

Simulation Time

The simulator’s in-world clock, for logging what time it is in the sim rather than in the real world.

Aircraft Information

Simulator State

Warnings

Exterior Lights

Read from the simulator’s own light variables, so what they mean depends on the aircraft. Some aircraft report the switch position (PMDG, X-Plane); others report whether the light is actually lit (Fenix, where strobe AUTO and gear-mounted lights follow the aircraft’s logic). Aircraft without a given light can still report it as on, so decide per aircraft which lights a rule should apply to. Runway turnoff lights have no field of their own; some aircraft report them as light_taxi. On X-Plane, logo, wing and runway turnoff lights are wired to “generic” lights whose numbering each aircraft developer chooses, and many airliners (the default XP11 737, the XP12 A330) don’t drive the standard taxi switch, so light_logo, light_wing, light_taxi and the numbered landing lights are null there. X-Plane reports beacon, strobe, nav and landing. A nose light in its take-off position counts as a landing light on some aircraft (XP12 A330). The same values are available to event rules as lightBeacon, lightStrobe, lightNav, lightLogo, lightWing, lightLanding, lightTaxi and lightLanding1 to lightLanding3.

Landing Analysis

These live fields are easy to misread: most are not the held touchdown values their names suggest. For authoritative touchdown figures, use the milestone landing_* fields below or the completion landing_report.

Flight Session

Optional milestone fields

Captured once at a flight milestone and held for the rest of the flight. Sent as null until their milestone passes. Group order matches the matrix in Console.

Departure

Captured at block-off (first movement / pushback).

Takeoff

Captured at the takeoff trigger (airborne, post-debounce).

Landing

Captured at touchdown, from the landing analyser.

Arrival

Captured at touchdown or block-on (final stop before shutdown).

Summary

Captured at completion.

The phase fields

There are two distinct phase concepts.
  1. The always-on top-level phase on every position update. It is the UPPERCASE API phase: BOARDING, PUSH_BACK, TAXI, TAKE_OFF, REJECTED_TAKE_OFF, CLIMB, CRUISE, DESCENT, APPROACH, FINAL, LANDED, GO_AROUND, TAXI_TO_GATE (both TAXI_IN and ARRIVED collapse to this), DEBOARDING, or UNKNOWN. While the sim is paused it reports PAUSED. This is the only phase key on the wire and it is sent on every update, so there is no separate opt-in phase field to enable.
  2. The 15 matrix phase columns, which decide when each field is sent. Their keys are uppercase and keep TAXI_IN and ARRIVED separate: BOARDING, PUSH_BACK, TAXI, TAKE_OFF, REJECTED_TAKE_OFF, CLIMB, CRUISE, DESCENT, APPROACH, FINAL, LANDED, GO_AROUND, TAXI_IN, ARRIVED, DEBOARDING. UNKNOWN is never a column, and PAUSED is never a column.
While paused, field selection still uses the real underlying phase, so per-phase fields keep matching the phase you are actually in even though the top-level phase reads PAUSED. For the full phase model and the conditions that move a flight between phases, see Flight Phases.

Example position update

On each tick, the fields whose phase set includes the current phase are added after the eleven always-on keys. A position update during CRUISE, with a few cruise fields ticked:

Field availability by simulator

Not every simulator populates every field. The general picture:
  • MSFS 2020 / 2024 / FSX / P3D (SimConnect): populate the broadest set, including all engine slots, engineN_pct_rpm, slew_mode, and native latched touchdown_* live fields.
  • X-Plane 11 / 12 (UDP DataRef): populate the same core telemetry, but a few fields are unavailable and report their defaults: engineN_pct_rpm is 0, slew_mode is false, landing_rate is 0 in the air (it holds the canonical touchdown rate after touchdown), the zulu date aliases to the local date, and altimeter_settings duplicates pressure_qnh.
  • Touchdown / departure position (touchdown_latitude / touchdown_longitude, departure_latitude / departure_longitude) is captured on every sim (including X-Plane) so a VA can derive the arrival and departure runways server-side where the client can’t match one.
  • Facility-derived milestone fields (departure_runway, arrival_runway, the gate and runway-deviation fields) are matched client-side and are MSFS only: null on X-Plane; use the touchdown / departure coordinates above to derive them server-side. aircraft_livery is populated on MSFS 2024 and X-Plane but empty on MSFS 2020 / FSX / P3D.
If a field isn’t available from the sim, Stratos sends its default (0, false, or "" for live fields, null for uncaptured milestone fields). It won’t fabricate values.