| Market Cap | $550.9M | |
| Enterprise Value | — | |
| Revenue | $291.1M | +33.6% |
| Gross Profit | $62.6M | +21.7% |
| EBITDA | $28.1M | +105.7% |
| Net Income | $20.9M | +116.0% |
| Diluted EPS | $0.56 | +115.4% |
| Free Cash Flow | $21.2M | −79.5% |
| Ratio | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | Trend · 6y | vs own | vs sector |
|---|---|---|---|---|---|---|---|---|---|
| ▾Margins | |||||||||
| Gross Margin | 20.25% | 22.15% | 24.54% | 23.77% | 24.57% | 22.37% | 42% | 29% | |
| Operating Margin | 5.96% | 6.74% | 7.63% | 5.00% | 4.52% | 7.51% | 75% | 66% | |
| EBITDA Margin | 6.60% | 7.39% | 8.43% | 5.77% | 5.38% | 8.29% | 75% | 52% | |
| NOPAT Margin | 5.88% | 6.66% | 7.63% | 3.96% | 3.49% | 5.86% | 42% | 67% | |
| Net Margin | 5.60% | 7.13% | 8.59% | 4.08% | 3.75% | 6.06% | 58% | 72% | |
| FCF Margin | 0.91% | −0.24% | 5.34% | 2.17% | 3.73% | 0.57% | 25% | 27% | |
| FCFF Margin | — | — | — | 2.38% | 3.92% | 0.70% | 17% | 12% | |
| OCF Margin | 6.05% | 1.99% | 5.48% | 3.33% | 5.65% | 1.07% | 8% | 20% | |
| Gross Profitability | 56.85% | 52.68% | 62.89% | 56.70% | 56.91% | 56.16% | 25% | 76% | |
| Capex Intensity | 5.15% | 2.23% | 0.15% | 1.17% | 1.92% | 0.50% | 25% | 13% | |
| ▸Returns on Capital · 6 ratios | |||||||||
| ▸DuPont factors (ROE drivers) · 4 ratios | |||||||||
| ▸Earnings quality · 7 ratios | |||||||||
| ▸Liquidity & coverage · 9 ratios | |||||||||
| ▸Leverage · 9 ratios | |||||||||
| ▸Working capital · 8 ratios | |||||||||
| ▸Capital allocation · 2 ratios | |||||||||
| ▸Per share · 6 ratios | |||||||||
| ▸Other · 1 ratios | |||||||||
The five drivers multiply to 24.0% vs reported ROE 24.4%. High ROE from margin and turnover is earned; from the equity multiplier it is borrowed.
| Line | 2020↗ | 2021↗ | 2022↗ | 2023↗ | 2024↗ | 2025↗ |
|---|---|---|---|---|---|---|
| Revenue | $113.9M | $141.0M | $182.7M | $175.3M | $180.4M | $241.0M |
| YoY % | +23.7% | +29.6% | -4.1% | +2.9% | +33.6% | |
| Cost of Revenue | $90.9M | $109.7M | $137.9M | $133.6M | $136.1M | $187.1M |
| YoY % | +20.8% | +25.6% | -3.1% | +1.8% | +37.5% | |
| Gross Profit | $23.1M | $31.2M | $44.8M | $41.7M | $44.3M | $53.9M |
| YoY % | +35.3% | +43.6% | -7.1% | +6.4% | +21.7% | |
| SG&A Expense | $15.6M | $20.8M | $29.4M | $31.5M | $34.6M | $33.9M |
| YoY % | +33.7% | +41.5% | +7.2% | +9.7% | -1.9% | |
| Total Operating Expenses | $16.3M | $21.7M | $30.9M | $32.9M | $36.2M | $35.8M |
| YoY % | +33.4% | +42.2% | +6.5% | +9.9% | -0.9% | |
| Operating Income | $6.8M | $9.5M | $13.9M | $8.8M | $8.2M | $18.1M |
| YoY % | +39.9% | +46.8% | -37.2% | -6.8% | +122.0% | |
| Interest Expense | — | — | — | $463,201 | $447,383 | $406,642 |
| YoY % | -3.4% | -9.1% | ||||
| Other Non-Operating Income | $306,997 | -$299,435 | $918,691 | $727,782 | — | — |
| YoY % | -20.8% | |||||
| Pretax Income | $6.5M | $10.2M | $14.4M | $9.0M | $8.7M | $18.7M |
| YoY % | +57.0% | +41.5% | -37.3% | -3.0% | +114.0% | |
| Income Tax | $89,618 | $112,808 | -$1.3M | $1.9M | $2.0M | $4.1M |
| YoY % | +25.9% | +6.3% | +107.1% | |||
| Income from Continuing Operations | $6.4M | — | — | — | — | — |
| Net Income (incl. NCI) | — | $10.0M | $15.7M | $7.1M | $6.8M | $14.6M |
| YoY % | +56.1% | -54.4% | -5.5% | +116.0% | ||
| Net Income | $6.4M | $10.0M | $15.7M | $7.1M | $6.8M | $14.6M |
| YoY % | +57.4% | +56.1% | -54.4% | -5.5% | +116.0% | |
| Net Income to Common | — | — | $15.7M | $7.1M | — | — |
| YoY % | -54.4% | |||||
| EPS (Basic) | $0.24 | $0.37 | $0.58 | $0.27 | $0.26 | $0.56 |
| YoY % | +54.2% | +56.8% | -53.4% | -3.7% | +115.4% | |
| EPS (Diluted) | $0.24 | $0.37 | $0.58 | $0.27 | $0.26 | $0.56 |
| YoY % | +54.2% | +56.8% | -53.4% | -3.7% | +115.4% | |
| Weighted Avg Shares (Basic) | 26.9M | 26.9M | 26.9M | 26.8M | 26.2M | 26.0M |
| YoY % | 0.0% | 0.0% | -0.4% | -2.4% | -0.8% | |
| Weighted Avg Shares (Diluted) | 26.9M | 26.9M | 26.9M | 26.8M | 26.2M | 26.0M |
| YoY % | 0.0% | 0.0% | -0.4% | -2.4% | -0.8% |
The sector classification is SIC-derived, not official GICS. Statement lines are XBRL facts as filed with the company's home regulator (SEC EDGAR for US filers; ESEF/EDINET and other national regulators for foreign filers); ratios and other derived figures are computed from them. A blank cell means the tag was absent — never imputed.