Building Rewardly: My First SaaS in Public
I spent the last month building Rewardly, an AI-powered credit card rewards optimizer for Canada. This is my first "real" SaaS — not a side project I'll abandon in three weeks, not a portfolio piece. Something I'm actually trying to turn into a business.
This is the story of how I got here, what I built, and what I learned along the way.
The Problem I Didn't Know I Had
The idea for Rewardly came from watching my girlfriend juggle four credit cards at the grocery store checkout.
She wasn't choosing randomly. She knew one card gave 4% on groceries, another gave 3% at certain stores, and a third had some convoluted points system that was "technically better" if you redeemed through their portal during a full moon.
I asked: "Is this actually worth it?"
She showed me her spreadsheet. She'd been tracking cashback for six months. The difference between using the "right" card vs. just defaulting to one card was $450/year.
That's when I realized: this isn't a hobby. This is math that matters.
But it shouldn't require a spreadsheet. It should be an app.
Why It Didn't Exist Yet
I checked. There's SaveSage in the U.S. There's MaxRewards. But nothing built for Canada.
Canadian credit cards are weird:
- Different bonus categories than U.S. cards
- More regional banks (PC Financial, Canadian Tire, etc.)
- Points programs that don't map cleanly to cashback (PC Optimum, Aeroplan)
- No centralized API to pull card data from
The U.S. apps can't just "add Canadian support." The data doesn't exist in a structured way. You have to scrape, normalize, and maintain it manually.
That's the moat. And that's why I decided to build it.
Tech Stack: Next.js + Convex (and Why I Don't Regret It)
I'm a solo founder. I don't have a team. I don't have a backend engineer. So I optimized for speed and avoiding DevOps hell.
The Stack
- Frontend: React Native + Expo (web + mobile from one codebase)
- Backend: Supabase (auth, database, edge functions)
- AI: Anthropic Claude Haiku (for "Sage," the AI advisor)
- Payments: Stripe
- Hosting: Vercel
Why This Worked
React Native Web was the right call.
I originally planned to build a web app first, then "maybe" do mobile later. But I knew mobile was where this product needed to live. So I went all-in on React Native Web from day one.
Yes, the DX is worse than pure Next.js. Yes, I had to work around some weird web quirks (Alert.alert callbacks don't fire on web, Linking.openURL in modals breaks). But now I have one codebase that works on iOS, Android, and web. No API versioning. No duplicate logic. No "web team vs. mobile team" nonsense.
Supabase was the obvious choice.
I don't want to manage a Postgres instance. I don't want to write auth flows. I don't want to set up a Redis cache. Supabase gave me:
- Built-in auth with social providers
- Row-Level Security (RLS) for multi-tenant data
- Edge functions for Stripe webhooks and AI streaming
- Real-time subscriptions (not using them yet, but the option is there)
The alternative was building everything from scratch on AWS. That's a six-month project. Supabase got me to MVP in three weeks.
Stripe was non-negotiable.
I originally considered Lemon Squeezy (easier taxes) and Paddle (handles VAT). But Stripe is the standard for a reason. Every integration tutorial assumes Stripe. Every SaaS founder knows Stripe. I didn't want to fight tooling later when I scale.
What I'd Change
I should've used Convex instead of Supabase.
I only realized this halfway through. Convex is serverless Postgres + real-time + functions in one package. It's faster than Supabase for reads, the DX is better (TypeScript-first), and the queries are way more intuitive.
But I'm too deep now. Migration would take a week. So Supabase it is.
Building the Data: 410 Cards, Manually
The hardest part wasn't the code. It was the data.
Canadian credit card data doesn't exist in a structured format. No API. No public dataset. Just bank websites with inconsistent terminology and PDFs that change every quarter.
So I built it by hand:
- Scraped 410 cards from 15+ issuers
- Normalized category names (some banks say "groceries," others say "food stores")
- Extracted fees, FX rates, welcome bonuses, and category multipliers
- Cross-referenced affiliate links (so I can actually make money on this)
This took 40 hours.
But it's the moat. No one else has this data in a queryable format. If someone wants to clone Rewardly, they need to rebuild this dataset from scratch.
The MVP: 10 Features in 3 Weeks
I gave myself a deadline: launch by end of February 2026.
Here's what I shipped in Cycle 1:
- Card Benefits — see all category multipliers at a glance
- Signup Bonus Tracker — track minimum spend requirements
- Card Compare — side-by-side comparison of up to 3 cards
- Spending Log — manual entry (until I build Plaid integration)
- Recurring Optimizer — which card to use for Netflix, Spotify, etc.
- Annual Fee Tracker — reminders before renewal
- Redemption Guide — best ways to cash out points
- Card Recommendations — AI-powered based on spending profile
- Notifications — push alerts for fee renewals and missed bonuses
- Monthly Savings Report — how much you saved (or left on the table)
Not shipped: Receipt scanning, open banking (Flinks), loyalty program stacking, voice input, Apple Wallet integration.
I wanted to ship those. But I had to draw the line. MVP doesn't mean "minimum." It means "enough to validate the problem is real."
The Revenue Model: Freemium + Affiliates
I'm not doing free-only. I'm not doing paid-only. I'm doing both.
Freemium Tiers
- Free: Core features, 3 AI messages from Sage
- Pro ($5.99/mo): Advanced analytics, unlimited Sage
- Max ($12.99/mo): Unlimited everything + priority support
- Lifetime ($49.99): Early adopter special
Affiliate Revenue
Every card recommendation includes an affiliate link. If someone applies through Rewardly, I get $50-$150 per signup (depending on the issuer).
This is the real revenue model. Subscriptions are nice. But affiliates scale faster.
Why This Works
- Free tier validates demand. If no one uses the free version, paid won't save me.
- Affiliates align incentives. I only make money if I recommend cards people actually want.
- Lifetime deal funds early development. I can build for 6 months without revenue pressure.
Lessons Learned (So Far)
1. Launch Before You're Ready
I wanted to add 10 more features before launching. I'm glad I didn't. The feedback from the first 20 users was more valuable than any feature I could've built in isolation.
Key insight: People don't care about feature count. They care about whether your app solves their problem better than a spreadsheet.
2. Data Is the Moat, Not the Code
My codebase is not special. It's React Native + Supabase. Anyone could clone the UI in a week.
But no one else has 410 Canadian credit cards in a structured database. That took 40 hours of manual work. That's the defensibility.
3. Freemium Is Harder Than It Looks
I thought: "Free tier gets users, paid tier makes money."
Reality: Free users don't convert unless you actively push them to upgrade. I had to add:
- Usage limits (3 AI messages)
- Paywalled features (advanced analytics)
- "Upgrade to Pro" CTAs in 6 places
This felt gross at first. But it's not. If the free tier solves 80% of the problem, people have no reason to pay.
4. Building in Public Works (But Not How I Expected)
I've been posting updates on Twitter and Reddit. I expected: "Wow, cool idea!"
What I got: Silence.
Then, three weeks later, someone DM'd me: "Hey, I've been following your posts. Can I beta test?"
Lesson: Building in public isn't about instant traction. It's about proving you're not going to ghost the project in two weeks.
5. The Hardest Part Is Distribution, Not Building
I shipped Rewardly in 3 weeks. I've spent the last week trying to get people to try it.
This is the part they don't tell you. Building is fun. Marketing is a grind.
I've submitted to:
- Product Hunt (preparing for launch)
- BetaList
- Indie Hackers
- r/PersonalFinanceCanada (removed for self-promo)
- r/churningcanada (pending)
Total signups so far: 23.
Paying customers: 0.
This is the dip. This is where most indie hackers quit.
What's Next
Short-term (Next 30 Days)
- Get to 100 users — focus on r/churningcanada, Canadian finance Twitter, and cold outreach to personal finance bloggers
- First paying customer — validate that someone will actually pay for this
- Stripe integration polish — fix edge cases, add invoice emails
Mid-term (Next 90 Days)
- Open banking integration — connect to Plaid/Flinks so users don't have to manually log spending
- Receipt scanning — use OCR to auto-categorize purchases
- Loyalty program stacking — track PC Optimum, Aeroplan, etc.
Long-term (This Year)
- Expand to U.S. market — 10x the TAM
- B2B tier — sell to financial advisors who want to recommend cards to clients
- Acquisition exit — if this scales, it's an obvious acquisition target for Intuit, Credit Karma, or a Canadian bank
Final Thoughts
A month ago, Rewardly was an idea. Today, it's live at rewardly.ca.
Is it perfect? No.
Is it profitable? Not yet.
Am I going to keep building it? Yes.
Because the alternative is going back to a spreadsheet. And I didn't build this to be mediocre.
If you're in Canada and you use more than one credit card, try it. If you're an indie hacker building your first SaaS, reach out. I'll tell you what I wish someone had told me.
And if you're reading this in 2027 and Rewardly is still around — I did it.
Links:
Tags: #buildinpublic #indiehacker #saas #startup #nextjs #reactnative #supabase #stripe
This post is part of my "building in public" journey. Follow along for updates, failures, and hopefully some wins.
Top comments (0)