Why usage is missing for specific filter values when a catch-all filter is present
Last updated: June 19, 2026
If events for a particular filter value arrive successfully but their usage never appears under that value's own line, the likely cause is a catch-all filter on the charge capturing them. The events are ingesting fine; the problem is which filter Lago matches them to. When a charge has both specific filters and a catch-all filter that all key on the same single dimension, some specific values can lose the match to the catch-all and get pooled under it instead of their own line. The usage is not missing from billing, it is bucketed under the catch-all rather than showing where you expect it.
How filter matching resolves
Lago matches an event to a charge filter using a most-specific-match-wins rule: the filter with the most matching keys wins. A filter keyed on two dimensions beats one keyed on a single dimension.
The complication is when filters tie on key count. If every filter on the charge keys on the same single dimension, then a specific value and the catch-all both have one key and tie. Lago breaks that tie by creation order, keeping the earliest-created filter. So a specific filter created before the catch-all wins and logs correctly, while one created after the catch-all loses the tie and has its usage absorbed into the catch-all bucket. That is what produces the asymmetry that looks like selective data loss: two values configured the same way behave differently based purely on their relative creation order. Note that creation order also follows the position of each filter in the payload when a plan and its filters are created in a single API call, so the issue can exist from the moment the plan is created.
How to resolve the issue
Delete the catch-all filter from the affected charges. Once it is gone, the specific filters match correctly and usage logs against the right value. If you still want a fallback for unrecognized values, the charge-level default price already covers any value without a specific filter, so you may not need a catch-all at all. If you do want to keep one, recreate it after the specific filters exist so it is the newest filter and loses the tie to them.
This article reflects guidance drawn from customer case resolutions. It is not officially supported documentation and may not apply to all situations.