Regarding the webhook events for initial purchase and renewal payments: while you provide subscription.active and checkout.completed in addition to subscription.paid, there’s currently no guaranteed sequence in which these webhooks are triggered. This makes it difficult to reliably distinguish between a first-time purchase and a renewal.
I’d like to suggest an improvement to the subscription.paid webhook:
Consider adding a field like transaction_reason, similar to Apple’s implementation, to clearly indicate whether the transaction is a PURCHASE or a RENEWAL. For example:
class TransactionReason(enum.StrEnum):
PURCHASE = "PURCHASE"
RENEWAL = "RENEWAL"
This addition would significantly simplify webhook handling and improve reliability for merchants.
Best regards,
Andy
