My immediate thought was that this was related to a change we made in 2.0.3, but I actually don't think it is.
That change only blacklisted certain events (one, actually) from going any further, and just logging them for info, rather than letting them get as far as processing as an error:
PHP:
$skippableEvents = ['payout.created'];
So, this hasn't actually changed for some time. Are you sure the charge was created in XF?
I'll be able to do some proper testing later but any more info you can provide in the meantime will be helpful.
Having looked into it, I'm currently thinking that somehow the database transaction with the customer creation log hadn't yet been committed by the time the Stripe charge succeeded web hook had been received (about 7 seconds later, based on the log_date fields). This feels somewhat unlikely, though...?
Just an update, another payment went through without issues without anything being changed, so it looks like I was right in thinking that the Stripe callback was received before the database transaction had commited.
Maybe it's worth allowing 1 retry for webhooks if the relevant transaction can't be found initially?
Fairly sure this has resurfaced and that makes sense because the original fix was reverted because it was made in conjunction with the changes to make use of Stripe's Billing API.
We'll need to look into re-applying at least some of those changes.