Blog Post

Case Study - Upshore Full-Stack Architecture

β€’
6 min read

πŸ“‹ Executive Summary

This case study chronicles the transformation of Upshores, a platform designed to help job seekers craft optimized resumes and land global remote jobs. We built a production-grade full-stack web application featuring AI-powered resume generation, user subscription management, a multi-role dashboard, and dynamic job listings using a scalable and secure architecture.

Key Results:

  • 🧠 AI resume generation delivering ATS-optimized resumes within seconds
  • βš™οΈ Fully managed authentication system with JWT and Google OAuth
  • πŸ“ˆ Scalable MongoDB data model for user profiles, resumes, and subscription plans
  • πŸ’³ Stripe-integrated subscription + pay-per-credit billing system
  • πŸ“‚ Secure file export options (PDF/DOCX) for generated resumes
  • πŸ§ͺ Seamless frontend-backend integration with robust CRUD and mutation logic

🚨 THE PROBLEM

Business Challenge

Upshores aimed to offer a resume-building platform with global appeal, but several challenges existed at the outset:

Pain Points:

  • No existing resume-generation infrastructure
  • AI-generated resumes lacked structure or job-targeting logic
  • Manual resume formatting was time-consuming for users
  • Users had no account system to store resume drafts or histories
  • No payment structure to monetize advanced AI capabilities

Technical Challenges

  1. No backend system – no database or API logic for resume storage, updates, or retrieval
  2. Unscalable resume format logic – required a structured, templated, data-driven approach
  3. No billing system – needed both subscription and pay-per-credit monetization
  4. No CI/CD or deployment strategy
  5. Auth friction – needed Google OAuth and JWT flows
  6. Complex document rendering – resumes needed to export to PDF and DOCX

Business Impact

  • Limited market entry due to infrastructure gaps
  • Time-consuming manual resume creation process
  • No user retention due to lack of profiles or storage
  • Lost revenue opportunities due to lack of billing logic

πŸ’‘ THE SOLUTION

Solution Overview

We built a full-stack web application using modern technologies, with server-side rendering, rich text editing, AI resume generation, and secure Stripe billing for monetization.


🧱 TECHNOLOGY STACK

πŸ”§ Backend

  • Language: Node.js (ES Modules)
  • Framework: Express.js
  • Database: MongoDB + Mongoose ODM
  • Auth: JWT-based + Google OAuth 2.0
  • File Export: html-pdf, html-docx-js
  • AI Resume Generation: Claude AI (via AWS Bedrock)
  • Email: Nodemailer + Gmail SMTP
  • Billing: Stripe (subscription + credit-based purchases)
  • CI/CD: GitHub Actions

🎨 Frontend

  • Framework: React.js (Vite + TypeScript)
  • Styling: Tailwind CSS
  • Routing: React Router DOM
  • State Management: React Query + Redux Toolkit
  • Rich Text Editor: React Quill
  • PDF Preview: @react-pdf/renderer
  • Notifications: react-toastify
  • Charts: Recharts for resume analytics

πŸ› οΈ IMPLEMENTATION

Database Schema Design

User Schema:

{
  email,
  passwordHash,
  googleId,
  subscriptionStatus,
  currentCredits,
  refreshToken,
  ...
}

Resume Schema:

{
  userId,
  templateId,
  title,
  workExperience: [...],
  education: [...],
  skills: [...],
  generatedHtml,
  downloadHistory,
  ...
}

Subscription Schema:

{
  userId,
  stripeCustomerId,
  subscriptionType,
  currentPeriodStart,
  currentPeriodEnd,
  cancelAtPeriodEnd,
}


Authentication Implementation

  • Google OAuth Integration
  • JWT Auth Flow (Access + Refresh Tokens)
  • Secure Cookie-Based Sessions for Refresh Token

Endpoints:

  • /api/auth/login
  • /api/auth/google
  • /api/auth/refresh-token
  • /api/auth/logout

Resume Generation Pipeline

  1. User selects job title and job description
  2. Sends input to backend prompt generator
  3. AWS Claude AI is called with resume-generation prompt
  4. Response parsed and rendered into structured HTML template
  5. Stored in MongoDB under user profile

Stripe Billing Flow

  • Subscription Plans: Basic (Free), Pro (Monthly/Yearly)
  • One-Time Purchases: Buy extra resume generation credits
  • Webhooks Listened:
    • checkout.session.completed
    • customer.subscription.updated
    • customer.subscription.deleted
  • Frontend Logic:
    • Display current plan, renewals, cancel toggle
    • Buy credits modal with two price options
  • Security:
    • Backend validates webhook signatures and updates DB

Deployment Strategy

Frontend (Vite App):

  • Hosted on AWS Amplify
  • Optimized for speed using pre-rendering and dynamic route splitting

Backend (Node/Express App):

  • Deployed on AWS EC2 (Ubuntu 22.04)
  • Nginx reverse proxy + PM2 process manager
  • .env secrets securely stored via AWS SSM
  • Deployed using GitHub Actions

πŸ“Š THE RESULTS

Performance Improvements

FeatureBeforeAfter
Resume GenerationManual editing5s AI-generated resumes
Resume DownloadsN/A1-click PDF + DOCX export
Resume SavingNot availableVersioned resume history
AuthEmail-onlyGoogle OAuth + JWT
DeploymentManualGitHub CI/CD Pipeline

Cost Analysis

Monthly Costs:
β”œβ”€β”€ AWS EC2 (t3.medium)                 $15.00
β”œβ”€β”€ AWS Amplify (frontend hosting)      Free tier
β”œβ”€β”€ MongoDB Atlas (Shared Cluster)     $10.00
β”œβ”€β”€ Claude AI (AWS Bedrock)            ~$20.00
β”œβ”€β”€ Stripe Fees                        ~2.9% + $0.30/txn
└── Domain + Email (Gmail)             $6.00

Total Infrastructure: ~$51/month


πŸ”’ SECURITY ACHIEVEMENTS

  • βœ… JWT-based secure access token flow
  • βœ… Secure cookies for refresh tokens
  • βœ… Role-based access to dashboard
  • βœ… Stripe webhook signature validation
  • βœ… Rate-limiting on sensitive endpoints
  • βœ… Environment variable encryption via AWS

πŸ“ˆ BUSINESS IMPACT

  • πŸš€ Launched to early adopters within 30 days
  • πŸ“„ 1000+ resumes generated in beta
  • πŸ’Έ Monetization started with both recurring and one-time payments
  • 😌 Reduced resume-writing time for users from hours to under 10 minutes
  • πŸ“¬ Increased email signups via resume download gating

🧠 KEY LEARNINGS & BEST PRACTICES

What Worked Well

  • Modular schema design enabled easy feature addition
  • JWT + Google OAuth combo delivered seamless UX
  • Stripe integration supported multiple pricing strategies
  • Prompt engineering with Claude AI gave high-quality resume outputs
  • React Query + Tailwind simplified UI responsiveness

Challenges Overcome

  • Docx export compatibility required multiple libraries before success
  • AI prompt tuning took multiple iterations to align with resume formatting
  • Credit-based billing was tricky to sync across Stripe + DB state
  • Real-time resume preview and export without UI lags needed optimization

πŸ“Ž Conclusion

Upshores was built with scalability, monetization, and usability in mind from day one. By combining modern DevOps, AI tools, and thoughtful UX design, we created a platform that helps job seekers globally produce polished, job-targeted resumes in minutesβ€”not hours.

This is just the beginning for Upshores. The infrastructure is ready to scale, and the foundation is solid for future integrations, such as LinkedIn import, resume scoring, and job matching AI.