From 9cbeaf53f879c15bc6805b6da690135281c5ae86 Mon Sep 17 00:00:00 2001 From: John Lees-Miller Date: Mon, 22 Sep 2025 13:32:20 +0100 Subject: [PATCH] Merge pull request #28505 from overleaf/jlm-fix-recurly-webhook-manual-charge Handle manual charge in recurly webhook GitOrigin-RevId: 0e84725cc99433f3e6bebbd4fd424a47b233b966 --- .../Subscription/SubscriptionController.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/services/web/app/src/Features/Subscription/SubscriptionController.js b/services/web/app/src/Features/Subscription/SubscriptionController.js index b85de0d6bf..de1b7ae331 100644 --- a/services/web/app/src/Features/Subscription/SubscriptionController.js +++ b/services/web/app/src/Features/Subscription/SubscriptionController.js @@ -831,8 +831,20 @@ function recurlyCallback(req, res, next) { return res.sendStatus(200) } + // A manual charge may have no subscription, in which case we get a + // element, which produces an object instead + // of a string subscription_id. + const subscriptionId = eventData.transaction?.subscription_id + if (!subscriptionId || typeof subscriptionId !== 'string') { + logger.info( + { transactionId: eventData.transaction?.id }, + 'ignoring failed_payment_notification without subscription_id' + ) + return res.sendStatus(200) + } + SubscriptionHandler.getSubscriptionRestorePoint( - eventData.transaction.subscription_id, + subscriptionId, function (err, lastSubscription) { if (err) { return next(err)