-
Notifications
You must be signed in to change notification settings - Fork 2
Multi-currencies #18
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Multi-currencies #18
Conversation
psincraian
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Really nice writeup François!
|
|
||
| - Store presentment amount and currency in the current amount fields. | ||
| - When receiving a payment or refund from Stripe, we'll need to get the converted amount in `usd` Stripe calculated (from the balance transaction), to impact the merchant's Account balance. | ||
| - Revamp metrics so amount are always computed in `usd`, directly from the Account transactions amount. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
How will history work with exchange rates?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So, the idea is to store the converted amount (say usd for simplicity) in the account transactions (at the moment we receive the payment), and use them not only for payouts like we do today, but for metrics.
Effectively, if you look at MRR, a single subscription might fluctuate over months following exchange rates.
|
|
||
| ## Technical Considerations and Open Questions | ||
|
|
||
| ### Polar fees |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@birkjernstrom to bring some wisdom here
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a great question and has a lot of operational nuances on our end.
We will move towards having multiple PSP accounts (across regions) and multiple PSPs for orchestration too. So managing more than one balance account is inevitable, but will introduce some treasury challenges. Multi-currency could do that too. E.g imagine we leverage multiple currency accounts to optimize FX and settle everything in EUR on our end, but settle in in USD for the merchant. It will draw more from the USD balance than what is naturally in there from income. So we'll need dashboards and tooling long-term to manage this from a treasury perspective to always top-up and have sufficient balances across accounts for seamless payouts.
Ultimately, as a result, we will also need our own FX rates and do the conversion on our end.
But at stage 1, I think we can keep settlement in USD on our end too as we do with the merchants. Taking these complexities alongside the expansion to stage 2 – exposing multiple settlements to merchants, and ourselves at the same time.
Principally, I think our fees should apply on the "settlement amount". We might still be charged underlying fees in the "presentment amount", but with FX conversion on our end we should be protected that the ultimate fees are still at the same margin even after the conversion. But it feels cleaner to separate the financial operations that way:
- Normalize currency (FX)
- Charge fees on the settlement/balance currency of choice
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Correct me if I'm wrong, but this also makes it easier right? As the fee logic remains intact based on current amount and currency?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Definitely easier :D
What about the conversion fees applied by Stripe (1%)? Should we swallow it or reflect it on the merchant?
Yopi
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Very good writeup. I agree with your proposal both on scenario 1 and implementation B.
It will give us some time to also consider other areas where there are currencies involved.
For example, in scenario 2: if you set settlement currency to EUR, what would it mean for comparison if you are ingesting costs in USD? We will probably need to track our own currency exchange rate to be able to display all money in the same currency.
|
|
||
| ### Key terms | ||
|
|
||
| - Presentment Currency: The currency in which a payment/transaction is done, i.e. the price shown on the checkout page and customer's invoice. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I know Stripe calls it presentment currency, but to be honest, I really dislike the term :) Would be nice to find an alternative name we use that is clear, but more common tongue, e.g payment_currency
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Well, I don't really expect to show that to the users — it's more of a term so we can all align on during this design phase :)
|
|
||
| ### Key terms | ||
|
|
||
| - Presentment Currency: The currency in which a payment/transaction is done, i.e. the price shown on the checkout page and customer's invoice. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think there might be a fourth one here too: "Display Currency". In the scenario of a currency being locked to USD for instance, but allowing it to be displayed in a local currency guesstimate across checkout, email etc? Something we discussed in the past and might still be relevant in the future even with a more robust and true multi-currency support which is the focus here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe, but I feel it may be out of the scope of the current proposal :)
|
|
||
| ### Scenario 1: Multiple Presentment Currencies, USD Settlement currency | ||
|
|
||
| In this scenario, we would allow merchants to set prices in multiple currencies, and customers would be able to pay in their local currency. However, all funds would still be settled in USD. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Two core questions for me:
- Can a product have multiple presentment currencies defined? E.g what it costs in
USD,SEK,EURandINR? Or only one? - Can the merchant change their settlement currency? E.g it's still locked to 1 at this stage, but a merchant can define it as either
USDorEURor...for their entire account?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Personally, I think the answer should be yes to both above
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry, saw now that Scenario 2 covers question 2 above. But question 1 I'm not clear about here in this scenario still.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As we confirmed during the call, yes, a merchant should be able to set multiple currencies per product.
|
|
||
| Then, we can quite quickly iterate to Scenario 2. Longer-term, we still have the possibility to expand easily towards Scenario 4 Variant 2 if we see a strong demand for it. | ||
|
|
||
| From a technical standpoint, I would recommend to go with **Implementation B**. It feels cleaner and more consistent, and will save us from having to maintain two sets of amount fields in our models; even if it requires more work upfront. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree with this approach provided merchants can specify multiple presentment currencies for a product vs. one, e.g provide the prices in USD (might be their default – matching settlement currency), EUR, SEK, INR. Supporting specificity on a product-level vs. pure FX conversion based and PPP strategies too.
From there, I think it's smart to expand our support and configurability of settlement currency over time from USD. Starting with Scenario 2 of defining another settlement currency from USD, e.g EUR. Supporting multiple settlement currencies and thereby multiple balances will come, but later. But good that we make this implementation knowing that will come in the future to avoid making it harder still in the future.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it would be great to look at how we imagine this showing up in our API and data models though. Devils will be in the details there and especially considering backward compatibility. I think our current pricing should be the default one, e.g USD, for an account to support the amount, currency fields without an array or dict mapping. But that we introduce something like currencies (naming TBD) which offers a dict of <currency>: <amount> pairs.
Combined with finding another name for presentment_currency and how we store the actually paid amount/currency across our data models, e.g payment_amount and payment_currency, and amount + currency remaining as is and the normalized amounts in the configured settlement currency (USD at first).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The way I imagine to solve that:
- A ProductPrice is tied to a unique
currency. If a Product needs to support several currencies (sayusdandeur), then we'll effectively have two ProductPrice attached, inusdandeurrespectively. - The point of Implementation B is to avoid having
presentment_amount/presentment_currencyon the data models. We only store in the existing field (amount/currency) the actual amount/currency that was paid by the customer. The conversion to settlement currency is then only done at the Account transactions level.
pieterbeulque
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Strong assessment overall, and I agree with the technical approach.
However, I think Scenario 1 has a viability issue: European startups wanting to operate in EUR/GBP would face significant conversion fees on every transaction if everything settles in USD. This maybe disqualifies it as a meaningful solution for the users currently requesting multi-currency support.
We might need to keep iterating to Scenario 2 for the initial release to avoid launching something that misses the mark?
Good point. I'm not sure if we have a lot of demands right now for that. WDYT @birkjernstrom? |
|
To clarify, I'm talking about the use case of e.g. a Belgian company charging in EUR and expecting to be paid out in EUR. It was my assumption that this is the number 1 use case for multi-currency support, is that not correct then? From my understanding of how payouts work, that's already possible with scenario 1 too, but they'd be hit unnecessarily by EUR → USD → EUR conversion rates & fees? Edit — sorry, I understand things better now. So the question is whether we resolve what people are actually asking for when they request multi-currency support if we launch multiple presentment currencies without supporting matching settlement currencies too. Edit 2 — regardless of explicit customer demand, I think it also makes sense to do the math if we can position ourselves competitively in terms of pricing if non-USD companies will have to incur these double fees (upon purchase by Stripe and upon payout either by Stripe or by the merchant's bank). |
|
@pieterbeulque Well, my understanding was that the need was more about a merchant wanting to charge in the currency of the customer, but being fine with it being settled in usd in their side. But I might be wrong 😊 And yes, in the setup you describe, that's what would happen. |
|
For the bigger customer we're chatting with now it's the ability to charge in 6 currencies, but for it all to settle in But I agree that Scenario 2, i.e settle in other currencies too (EUR), is required in order for us to put this topic entirely to bed. However, I'm more than supportive of doing them sequenced like this. Scenario 1 introduces the currencies on the money inbound which is step 1 before changing the money outbound – step 2. As long as we call that out clearly and state we're working on Scenario 2 in our docs around it, I don't think it's missing the mark. We ship iteratively on this to cater to Scenario 1 use cases (bigger US customers) and then expand to serve bigger European customers (Scenario 2). |
|
Yep, agreed on the sequencing! |
No description provided.