Hey Samuel,
There are multiple ways to accept payments via our API and different abstractions depending on your use-case. I recommend this doc [1] with the associated video which is a great introduction to the various concepts we offer.
First, it will touch on the Charge and PaymentIntent objects which model the lifecycle of a payment and its attempt(s). Those focus on the amount/currency combo and payment method(s) used but don't provide any line item information. It's quite common for integrations that manage their own shopping cart logic or inventory and just want to focus on accepting the payment through Stripe to use those APIs directly. In that case, the reconciliation would happen with data you store in your own database for example.
We have higher level APIs that build on top of those though and will store line item information. Our Invoice API which you mentioned is one of those. Another one would be the Checkout Session or PaymentLink APIs which also have detailed line item information stored in the related object. In that case, your integration should store information about the objects created during the payment to map a Checkout Session id (cs_live_123) to a PaymentIntent id (pi_123) for example to be able to map the information in that Session to the BalanceTransaction you are seeing.
So what you need to do next is dig into your own integration and which API(s) you're using so that you can do proper reconciliation of what is being bought. It's fairly straightforward to handle once you understand how all the objects related to each other but that first step can take a bit of time.
You likely will have follow up questions once you find out more details so I recommend reaching out to our support team [2] or using our Discord server during the week (off on week end) to ask questions directly to Stripe developers.
Best,
Remi