Stockholders' equity |
12 Months Ended | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Dec. 31, 2025 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Share-Based Payment Arrangement [Abstract] | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Stockholders' Equity | Stockholders’ equity Stock-based compensation expense Employee stock-based compensation cost recognized in the consolidated statements of income/(loss) was as follows:
Equity plans 2018 Stock Plan - Effective November 12, 2018, the Company adopted the 2018 Stock Option Plan. Under the terms of the 2018 Stock Plan, certain options are subject to accelerated vesting in full or by an additional 12 months as a result of business combinations. The Company is no longer issuing any awards under the 2018 Plan. All of the awards issued pursuant to the 2018 Plan expire 10 years from the date of grant. 2020 Equity Incentive Plan - Effective March 5, 2020, the board of directors approved an equity incentive plan, which was amended effective December 23, 2025 (as so amended, the “2020 Plan”). The 2020 Plan permits the Company to grant a maximum aggregate amount of 19.8 million Incentive Stock Options, Non-Statutory Stock Options (“NSOs”), Restricted Stock, Restricted Stock Units (“RSUs”), Stock Appreciation Rights, Performance Units (“PSUs”), and Performance Shares (“PSA”) (collectively, the “Awards”) to employees, directors, and consultants of the Company. The board of directors or any committee appointed by the Board has the authority to grant Awards. NSOs and RSUs issued under the 2020 Plan have the following vesting conditions: one-fourth will vest one year after the grant date; and one-sixteenth will vest each subsequent three-month anniversary thereafter. PSUs granted in 2024 onwards vest one-third annually over three years, capped at 280% maximum payout, and have the following performance goals and additional external modifiers: 1)Year-over-year growth in revenues for the Performance Period, expressed as a percentage increase over the previous fiscal year revenues (“Revenue Growth”), and 2)GAAP gross profit, calculated as a percentage of revenues for the Performance Period (“Contribution Margin”). Fifty percent (50%) of the target number of performance shares granted will vest (if at all) based on the extent of achievement of the Revenue Growth for the Performance Period, and the remaining fifty percent (50%) of the target number of performance shares granted will vest (if at all) based on the extent of achievement of the Contribution Margin. The maximum payout for the internal metrics above is capped at 200%. External performance modifier rTSR is based on how the total shareholder return compares to the return of Russell 2000 index companies and can add or reduce an additional 20% for shares available to vest based on the internal metrics. rCAGR modifier is based on how the compound annual revenue growth compares to the compound annual revenue growth of Russell 2000 companies and can add or reduce an additional 20% for shares available to vest based on the internal performance metrics independent of rTSR. As of December 31, 2025, 6.6 million shares of stock remained available for grant under the 2020 Plan. All of the awards issued pursuant to the 2020 Plan expire 10 years from the date of grant. Stock options The grant date fair value of each NSO issued under both plans was estimated on the date of grant using the Black-Scholes-Merton option pricing model. There were no NSOs issued during the year ended December 31, 2025. The key assumptions for the years ended December 31, 2024 and 2023 are provided in the following table.
The Company used a zero percent dividend yield assumption for all Black-Scholes-Merton stock option-pricing calculations. Since the Company’s shares were not publicly traded prior to the closing of our merger in March 2020 and its shares were rarely traded privately, expected volatility is estimated based on the average historical volatility of peer group entities with publicly traded shares. The risk-free rate for the expected term of the options is based on the U.S. Treasury yield at the date of grant. Expected term is estimated using the simplified method, which takes into account vesting and contractual term. The simplified method is being used to calculate expected term instead of actual data due to a lack of relevant historical data. 2018 Plan The following table sets forth the activity for the 2018 Stock Plan for the years ended December 31, 2025, 2024, and 2023:
The total intrinsic value of options exercised during the years ended December 31, 2025, 2024, and 2023 was $0.4 million, $2.1 million and $0.9 million, respectively. As of December 31, 2025, the Company fully recognized stock-based compensation costs related to 2018 Plan options. 2020 Plan The following table summarizes option activity for the years ended December 31, 2025, 2024 and 2023 under the 2020 Plan:
The weighted average grant-date fair value of stock options granted during the years ended December 31, 2024 and 2023 was $6.74 and $5.87, respectively. The total intrinsic value of options exercised during the years ended December 31, 2025, 2024, and 2023 was $0.3 million, $1.2 million and $0.5 million, respectively. The total unrecognized compensation expenses related to 2020 Stock Plan options as of December 31, 2025 was $1.5 million to be expensed on a straight-line basis over the remaining 1.1 years. Restricted Stock Units RSUs granted do not participate in earnings, dividends, and do not have voting rights until vested. The following table summarizes activity of the Company’s RSUs for the years ended December 31, 2025, 2024, and 2023:
The total unrecognized compensation expenses related to 2020 Stock Plan RSUs as of December 31, 2025 was $14.5 million to be expensed on a straight-line basis over 1.8 years. Performance Stock Units The following table summarizes activity of the Company’s PSUs for the years ended December 31, 2025, 2024, and 2023:
__________________________ (1)Reported at the certified performance achievement at 100% of the target shares granted (2)Reported at 170% of the target shares (3)Reported at the certified performance achievement of 208% first tranche granted in 2024 and 100% for the remaining tranches. (4)Reported at the estimate performance adjustment of 206% for the tranches based on performance for the year ended December 31, 2025 and 131% for the remaining tranches. The total unrecognized compensation expenses related to PSUs as of December 31, 2025 was $5.4 million to be expensed on over 0.5 years. The fair value of vested RSUs and PSUs issued under the 2020 Plan (measured at the vesting date) for the years ended December 31, 2025, 2024, and 2023 was as follows:
Stock Repurchase Program On October 23, 2025, the Board of Directors authorized a share repurchase program of up to $50.0 million of the Company’s common stock. The Company accounts for treasury stock under the cost method and reports it as a reduction of stockholders’ equity in the consolidated balance sheets. During the year ended December 31, 2025, the Company repurchased 200,249 shares of common stock for an aggregate cost of $2.0 million. These shares are held as treasury stock. Accordingly, as of December 31, 2025, $48.0 million remained available for future repurchases under the program.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||