Segment Roll-Up (generated for Fox Factory)
Why this skill exists
The standard openfpa skills model a single entity. Fox Factory reports three
segments (PVG, AAG, SSG) and, under ASU 2023-07, discloses net sales and
Adjusted EBITDA per segment - but not segment COGS or operating income
(.fpa/business-profile.md). The base engine has no segment concept, so this
skill was generated to bridge the gap. It cites these profile facts:
- Three reportable segments; segment metric is Adjusted EBITDA, not gross profit.
- Segment-level working capital, debt, and tax are not disclosed - those stay consolidated. So segments drive the P&L down to Adjusted EBITDA only; the consolidated layer owns everything below.
The model shape
segment net sales + Adj EBITDA margin (PVG, AAG, SSG)
│ roll_up_segments() → total net sales + total Adj EBITDA
│ segments_to_channels(cogs_pct)→ revenue channels for the engine
▼
consolidated EntityConfig (blended COGS%, opex, D&A, capex, WC days, debt, tax)
│ cashflow_from_config()
▼
consolidated P&L + indirect cash flow (revenue → … → FCF)
How to use
- Build one
pyfpa.Segmentper segment from disclosed net sales and Adjusted-EBITDA margin (adjusted_ebitda / net_sales). roll_up_segments(segments)→ total net sales + total Adjusted EBITDA. Reconcile that total to the disclosed segment-footnote total - it must tie.segments_to_channels(segments, cogs_pct=<consolidated blended rate>)→ revenue channels. The blended COGS% is applied to every segment (segment COGS isn't disclosed), so the channels sum back to consolidated COGS by construction.- Feed the channels into a consolidated
EntityConfigand runcashflow_from_config. Set the singleadjusted_opexline togross_profit − total_adjusted_ebitdaso engine EBITDA ties to segment Adj EBITDA. - Keep the goodwill impairment and discrete tax items out of the engine and in a documented bridge to GAAP net income - the lean engine models the operating business, not one-time non-cash charges.
Reference implementation
examples/foxfactory/foxf_model.py (reconciliation_config, phase_a_model,
forecast_year) and pyfpa.analysis.segments.
Guardrail
This skill lives in the client's skills/generated/ namespace - it is specific
to a three-segment, Adjusted-EBITDA-reporting company and must never be promoted
into the public openfpa template.