The Problem I Wanted to Solve
As someone who has worked with agencies and freelancers, I noticed a consistent pain point: collecting and displaying client testimonials was always a messy process. People would screenshot LinkedIn recommendations, copy-paste emails into documents, or just... never collect testimonials at all.
The existing tools were either too expensive (charging $20-50/month for something that should be simple) or too complicated for the average user. I wanted to build something that was dead simple, looked great, and didn't require a monthly subscription eating into your profits.
The Tech Stack
I chose technologies that would let me move fast while still building something production-ready:
- Next.js 14 - React framework with App Router for the frontend and API routes
- TypeScript - Type safety from day one (trust me, it saves time)
- Tailwind CSS - Rapid UI development without fighting CSS
- Prisma - Type-safe database ORM that just works
- Supabase - PostgreSQL database + authentication
- Vercel - Deployment and hosting
- Stripe - Payment processing
- Cloudflare R2 - File storage for videos and images
This stack might seem like a lot, but each piece serves a specific purpose and they all integrate beautifully together. The total monthly cost for infrastructure? Under $20 until I hit serious scale.
Week 1: Core Functionality
The first week was all about getting the core loop working: users should be able to create a workspace, generate a collection form, and receive testimonial submissions.
I started with the database schema - users, workspaces, forms, and submissions. Getting this right early is crucial because changing your data model later is painful. I spent a full day just thinking through relationships and edge cases.
By the end of week 1, I had a working prototype where someone could submit a text testimonial through a form, and it would appear in the dashboard awaiting approval.
Week 2: Polish and Features
Week 2 was about making the product actually useful. I added:
- Video testimonial uploads with automatic thumbnail generation
- Screenshot testimonials for capturing social proof from other platforms
- Approval workflow (pending → approved/rejected)
- Embeddable widgets that work on any website
- The "Wall of Love" public page for each workspace
The widget system was the trickiest part. I needed to create JavaScript files that could be embedded on any website without breaking anything. This meant no dependencies, careful CSS isolation, and handling all sorts of edge cases.
Week 3: Payments and Plans
Week 3 was all about the business model. I decided on lifetime deals instead of subscriptions for a few reasons:
- Lower barrier to entry for customers
- Simpler to implement (one-time payments are easier than subscription management)
- Better for indie hackers and freelancers who hate recurring costs
- Creates urgency for the launch ("lifetime deal, limited time")
Stripe made payment integration surprisingly smooth. The webhook handling took some debugging (tip: make sure your webhook URL matches your production domain exactly, including www), but once it worked, it was rock solid.
Week 4: Launch Prep
The final week was about all the things you forget until the last minute:
- Help documentation (way more work than you'd think)
- SEO basics - sitemap, meta tags, Open Graph images
- Error handling and edge cases
- Mobile responsiveness fixes
- Testing the full user flow, over and over
I also spent time on the landing page and pricing page. First impressions matter, and you only get one shot to convince someone your product is worth their money.
Lessons Learned
1. Ship faster than you think you should
There are features I wanted to add but didn't. Filters on the Wall of Love. Social sharing buttons. Analytics dashboards. But none of that matters if nobody uses the product. Ship the core value proposition first, then iterate based on real user feedback.
2. Documentation is a feature
I almost skipped writing help docs. "The product is intuitive enough," I told myself. Wrong. Good documentation reduces support burden, builds trust, and helps users get value from your product faster. Write the docs.
3. Test payments early
I left Stripe integration until week 3 and ran into issues with webhooks, environment variables, and production vs test mode. Test your payment flow in production (with real test cards) before you announce your launch.
4. The details matter
Open Graph images for link previews. Proper error messages. Loading states. These "small" things add up to create a professional product that people trust with their money.
What's Next
ProofLayer is live and I'm actively collecting feedback from early users. The roadmap includes:
- More widget customization options
- Filtering and search on the Wall of Love
- Import testimonials from Google Reviews, G2, etc.
- AI-powered testimonial highlights
- Team collaboration features
But the priority right now is listening to users and making sure the core product is rock solid.
Try It Out
If you're an agency, freelancer, or anyone who needs to collect and display testimonials, I'd love for you to try ProofLayer. There's a free trial, and the lifetime pricing means you'll never pay another monthly fee.
Curtis Ewalt
Founder of ProofLayer
Building tools for creators and businesses. Sharing the journey of building in public.
Follow on X