<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ademiju Adelakin</title>
    <description>The latest articles on DEV Community by Ademiju Adelakin (@ademiju_adelakin_2316e1c1).</description>
    <link>https://dev.to/ademiju_adelakin_2316e1c1</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4062356%2F0fd7d995-6ed3-46e9-af60-d4052ae42611.png</url>
      <title>DEV Community: Ademiju Adelakin</title>
      <link>https://dev.to/ademiju_adelakin_2316e1c1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ademiju_adelakin_2316e1c1"/>
    <language>en</language>
    <item>
      <title>Why Supporting Two Currencies Is More Complicated Than Adding a Currency Symbol</title>
      <dc:creator>Ademiju Adelakin</dc:creator>
      <pubDate>Fri, 28 Aug 2026 12:06:59 +0000</pubDate>
      <link>https://dev.to/ademiju_adelakin_2316e1c1/why-supporting-two-currencies-is-more-complicated-than-adding-a-currency-symbol-1j4a</link>
      <guid>https://dev.to/ademiju_adelakin_2316e1c1/why-supporting-two-currencies-is-more-complicated-than-adding-a-currency-symbol-1j4a</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr9qsdcnd0m7xpjqczo2z.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr9qsdcnd0m7xpjqczo2z.jpg" alt=" " width="718" height="481"&gt;&lt;/a&gt;Why Supporting Two Currencies Is More Complicated Than Adding a Currency Symbol&lt;/p&gt;

&lt;p&gt;«"We'll support dollars later. For now, let's just add naira."»&lt;/p&gt;

&lt;p&gt;It sounds like a small feature.&lt;/p&gt;

&lt;p&gt;Add a currency selector.&lt;/p&gt;

&lt;p&gt;Show "$" for one customer and "₦" for another.&lt;/p&gt;

&lt;p&gt;Maybe convert the price using today's exchange rate.&lt;/p&gt;

&lt;p&gt;Ship it.&lt;/p&gt;

&lt;p&gt;The problem is that supporting another currency usually isn't a frontend change.&lt;/p&gt;

&lt;p&gt;It's a pricing decision.&lt;/p&gt;

&lt;p&gt;And those are two very different things.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F74mqqo6ldoggh30cpslm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F74mqqo6ldoggh30cpslm.jpg" alt=" " width="725" height="534"&gt;&lt;/a&gt;&lt;br&gt;
The day one price becomes two&lt;/p&gt;

&lt;p&gt;Imagine your SaaS launches with one plan:&lt;/p&gt;

&lt;p&gt;«Pro — $20/month»&lt;/p&gt;

&lt;p&gt;A few months later, Nigerian customers start signing up. They ask if they can pay in naira.&lt;/p&gt;

&lt;p&gt;So you do the obvious thing.&lt;/p&gt;

&lt;p&gt;Convert $20 into naira.&lt;/p&gt;

&lt;p&gt;Except your business doesn't actually want to charge the converted amount.&lt;/p&gt;

&lt;p&gt;Maybe the exchange rate says it's ₦34,800.&lt;/p&gt;

&lt;p&gt;But you've decided the local price should be ₦30,000 instead.&lt;/p&gt;

&lt;p&gt;Now your product has something it didn't have before.&lt;/p&gt;

&lt;p&gt;Not another currency.&lt;/p&gt;

&lt;p&gt;Another price.&lt;/p&gt;

&lt;p&gt;The Pro plan now exists in two versions:&lt;/p&gt;

&lt;p&gt;Currency| Monthly Price&lt;br&gt;
USD| $20&lt;br&gt;
NGN| ₦30,000&lt;/p&gt;

&lt;p&gt;That's not currency conversion.&lt;/p&gt;

&lt;p&gt;That's multi-currency pricing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8s7a7mu26nuwhfags1bk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8s7a7mu26nuwhfags1bk.jpg" alt=" " width="777" height="469"&gt;&lt;/a&gt;&lt;br&gt;
And your billing system needs to understand the difference.&lt;/p&gt;

&lt;p&gt;The complexity sneaks in from there&lt;/p&gt;

&lt;p&gt;Once each currency has its own pricing, the questions start multiplying.&lt;/p&gt;

&lt;p&gt;Do annual plans have separate prices too?&lt;/p&gt;

&lt;p&gt;What about seat-based pricing?&lt;/p&gt;

&lt;p&gt;If your USD plan charges $8 per additional seat, is the naira version a direct conversion, or its own business price?&lt;/p&gt;

&lt;p&gt;What happens when someone paying in NGN upgrades their plan?&lt;/p&gt;

&lt;p&gt;Or switches to a USD-priced subscription later?&lt;/p&gt;

&lt;p&gt;None of these questions are about displaying a different currency symbol.&lt;/p&gt;

&lt;p&gt;They're about how your business wants pricing to work.&lt;/p&gt;

&lt;p&gt;Then your payment processors enter the picture&lt;/p&gt;

&lt;p&gt;A lot of SaaS businesses don't use the same payment processor for every currency.&lt;/p&gt;

&lt;p&gt;Maybe Stripe handles your dollar payments.&lt;/p&gt;

&lt;p&gt;Paystack handles your naira payments.&lt;/p&gt;

&lt;p&gt;That's completely reasonable.&lt;/p&gt;

&lt;p&gt;The mistake is letting those processors become the place where your pricing lives.&lt;/p&gt;

&lt;p&gt;Suddenly your application starts thinking like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;USD plan → Stripe&lt;/li&gt;
&lt;li&gt;NGN plan → Paystack&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of thinking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pro plan → USD price&lt;/li&gt;
&lt;li&gt;Pro plan → NGN price&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That difference seems small.&lt;/p&gt;

&lt;p&gt;But it's the difference between pricing rules and payment infrastructure.&lt;/p&gt;

&lt;p&gt;One is a business decision.&lt;/p&gt;

&lt;p&gt;The other is simply how money gets collected.&lt;/p&gt;

&lt;p&gt;Your pricing needs one source of truth&lt;/p&gt;

&lt;p&gt;Your application shouldn't have to recreate the same pricing logic every time another currency or payment processor is introduced.&lt;/p&gt;

&lt;p&gt;It should be able to understand something as simple as:&lt;/p&gt;

&lt;p&gt;«Pro plan&lt;/p&gt;

&lt;p&gt;USD → $20/month&lt;/p&gt;

&lt;p&gt;NGN → ₦30,000/month»&lt;/p&gt;

&lt;p&gt;Everything else should build on top of that.&lt;/p&gt;

&lt;p&gt;Your pricing.&lt;/p&gt;

&lt;p&gt;Your billing rules.&lt;/p&gt;

&lt;p&gt;Your seat-based pricing.&lt;/p&gt;

&lt;p&gt;Your recurring subscriptions.&lt;/p&gt;

&lt;p&gt;The payment processor should only come into the picture when it's time to collect the payment.&lt;/p&gt;

&lt;p&gt;That's the problem AoraHQ is built around&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5fghuqpwkap7efk0d5tn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5fghuqpwkap7efk0d5tn.jpg" alt=" " width="790" height="547"&gt;&lt;/a&gt;&lt;br&gt;
AoraHQ gives your pricing its own layer.&lt;/p&gt;

&lt;p&gt;You connect the payment processors you already use—whether that's Stripe and Paystack, or PayPal and Flutterwave.&lt;/p&gt;

&lt;p&gt;Then you configure your pricing from one dashboard.&lt;/p&gt;

&lt;p&gt;Currency-specific prices.&lt;/p&gt;

&lt;p&gt;Recurring plans.&lt;/p&gt;

&lt;p&gt;Seat-based pricing.&lt;/p&gt;

&lt;p&gt;Everything lives in one place instead of being recreated for every payment processor.&lt;/p&gt;

&lt;p&gt;Once it's configured, you copy your AoraHQ secret credentials into your application and use the AoraHQ pricing UI.&lt;/p&gt;

&lt;p&gt;Your application keeps focusing on your product.&lt;/p&gt;

&lt;p&gt;Your payment processors keep processing payments.&lt;/p&gt;

&lt;p&gt;AoraHQ handles the pricing and billing logic in between.&lt;/p&gt;

&lt;p&gt;Because supporting another currency shouldn't mean rebuilding your pricing system.&lt;/p&gt;

&lt;p&gt;Sometimes the hardest part of multi-currency billing isn't accepting another currency.&lt;/p&gt;

&lt;p&gt;It's deciding what that currency should actually mean for your business.&lt;/p&gt;

&lt;p&gt;I'm curious—how does your SaaS handle pricing in multiple currencies?&lt;/p&gt;

&lt;p&gt;Do you use live exchange rates, configure separate prices, or something in between?&lt;/p&gt;

</description>
      <category>saas</category>
    </item>
    <item>
      <title>The Problem With Building Billing "Just for Now"</title>
      <dc:creator>Ademiju Adelakin</dc:creator>
      <pubDate>Mon, 24 Aug 2026 09:46:09 +0000</pubDate>
      <link>https://dev.to/ademiju_adelakin_2316e1c1/the-problem-with-building-billing-just-for-now-19k3</link>
      <guid>https://dev.to/ademiju_adelakin_2316e1c1/the-problem-with-building-billing-just-for-now-19k3</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7mc82uiujop8touyl7be.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7mc82uiujop8touyl7be.jpg" alt=" " width="735" height="496"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd1q76qbvvtumdfuwb4ws.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd1q76qbvvtumdfuwb4ws.jpg" alt=" " width="758" height="495"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv0pnjx3pfzsys67jtr8q.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv0pnjx3pfzsys67jtr8q.jpg" alt=" " width="770" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp1flaql2wfhtu4fuz6jg.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp1flaql2wfhtu4fuz6jg.jpg" alt=" " width="770" height="504"&gt;&lt;/a&gt;&lt;br&gt;
"Let's just hard-code it for now."&lt;/p&gt;

&lt;p&gt;It's an MVP.&lt;/p&gt;

&lt;p&gt;You have one pricing plan, a handful of customers, and one payment processor.&lt;/p&gt;

&lt;p&gt;You don't need a billing architecture that can support every possible pricing model your SaaS might have three years from now.&lt;/p&gt;

&lt;p&gt;You just need people to pay.&lt;/p&gt;

&lt;p&gt;So you create the plan, connect checkout, write the necessary logic, and move on to building the product.&lt;/p&gt;

&lt;p&gt;And that's a perfectly reasonable decision.&lt;/p&gt;

&lt;p&gt;The problem starts when your business grows, but your "temporary" billing setup becomes permanent infrastructure.&lt;/p&gt;

&lt;p&gt;Your MVP didn't break. Your business outgrew it.&lt;/p&gt;

&lt;p&gt;Imagine you launch with one plan:&lt;/p&gt;

&lt;p&gt;$20/month.&lt;/p&gt;

&lt;p&gt;Simple.&lt;/p&gt;

&lt;p&gt;Then customers ask for annual billing.&lt;/p&gt;

&lt;p&gt;You add it.&lt;/p&gt;

&lt;p&gt;A larger customer wants to pay for 15 employees, so you introduce seat-based pricing.&lt;/p&gt;

&lt;p&gt;You add that too.&lt;/p&gt;

&lt;p&gt;Then you start accepting customers in Nigeria, so you need naira pricing alongside your dollar pricing.&lt;/p&gt;

&lt;p&gt;Then you add Paystack alongside Stripe.&lt;/p&gt;

&lt;p&gt;None of these decisions are unreasonable.&lt;/p&gt;

&lt;p&gt;They're signs that the business is growing.&lt;/p&gt;

&lt;p&gt;But now look at what happened to that original $20/month plan.&lt;/p&gt;

&lt;p&gt;What started as one pricing rule is now connected to plans, currencies, seats, billing periods, and payment processors.&lt;/p&gt;

&lt;p&gt;The business changed.&lt;/p&gt;

&lt;p&gt;But the billing logic is still living in the architecture you built when the business had one plan.&lt;/p&gt;

&lt;p&gt;This is where technical debt starts hiding&lt;/p&gt;

&lt;p&gt;Technical debt doesn't always look like broken code.&lt;/p&gt;

&lt;p&gt;Sometimes everything works.&lt;/p&gt;

&lt;p&gt;Customers can subscribe.&lt;/p&gt;

&lt;p&gt;Payments go through.&lt;/p&gt;

&lt;p&gt;Invoices look right.&lt;/p&gt;

&lt;p&gt;Nobody is complaining.&lt;/p&gt;

&lt;p&gt;Until someone says:&lt;/p&gt;

&lt;p&gt;«"We want to change our pricing."»&lt;/p&gt;

&lt;p&gt;Now changing a business decision means changing the code that was written to support the old decision.&lt;/p&gt;

&lt;p&gt;And the problem isn't necessarily that the original code was bad.&lt;/p&gt;

&lt;p&gt;It solved the problem you had at the time.&lt;/p&gt;

&lt;p&gt;The problem is that the solution was never given somewhere to evolve.&lt;/p&gt;

&lt;p&gt;The code starts carrying your pricing history&lt;/p&gt;

&lt;p&gt;At first, your application might only need to understand:&lt;/p&gt;

&lt;p&gt;«Customer is on Plan A → charge $20.»&lt;/p&gt;

&lt;p&gt;Then it becomes:&lt;/p&gt;

&lt;p&gt;«Customer is on Plan A → charge $20 monthly, or $200 annually.»&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;p&gt;«If they're on the team plan, charge based on seats.»&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;p&gt;«If they're paying in naira, use the naira price.»&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;p&gt;«If they're paying through Paystack, use this implementation.»&lt;/p&gt;

&lt;p&gt;And suddenly, your application isn't just running your product.&lt;/p&gt;

&lt;p&gt;It's carrying every pricing decision the business has made.&lt;/p&gt;

&lt;p&gt;The problem isn't that there are more rules.&lt;/p&gt;

&lt;p&gt;It's that those rules can end up scattered across your application, database, pricing UI, and payment-provider integrations.&lt;/p&gt;

&lt;p&gt;So the next pricing change isn't just a business decision.&lt;/p&gt;

&lt;p&gt;Someone has to find where that decision lives in the codebase.&lt;/p&gt;

&lt;p&gt;That's the separation that's easy to miss&lt;/p&gt;

&lt;p&gt;Your application has a job.&lt;/p&gt;

&lt;p&gt;It needs to know what a customer can do.&lt;/p&gt;

&lt;p&gt;Your billing layer has a different job.&lt;/p&gt;

&lt;p&gt;It needs to know what that customer should pay.&lt;/p&gt;

&lt;p&gt;And your payment processor has another job.&lt;/p&gt;

&lt;p&gt;It needs to process the transaction.&lt;/p&gt;

&lt;p&gt;When those responsibilities are tightly coupled, a change in one area starts creating work in the others.&lt;/p&gt;

&lt;p&gt;Add a new plan, and you touch the application.&lt;/p&gt;

&lt;p&gt;Add another currency, and you touch the payment integration.&lt;/p&gt;

&lt;p&gt;Add another processor, and you implement the pricing logic again.&lt;/p&gt;

&lt;p&gt;That's how "just for now" turns into infrastructure you don't want to touch.&lt;/p&gt;

&lt;p&gt;What if pricing had somewhere else to live?&lt;/p&gt;

&lt;p&gt;Your business should be able to define its pricing without having to care which processor ultimately collects the money.&lt;/p&gt;

&lt;p&gt;You should be able to configure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your plans&lt;/li&gt;
&lt;li&gt;Recurring prices&lt;/li&gt;
&lt;li&gt;Currencies&lt;/li&gt;
&lt;li&gt;Seat-based pricing&lt;/li&gt;
&lt;li&gt;The payment processors you support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;in one place.&lt;/p&gt;

&lt;p&gt;Then your application can focus on the business logic that actually makes your SaaS unique.&lt;/p&gt;

&lt;p&gt;That's the problem AoraHQ is built around.&lt;/p&gt;

&lt;p&gt;You connect the payment processors you already use by adding their credentials to the AoraHQ dashboard.&lt;/p&gt;

&lt;p&gt;Then you configure your pricing there.&lt;/p&gt;

&lt;p&gt;Whether you're using Stripe and Paystack for dollar and naira payments, or PayPal and Flutterwave, you don't have to manually recreate the same pricing logic for each processor.&lt;/p&gt;

&lt;p&gt;Once your pricing is configured, you copy your AoraHQ secret credentials into your application and use the AoraHQ pricing UI.&lt;/p&gt;

&lt;p&gt;Your payment processors still process the payments.&lt;/p&gt;

&lt;p&gt;Your application still handles your actual product and business logic.&lt;/p&gt;

&lt;p&gt;AoraHQ handles the pricing and billing layer in between.&lt;/p&gt;

&lt;p&gt;Because hard-coding your first pricing plan isn't bad engineering.&lt;/p&gt;

&lt;p&gt;Forgetting that your pricing will eventually change is.&lt;/p&gt;

&lt;p&gt;Your MVP can be temporary.&lt;/p&gt;

&lt;p&gt;Your pricing shouldn't have to be trapped inside it.&lt;/p&gt;

&lt;p&gt;How did your first billing implementation hold up as your SaaS grew?&lt;/p&gt;

&lt;p&gt;Did you eventually have to rewrite it, or did you manage to evolve it without touching everything else?&lt;/p&gt;

</description>
      <category>saas</category>
      <category>stripe</category>
      <category>coding</category>
    </item>
  </channel>
</rss>
