Hey Robin,
Thanks a lot for feedback! I'll address each one separately to clarify why this is happening!
1/ Charge/refund and source metadata
=> The event payload is focused on the charge data and metadata are not automatically expanded in that case. I'm sure this is something we could add in the future though so I'll raise this the engineering team.
2/ Charge events and fees
=> The fee lives on the Balance Transaction so it would not be part of the Charge object that is described by those events. You have to retrieve the Charge via the API or at least the associated balance transaction in that case and there's no better way.
3/ Charge, invoice and description
=> The charge's description in that case is always null in our API so that's not something we would change. If the charge is associated to an invoice, we automatically pull the invoice description when sending an email receipt. If the invoice is for a subscription and doesn't have a description we'd pull the details about the plan(s).
Those are things we should keep in mind for future improvements to the API too. Especially now that we've shipped Webhook Signatures [1] as you shouldn't have to retrieve more data via the API to process an event.
Hope this helps!
Remi