<?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: Yash-Boldhane</title>
    <description>The latest articles on DEV Community by Yash-Boldhane (@yashboldhane99).</description>
    <link>https://dev.to/yashboldhane99</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3921839%2F85d4dfb3-b71d-4a0f-94b4-bb7b93bb343e.png</url>
      <title>DEV Community: Yash-Boldhane</title>
      <link>https://dev.to/yashboldhane99</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yashboldhane99"/>
    <language>en</language>
    <item>
      <title>I built a SaaS for freelancers in my spare time — here's what I learned</title>
      <dc:creator>Yash-Boldhane</dc:creator>
      <pubDate>Sat, 09 May 2026 12:51:44 +0000</pubDate>
      <link>https://dev.to/yashboldhane99/i-built-a-saas-for-freelancers-in-my-spare-time-heres-what-i-learned-1pai</link>
      <guid>https://dev.to/yashboldhane99/i-built-a-saas-for-freelancers-in-my-spare-time-heres-what-i-learned-1pai</guid>
      <description>&lt;h2&gt;
  
  
  The Problem I Was Trying to Solve
&lt;/h2&gt;

&lt;p&gt;I'm a freelancer. And like most freelancers, I was using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WhatsApp to send files to clients&lt;/li&gt;
&lt;li&gt;PayPal to collect payments (and lose 3-5% in fees)&lt;/li&gt;
&lt;li&gt;Gmail for invoices (copy-pasting from a Word doc)&lt;/li&gt;
&lt;li&gt;DocuSign for contracts ($25/month just for e-signatures)&lt;/li&gt;
&lt;li&gt;Random Google Drive folders for file sharing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It looked unprofessional. Clients lost things. I chased &lt;br&gt;
payments for weeks.&lt;/p&gt;

&lt;p&gt;I couldn't find one tool that did everything at a price &lt;br&gt;
that made sense for a solo freelancer.&lt;/p&gt;

&lt;p&gt;So I built it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PortalFlow&lt;/strong&gt; — a client portal for freelancers.&lt;/p&gt;

&lt;p&gt;Each client gets a unique portal link. Inside that link they can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ View and pay invoices online (Stripe payments)&lt;/li&gt;
&lt;li&gt;✅ Download shared files&lt;/li&gt;
&lt;li&gt;✅ View and sign contracts&lt;/li&gt;
&lt;li&gt;✅ See everything in one professional page&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You (the freelancer) get a dashboard to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create and send invoices&lt;/li&gt;
&lt;li&gt;Upload and share files&lt;/li&gt;
&lt;li&gt;Write contracts and send for signature&lt;/li&gt;
&lt;li&gt;Get paid directly to your Stripe account&lt;/li&gt;
&lt;li&gt;Send automatic payment reminders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All for $7/month. Less than one DocuSign subscription.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Tech Stack
&lt;/h2&gt;

&lt;p&gt;Here's everything I used to build it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frontend&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React 19 (Create React App)&lt;/li&gt;
&lt;li&gt;TailwindCSS for styling&lt;/li&gt;
&lt;li&gt;React Router for navigation&lt;/li&gt;
&lt;li&gt;Deployed on Vercel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Backend / Database&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supabase (PostgreSQL + Auth + File Storage)&lt;/li&gt;
&lt;li&gt;Row Level Security for data isolation&lt;/li&gt;
&lt;li&gt;Supabase Auth for user management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Payments&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stripe Checkout for invoice payments&lt;/li&gt;
&lt;li&gt;Each freelancer connects their own Stripe account&lt;/li&gt;
&lt;li&gt;Payments go directly to the freelancer — no platform cut&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Emails&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resend for transactional emails&lt;/li&gt;
&lt;li&gt;Each freelancer uses their own Resend API key&lt;/li&gt;
&lt;li&gt;Emails sent from their own domain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hosting&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vercel (serverless functions for API routes)&lt;/li&gt;
&lt;li&gt;Zero server management&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Hardest Parts
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Per-user API keys&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The trickiest architecture decision was payments. I wanted &lt;br&gt;
payments to go directly to the freelancer — not to me first. &lt;/p&gt;

&lt;p&gt;Solution: each user stores their own Stripe secret key in &lt;br&gt;
Supabase user_metadata. When a client pays, the API looks up &lt;br&gt;
that freelancer's key and creates the Stripe session with it.&lt;/p&gt;

&lt;p&gt;No platform cut. No escrow. Money goes straight to the freelancer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Serverless functions on Vercel&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Moving from Express to Vercel serverless functions was a &lt;br&gt;
learning curve. Each file in the &lt;code&gt;api/&lt;/code&gt; folder becomes an &lt;br&gt;
endpoint. No shared state between requests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Row Level Security in Supabase&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every query in the database is automatically filtered by &lt;br&gt;
the logged-in user. No freelancer can see another &lt;br&gt;
freelancer's clients or invoices — enforced at the &lt;br&gt;
database level, not the application level.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Would Do Differently
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Start with Stripe Connect instead of per-user keys 
(more complex but more scalable)&lt;/li&gt;
&lt;li&gt;Use Next.js instead of Create React App 
(better for SEO and serverless)&lt;/li&gt;
&lt;li&gt;Build the email system last — it caused the most bugs&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Current Status
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ Live and working&lt;/li&gt;
&lt;li&gt;✅ First payments processed&lt;/li&gt;
&lt;li&gt;🔍 Looking for beta users and feedback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Live at:&lt;/strong&gt; &lt;a href="https://frontend-orpin-theta-64.vercel.app" rel="noopener noreferrer"&gt;https://frontend-orpin-theta-64.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're a freelancer or know one — I'd love for you &lt;br&gt;
to try it and tell me what's broken or missing.&lt;/p&gt;

&lt;p&gt;And if you've built something similar, I'd love to know &lt;br&gt;
what problems you ran into.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>startup</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
