LPM CLI

lpm pool

Show your Pool revenue stats with per-package weighted downloads.

lpm pool

Prints your Pool revenue stats for the current billing period — total weighted downloads, estimated earnings, and a per-package breakdown. Requires an authenticated LPM.dev Registry session (lpm login first).

Example

$ lpm pool

  Pool Revenue Stats

  billing period         2026-05
  weighted downloads     142,830
  estimated earnings     $18.42

  packages (3):
    @lpm.dev/acme.toolkit       (84,210 downloads)
    @lpm.dev/acme.cli           (51,003 downloads)
    @lpm.dev/acme.icons         (7,617  downloads)

The current period shows an estimate. Final revenue uses completed installs and the recorded payments for that billing period.

How weighting works

The LPM.dev Registry calculates Pool revenue. Each subscriber's paid author share goes to the eligible packages that subscriber installed during the billing period.

After a successful install, LPM CLI reports the resolved dependency graph. This includes installed versions, overrides, optional dependencies, peer dependencies, and canonical alias targets. A failed download or extraction does not create Pool credit.

Each @lpm.dev/* dependency adds one level. npm packages do not add levels:

project → @lpm.dev/owner.a → @lpm.dev/owner.b → @lpm.dev/owner.c
          depth 0          depth 1          depth 2

project → npm-wrapper → @lpm.dev/owner.a → npm-helper → @lpm.dev/owner.b
                        depth 0                        depth 1
DepthBase weight
01.00
10.70
20.49
30.34
4 or deeperNo credit

The LPM.dev Registry applies these rules:

  • Each subscriber contributes at most one observation per package per month. Repeated installs and retries do not add observations.
  • The shallowest observed path wins. At equal depth, a path without the same-owner penalty wins before a stable tie-break.
  • A dependency with the same owner as its immediate @lpm.dev/* parent receives 30% of its base weight.
  • A transitive dependency needs at least two unique installers before its weight counts.
  • Publisher access does not create credit, including personal packages and packages owned by the subscriber's organizations.
  • Optional packages omitted on the current platform and dependencies absent from the installed graph receive no credit.

For example, a from Alice depends on b from Bob, which depends on c from Bob. The base weights are 1, 0.7, and 0.49. The same-owner rule reduces c to 0.147, before other eligibility rules and rounding.

Unmanaged clients do not report a completed dependency graph. Their authenticated Pool downloads count as direct observations for the fetched packages only.

Older LPM CLI versions that report only package roots can still complete installs successfully. The LPM.dev Registry credits eligible reported roots after it verifies their versions and authenticated download evidence. It does not infer transitive dependencies from these reports. Transitive packages can receive less credit until subscribers update LPM CLI. Access checks and payment rules still apply.

Payments and refunds

The author share is 80% of the paid Pool amount, excluding tax. Discounts reduce that amount. A $6 discounted payment contributes $4.80 to author revenue.

Refunds reduce the recorded contribution. Pending refund adjustments hold new payouts, retries, and payout setup recovery until revenue calculation handles those adjustments.

Recover an unconfirmed install report

If LPM CLI reports pool_attribution_unconfirmed, retry the same install command. LPM CLI can reuse cached packages and retry the report without duplicate credit.

Full graph reports have limits of 10,000 graph nodes, 50,000 edges, and 1,000 @lpm.dev/* package instances. LPM CLI includes only paths relevant to @lpm.dev/* packages. An oversized or incomplete graph returns an error instead of partial credit. Older clients can send up to 200 roots per report.

--json output

{
  "success": true,
  "billingPeriod": "2026-05",
  "totalWeightedDownloads": 142830,
  "estimatedEarningsCents": 1842,
  "packages": [
    {
      "name": "@lpm.dev/acme.toolkit",
      "owner": "acme",
      "packageName": "toolkit",
      "installCount": 91500,
      "weightedDownloads": 84210,
      "sharePercentage": 58.96,
      "estimatedEarningsCents": 1086
    }
  ]
}
FieldMeaning
billingPeriodISO month (YYYY-MM) the stats cover
totalWeightedDownloadsSum across all your pool packages
estimatedEarningsCentsAccruing total in cents (/100 for dollars)
packages[].installCountUnique subscriber observations before weighting
packages[].weightedDownloadsPost-weighting count that determines share
packages[].sharePercentageYour share of this package within the pool, in percent
packages[].estimatedEarningsCentsPer-package accrual in cents

Any field can be absent (server omits null entries). Treat the envelope as forward-compatible — additional fields may appear in future releases.

Flags

lpm pool takes no specific flags besides the global flags. --json switches the output to the structured envelope above.

See also

  • Distribution mode — what private / pool / marketplace mean and why mode changes are irreversible
  • lpm publish — how a package opts into Pool (the dashboard-driven flip)
  • Publishing a package — walkthrough including the pool/marketplace flip