Skip to content

Conversation

@Genyus
Copy link
Contributor

@Genyus Genyus commented Jul 31, 2025

Description

Adds support for Polar payments platform. Closes #441

Related to wasp-lang/wasp#3034 as we need to remove Stitches internally in order to be able to use the correct moduleResolution that Polar's SDK depends on in our tsconfig.

Contributor Checklist

Make sure to do the following steps if they are applicable to your PR:

@Genyus
Copy link
Contributor Author

Genyus commented Jul 31, 2025

@vincanger Still a WIP, but as I've gotten to the point where I can create orders and subscriptions, I thought I should share the changes I've made that affect other parts of the codebase for discussion.

Configurable provider selection

The current codebase requires the developer implementing the template to modify the codebase to select which payment provider to implement. I understand the reasoning behind this decision, but it also makes it impossible to implement e2e tests for multiple providers without modifying the codebase. To address this, I implemented a new PAYMENT_PROCESSOR_ID environment variable which can be used to select any one of the supported platforms.

Updated schema validation

OpenSaas currently uses a custom validation function to ensure the required env vars are set, but with the introduction of Zod validation, this seems redundant and so I implemented Zod-based validation for this provider, which could also be applied to the existing platforms, if desired.

Refactored stats job

The stats job previously contained functions for both Stripe and LemonSqueezy, which felt like a bit of code smell as it violates the open/closed principle, so I refactored that code to make the revenue calculation a function of the PaymentProcessor interface to be implemented by each integration.

Copy link
Collaborator

@vincanger vincanger left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did a quick review. I see out moduleResolution is causing import issues for the polar SDK. Hopefully we can get that sorted out quick. Everything looks to be on the right track though! The main thing I'd like to change at the moment is to remove comments that are redundant as many of them just repeat what's discernible from the function name.

Genyus added 2 commits August 5, 2025 22:10
- Fix order status checking
- Remove redundant subscription status mapping type and custom status values
- Remove redundant JSDoc comments
@vincanger
Copy link
Collaborator

Ok @Genyus I'd say go ahead with the implementation. It's looking good! I'm tagging @sodic here, as he will continue with the review from here on out.

@infomiho infomiho requested a review from FranjoMindek August 7, 2025 14:34
Copy link
Contributor

@FranjoMindek FranjoMindek left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @Genyus,
went over the PR.

Great work on this.
I'm sorry that we are asking you to remove so much from PR, but we want to focus on getting only Polar working here first.
Also I would appreciate it if you could reduce the amount of unnecessary jsdocs/comments. Didn't want to point it out everywhere since there is a lot. Do take care to use it only when we need it.

For now I've only went through the code, didn't run anything yet.
After you implement changes I would like to actually test everything out with Polar sandbox account. I would recommend you do the same.

Genyus added 8 commits August 17, 2025 02:11
- Remove payment processors and types
- Restore hard-coded payment processor references
- Remove validation schemas
- Remove unnecessary try/catch blocks
- Remove excessive JSDoc comments
- Remove env var and rely solely on polar.customerSessions.create call
- Refactor sandbox mode selection logic
Copy link
Member

@infomiho infomiho left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left some comments

FranjoMindek and others added 15 commits November 20, 2025 16:31
# Conflicts:
#	opensaas-sh/app_diff/src/payment/user.ts.diff
#	template/app/src/payment/plans.ts
#	template/app/src/payment/user.ts
…polar.mdx

Co-authored-by: Mihovil Ilakovac <mihovil@ilakovac.com>
…polar.mdx

Co-authored-by: Mihovil Ilakovac <mihovil@ilakovac.com>
Co-authored-by: Mihovil Ilakovac <mihovil@ilakovac.com>
…index.mdx

Co-authored-by: Mihovil Ilakovac <mihovil@ilakovac.com>
…index.mdx

Co-authored-by: Mihovil Ilakovac <mihovil@ilakovac.com>
…lemon-squeezy.mdx

Co-authored-by: Mihovil Ilakovac <mihovil@ilakovac.com>

## Deploying your App

### Deploying to Fly.io
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We are missing the Deploying to Railway section or we could rework this to be a Deploying with wasp deploy or similar so it cover some agnostic advice and then link to both providers in the Wasp docs for details.

We don't have to do it in this PR, but I'd create an issue and tackle it sooner than later.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have a task to take care of this this sprint.

Copy link
Collaborator

@vincanger vincanger left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Polar Docs look great. Just made a few small suggestions. Nice work :)

### Sandbox and Production Mode

Polar features two separate environemnts: [sandbox](https://sandbox.polar.sh/dashboard) and [production](https://polar.sh/dashboard).
They are fully isolated from each other, which means that you need to create seperate organizations for each of them. They also feature indepdendant products, sales, access tokens, etc.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you need to create seperate organizations for each of them

really? I know Stripe allows you to work in sandbox mode and then copy all those settings to production. That's not possible with Polar?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nope. Sadly.


### Create and Use the Polar Webhook in Local Development

Polar notifies your Wasp app about events through a webhook (for example, when a payment succeeds). During development, you need to expose your locally running Wasp server (started with `wasp start`) to the internet. Wasp server runs on port 3001 by default, so you can, for example, run `ngrok` on port 3001 to expose your server to the internet. `ngrok` will generate a public URL that you can give to Polar.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Polar notifies your Wasp app about events through a webhook (for example, when a payment succeeds). During development, you need to expose your locally running Wasp server (started with `wasp start`) to the internet. Wasp server runs on port 3001 by default, so you can, for example, run `ngrok` on port 3001 to expose your server to the internet. `ngrok` will generate a public URL that you can give to Polar.
Polar notifies your Wasp app about customer and payment events through a webhook. During development, your locally running Wasp server (started with `wasp start`) where the webhook endpoint is located is not yet available to Polar via the internet (it's running on port 3001 by default). We can make it available to Polar by installing and running `ngrok` on port 3001, which will generate a public URL for it.

Copy link
Contributor

@FranjoMindek FranjoMindek Nov 21, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Took half your suggestion and half mine. Now it looks like this:
image

I've also added commas after First, not seen on the image.

Copy link
Member

@infomiho infomiho left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm good 👍 good job

@FranjoMindek FranjoMindek mentioned this pull request Nov 21, 2025
@FranjoMindek FranjoMindek merged commit 7f2c074 into wasp-lang:main Nov 21, 2025
5 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

add Polar.sh as a payment provider / merchant of record

5 participants