Kuroshi1

Untitled

Sep 28th, 2025 (edited)
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.93 KB | None | 0 0
  1. ▌ 💰 Monetization Recap (what we discussed)
  2. ▌ 🌱 Free Tier (hook → growth)
  3. ▌
  4. ▌ AI tailoring (JD → resume) → basic rewrites + keyword check.
  5. ▌
  6. ▌ 1 resume upload active (draft or published).
  7. ▌
  8. ▌ Directory access → preview only:
  9. ▌
  10. ▌ See role, YOE, level, some companies.
  11. ▌
  12. ▌ Blurred/partial resume preview (e.g., first few bullets only).
  13. ▌
  14. ▌ Saved resumes → up to 3 saves.
  15. ▌
  16. ▌ Verification → can upload, but no premium incentives.
  17. ▌
  18. ▌ Export → text-only copy-paste (no DOCX/PDF).
  19. ▌
  20. ▌ 🚀 Pro Tier ($15/mo or $120/yr)
  21. ▌
  22. ▌ Unlimited AI tailoring → advanced rewrites, “make mine like this” (Phase 2).
  23. ▌
  24. ▌ Unlimited uploads & versions.
  25. ▌
  26. ▌ Directory full access → full resume view, all bullets, all companies, high-res previews.
  27. ▌
  28. ▌ Filters unlocked → by role, skills, industry, company, YOE.
  29. ▌
  30. ▌ Verification bonuses → badges (LinkedIn, Outcome Verified, Company Verified) visible prominently.
  31. ▌
  32. ▌ Saved resumes → unlimited saves + collections (folders later).
  33. ▌
  34. ▌ Export formats → DOCX/PDF (when you add them).
  35. ▌
  36. ▌ Early access to add-ons (cover letters, LinkedIn tailoring, interview prep).
  37. ▌
  38. ▌ 🏢 Future Team/Recruiter Plan
  39. ▌
  40. ▌ (not MVP, but we discussed it)
  41. ▌
  42. ▌ Recruiter dashboards.
  43. ▌
  44. ▌ Anonymized aggregated insights (resume → interview/offer conversion).
  45. ▌
  46. ▌ Employer-verified outcomes feed.
  47. ▌
  48. ▌ Data API access.
  49. ▌
  50. ▌ Custom pricing.
  51. ▌
  52. ▌ 🎯 Key Gating (MVP → what to enforce now)
  53. ▌
  54. ▌ ✅ Directory
  55. ▌
  56. ▌ Free = preview only, blurred details, limited companies shown.
  57. ▌
  58. ▌ Pro = full view, all filters, verified resumes.
  59. ▌
  60. ▌ ✅ Saves
  61. ▌
  62. ▌ Free = max 3.
  63. ▌
  64. ▌ Pro = unlimited (collections later).
  65. ▌
  66. ▌ ✅ Uploads
  67. ▌
  68. ▌ Free = 1 active.
  69. ▌
  70. ▌ Pro = unlimited.
  71. ▌
  72. ▌ ✅ Tailor
  73. ▌
  74. ▌ Free = limited runs (credits, e.g., 2).
  75. ▌
  76. ▌ Pro = unlimited.
  77. ▌
  78. ▌ (Phase 2: “make mine like this” AI mode = Pro-only).
  79. ▌
  80. ▌ ✅ Exports
  81. ▌
  82. ▌ Free = text only.
  83. ▌
  84. ▌ Pro = DOCX/PDF (once implemented).
  85. ▌
  86. ▌ ⚖️ Why this mix works
  87. ▌
  88. ▌ Free tier feels generous enough to hook (tailoring + preview directory).
  89. ▌
  90. ▌ Pro tier is obvious for anyone serious: if you’re job-hunting, you need full resumes, saves, unlimited tailoring.
  91. ▌
  92. ▌ Your moat (directory + verification) is monetized without blocking growth (free previews still attract uploads). what
  93. ▌ do you think about some of this? let's have a discussion
  94.  
  95. > Love how you’ve framed it. The mix feels “useful but itchy” for Free, and Pro is clearly where serious job seekers
  96. land. A few thoughts and clarifying questions so we can lock the implementation plan:
  97.  
  98. Overall Structure
  99.  
  100. - Free tier: gives people a taste of everything (tailor, directory, saves) but every surface has a ceiling or teaser.
  101. That keeps acquisition strong and showcases the value of Pro.
  102. - Pro tier: obvious upgrade path—if you’re actively job hunting or exploring multiple resumes, the limitations push
  103. you to upgrade.
  104.  
  105. Directory gating
  106.  
  107. - Free preview: blur or truncate the resume content, show limited companies, and hide verification badges unless paid?
  108. Or maybe badges stay visible to signal trust, but detailed verification info stays gated.
  109. - Filters: we can expose the UI but disable certain filters with a tooltip (“Upgrade to Pro to unlock industry
  110. filters”). That drives curiosity and upgrades. Your call whether to show the controls grayed-out or hide them
  111. entirely.
  112.  
  113. Uploads
  114.  
  115. - “1 active resume” for Free means: user can upload one resume (draft or published). If they want to upload a second,
  116. do we ask them to archive the first or prompt upgrade? Archive-only could be frustrating; I’d lean toward prompting
  117. upgrade while offering archive as an option.
  118.  
  119. Saves
  120.  
  121. - Enforcing “3 saves free” is easy via Supabase count check before insert. Nice mid-funnel nudger.
  122.  
  123. Tailoring
  124.  
  125. - 2 credits for Free is a great sticky mechanism. We can track per-user usage (Supabase table with daily/monthly
  126. counters). On run attempt, check credit balance. After upgrade, remove the cap.
  127. - Suggestion: since we already plan to add rate limiting, we can roll credits into the same mechanism (keyed by tier).
  128.  
  129. Exports
  130.  
  131. - That’s more future-facing, but we can stub the logic now (e.g., disable buttons with “coming soon in Pro” notes) to
  132. remind users of the value.
  133.  
  134. Verification bonuses
  135.  
  136. - Even if verification uploads are allowed on Free, we should make the payoff (badge prominence, directory callouts)
  137. yes (Supabase RLS + DB constraint or API check).
  138. - Upload cap: Should we block the upload button for Free once they hit the limit (with upgrade modal), or allow them
  139. to archive existing resumes to free the slot?
  140.  
  141. ▌ questions + answers I'm thinking maybe blur half the resume or something? i feel that seeing all the badges/chips is
  142. ▌ what will make people want to see.
  143. ▌
  144. ▌ yes we'll offer upgrade and archive when over 1 resume uploaded
  145. ▌
  146. ▌ anything future we can punt for now. maybe add it to the pricing pro section saying future
  147. ▌
  148. ▌ do we want a new supabase table or can we use the existing auth table?
  149. ▌
  150. ▌ Answers to your questions
  151. ▌
  152. ▌ - whatever will be unbreakable. blur is nice if they can't get around it
  153. ▌ - let's say they get 2/month
  154. ▌ - saved resumes yes we will gate in the api/with supabase
  155. ▌ - based on what we said above, i'm thinking they can archive to free up the slot
  156.  
  157. • Explored
  158. └ Search plan
  159. Read schema-resumes.sql, server.ts, types.ts, useSavedResumes.tsx, useResumesWithVotes.ts
  160.  
  161. • I'll design a multi-step approach to manage free vs pro plans, including database schema changes, API usage checks,
  162. and client-side plan fetching with UI gating based on the user's plan status. This involves creating a user_profiles
  163. table, usage tracking, and tailoring directory views and filters accordingly.
  164.  
  165. • Explored
  166. └ Read DirectoryFilters.tsx, ResumeCard.tsx
  167.  
  168. • I’m mapping out a detailed plan to gate resume data and features based on user subscription tiers, like limiting
  169. displayed skills and companies for free users with blurred overlays. This involves creating new database tables for
  170. user profiles and usage tracking, extending backend queries or adding API routes to securely serve truncated data, and
  171. updating front-end hooks to respect subscription levels. There’s quite a bit to coordinate here—especially to ensure
  172. gating is both effective and performant—so I’m preparing a thoughtful design to discuss next before implementation.
  173.  
  174. > Love this direction—tier gating feels well balanced and we can implement it in a way that’s both enticing and hard to
  175. bypass. Here’s how I’d shape it given your answers:
  176.  
  177. Directory gating
  178.  
  179. - Keep verification badges visible in Free (they’re strong upgrade bait), but trim the actual content: show only top
  180. two companies/skills, replace the rest with “Locked — Upgrade to Pro”.
  181. - For previews, safest path is to never deliver the full preview URL to Free. Instead, return null (show upgrade
  182. overlay) or store a separate blurred image in the public bucket and serve that for Free. If we blur client-side we’d
  183. still leak the raw image via network.
  184. - Hide the advanced filters (role/skills/industry/company/YOE) for Free; show a grayed-out “Unlock filters with Pro”
  185. block so users know the feature exists.
  186.  
  187. Uploads
  188.  
  189. - Allow Free users to archive to free the one slot; when they try to add a second active resume, prompt upgrade with
  190. “Archive current resume or upgrade to Pro for unlimited uploads.”
  191.  
  192. Tailor credits
  193.  
  194. - Track runs in a tailor_usage table keyed by user_id + period_start (start of current month). Increment on each run;
  195. Free stops at 2, Pro gets to skip the check. That also sets us up nicely for future daily/weekly limits.
  196.  
  197. Saved resumes
  198.  
  199. - Enforce the 3-save cap in the API layer (or via RLS). UI can warn early, but the backend must reject anything beyond
  200. 3 for Free.
  201.  
  202. Data model
  203.  
  204. - Introduce a lightweight public.user_profiles (or user_subscriptions) table referencing auth.users. Columns: plan
  205. ('free' | 'pro'), optional plan_renews_at, timestamps. Default to free.
  206. - Later, Stripe webhook can upsert into this table; for now we can manually toggle plan for testing.
  207.  
  208. Capability helper
  209.  
  210. - Add lib/subscriptionPlans.ts (or similar) with a map of plan → capabilities (maxUploads, maxSaves, tailorQuota…).
  211. That way both API routes and the UI can stay in sync.
  212.  
  213. Gating surfaces for MVP
  214.  
  215. 1. Directory API: create a Next.js route that fetches resumes via the server Supabase client, checks plan, and returns
  216. either full or truncated payload. This avoids leaking locked fields over the network. Client hook consumes the API
  217. instead of hitting Supabase directly.
  218. 2. Saved resumes API: add a tiny server route that enforces the 3-save cap and wraps Supabase upsert/delete so Free
  219. users can’t bypass the limit.
  220. 3. Tailor endpoint: before calling OpenAI, fetch plan and current month usage; deny request if Free quota exceeded,
  221. otherwise increment usage count.
  222. 4. Upload flow: before allowing publish, check active resume count against plan. If Free has 1 active, prompt to
  223. archive or upgrade.
  224.  
  225. Blur vs truncate
  226.  
  227. - Since you want it “unbreakable,” I’d avoid delivering sensitive data to the client at all. Truncate arrays (e.g.,
  228. offer_companies.slice(0, 2)), drop file_url, and omit preview_image_url. In the UI, we can display placeholders
  229. implying more content exists. When we do have blurred previews stored separately, we can safely serve them to Free.
  230.  
  231. Next steps (suggested order)
  232.  
  233. 1. Add the new Supabase tables (user_profiles, tailor_usage; optional SQL script update + types).
  234. 2. Build plan helper + server utility to fetch current user plan (with default).
  235. 3. Implement directory API route + update client hook to consume it (with gating logic and upgrade prompts).
  236. 4. Enforce saved resume cap via API.
  237. 5. Enforce upload cap and tailor usage quota.
  238.  
  239. If that sequence sounds good, I’ll start with step 1: add the user_profiles and tailor_usage tables (SQL + types) and
  240. wire the plan helper. Want me to proceed?
  241.  
  242. -----------------------------------------------------------------------------------------------------------------------------
  243.  
  244. ▌ is anybody going to use this app if theyh can't see resumes?
  245.  
  246. > Totally fair question. The current gating is intentionally “preview mode” to tease what’s behind the paywall, but it
  247. still needs to deliver enough value to hook people. A few ways to make the free tier feel rewarding without giving
  248. everything away:
  249.  
  250. 1. Make the preview compelling, not frustrating
  251.  
  252. - Keep badges, tagged companies, and a couple of bullets visible so users can sense quality.
  253. - Let free users open a limited number of full resumes per week (e.g., 3) before hitting the paywall. That “first
  254. taste” can be what actually converts.
  255. - Consider leaving high-res thumbnails visible but blurred only in the drawer so the home grid still looks rich.
  256.  
  257. 2. Earn their trust
  258.  
  259. - Highlight one or two sample resumes (/directory/{id}?demo=true) that free users can browse end-to-end. Seeing what
  260. “full access” looks like builds confidence in upgrading.
  261. - Showcase testimonials or “This resume led to X interview” snippets to prove value.
  262.  
  263. 3. Align gating with use cases
  264.  
  265. - Job seekers want comparisons: maybe allow the first resume per search filter to show the top bullet, then mask the
  266. rest. Enough to get a sense, not enough to copy.
  267. - If users are uploading their own resume, consider granting temporary full access for that upload session (e.g., 72
  268. hours) so they understand the platform’s value.
  269.  
  270. 4. Communicate the upgrade story
  271.  
  272. - In the preview drawer, make the messaging empathetic: “You’re seeing a limited snapshot. Upgrade to read how this
  273. candidate pitched their Amazon offer.” It feels less like a brick wall.
  274.  
  275. 5. Track behavior quickly
  276.  
  277. - Instrument which elements free users interact with (open drawer, click upgrade, bounce). If the drop-off is high,
  278. relax the gating (e.g., raise saved-resume limit, show more info) while you refine the paywall.
  279.  
  280. In short, the free tier should still let people:
  281.  
  282. - Browse real resumes (with partial visibility)
  283. - Run a limited number of AI tailoring sessions
  284. - Save a few favorites
  285. - Experience the UI/UX end-to-end
  286.  
  287. The paywall then upsells deeper insights, unlimited access, and productivity boosters. If you think this balance still
  288. feels too restrictive once we get feedback, we can tweak quickly—e.g., allow one full resume view per day, or show a
  289. rotating “Featured Pro resume” completely unlocked.
  290.  
  291. Let’s observe how users react, then iterate—happy to adjust the gating logic once we see real usage data.
Advertisement
Add Comment
Please, Sign In to add comment