laravel / cashier-paddle

Cashier Paddle provides an expressive, fluent interface to Paddle's subscription billing services.

Home Page:https://laravel.com/docs/cashier-paddle

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Fix nextPayment() total

haszzam opened this issue · comments

Cashier Paddle Version

2.x

Laravel Version

10.10

PHP Version

8.2

Database Driver & Version

No response

Description

I'm trying to build a dynamic subscription system and came acroos this issue and I tried posting this question on the discord channel but I got no response.

Issue

I have a subscription with two items item (A) is the base item has a fixed quantity of 1, And item (B) users can increase the quantity and this should be added to the next billing cost.

The problem is, I was trying to display the next billing information for the user and I was getting the wrong total when using the nextPayment() method on the user's subscription.

Here's an example to make this clear.

My Items
Item (A): $10 (Quantity fixed cannot be increased)
Item (B): $5 (Can increase the quantity)

When a user first subscription he must at least have 1x item (B) so the initial subscription costs $15

Now if the user increase the quantity of item (B) to be 2, then the next payment should be $25 like so:
$10 (Item (A)) + $10 (2x Item(B)) + $5 prorated amount from last month.

Now when you try to get the next billing details using nextPayment() you get $30 which is not correct.

I inspected the nextPayment() method and the API response coming from Paddle and found that Paddle return multiple totals.
subtotal, 'grand_total', and total

The grand_total was the correct value.

And I talked to Paddle support and they said grand_total is the actual value paddle will charge the customer.

so grand_total should be the default total value return by nextPayment() method.

Here's how the customer support explained this to me

grand_total is the amount that will be charged by our payment processor.

The "$30" in this case is related to how Paddle calculates the next payment. The first transaction of subscription was $15 with 1 Item A ($10) and 1 Item B ($5); You increased the quantity of Item B ($5) to 2 and selected to charge the full amount of the added item on the next billing date. In this case, there are 3 entries involved in the scheduled payment:
2 Item B($10) for 2023-12-16 to 2024-01-16;
2 Item B($10) for 2023-01-16 to 2024-02-16;
1 Item A($10) for 2024-01-16 to 2024-02-16;
The total amount of the above 3 entries is $30. However, 1 Item B($5) for 2023-12-16 to 2024-01-16 was already paid in the first transaction, so this created a credit of $5. The final grand_total became $30-$5=$25.

I hope this makes sense, It's a bit confusing and it's very common to display the next billing amount for the user so there would be no hidden cost.

As a workaround I manually fetched the next payment inside my controller, But I hope this could be fixed.

Thanks!

Steps To Reproduce

  1. Install and configure laravel + cashier-paddle
  2. Create a subscription plan with multiple items
  3. Create a dummy subscription to this plan
  4. Try increasing the quantity for one the items
  5. Try getting the next billing details using nextPayment() method.

Thanks! I sent in a PR for this: #231