DigitalAssetIdeas
Project Blueprint
A daily funnel idea platform for home improvement lead gen businesses. One idea per day, free for 24 hours, then locked behind a paywall. Built with Next.js + Convex + Clerk + Stripe.
1 Project Overview
What we're building and why.
The Concept
Every day, a new home improvement funnel idea is published with full market data, scores, and an execution plan. It's free for 24 hours. After midnight UTC, it locks behind a paywall. Founders ($67/yr locked in) or Lifetime ($97 one-time) can access the full archive of all past ideas.
This is modeled directly after IdeaBrowser.com, which does the same thing for startup ideas. We're adapting it for the home improvement lead generation niche โ HVAC, roofing, solar, ADU, plumbing, etc.
Target Audience
- Lead gen entrepreneurs โ people building rank-and-rent or per-lead businesses in home improvement
- Digital product builders โ people selling funnel templates, ad scripts, landing pages
- Home improvement contractors โ HVAC, roofing, solar companies looking for marketing ideas
Revenue Model
| Tier | Price | What They Get |
|---|---|---|
| Free | $0 | Today's idea only (24h window), daily email |
| Founder | $67/yr | All ideas, full archive, filters, search, AI tools โ price locked in forever |
| Lifetime | $97 one-time | Everything โ pay once, never pay again |
2 IdeaBrowser Research
What we learned from studying the competition.
How IdeaBrowser Works
One idea per day, free for 24 hours, then locked forever.
- The "Idea of the Day" publishes daily at midnight UTC
- Free users (just an email signup) get full access for 24 hours
- After midnight, the page redirects to a locked/expired page
- Paid members ($499โ$2,999/yr) can access ALL past ideas
The Three States of an Idea Page
๐ข Live (24h window)
Full report visible to anyone. Scores, charts, execution plan, AI chat. Timer shows "Expires at midnight UTC."
๐ก Expired (non-members)
Locked page with teaser image. "Unlock the Full Idea Report" headline. Two CTAs: "Explore Plans" + "See Today's Free Idea."
๐ต Full Access (paid)
Same pages, but logged-in paid users see everything. They also get the Idea Database (1,000+ past ideas searchable/filterable).
IdeaBrowser's Pricing
| Tier | Price | Key Features |
|---|---|---|
| Starter | $499/yr | All ideas, trends, market signals, idea generator (20/mo) |
| Pro | $1,499/yr | Starter + AI agents, research agent (3/mo), LLM connectors |
| Empire | $2,999/yr | Pro + weekly coaching, community, $50K+ tool deals |
Key Design Details
- Colors: White bg, deep purple-blue primary, orange/red for urgency, green for CTAs
- Typography: Serif for report headlines (editorial feel), sans-serif for body/UI
- Thumbnails: Mini dashboard previews with trend lines, KPI pills, colored gradients
- Locked cards: Blurred content + frosted glass "Members Only" overlay
- Auth: Magic link (email) + Google OAuth โ no passwords
What Makes It Work
- Scarcity is real โ content actually disappears, not a fake countdown
- FOMO drives daily visits โ "come back tomorrow or miss it forever"
- Email capture is frictionless โ just email, get today's idea instantly
- The teaser on the locked page shows enough to want it, not enough to use it
- The archive is the real product โ 1,000+ ideas is what you pay for
3 The 24-Hour Model
How the free โ locked โ paid flow works.
New Idea Published (midnight UTC)
Admin publishes a new idea. It becomes the "Idea of the Day" with status: "live" and expiresAt: now + 24h.
Free Access Window (24 hours)
Anyone can visit and see the full report โ no login required. The homepage shows it with "Expires at midnight UTC" urgency text.
Expiry (midnight UTC next day)
Convex cron job runs, sets status: "expired". Non-members now see the locked page with teaser + paywall CTA.
Locked Page Shown
Expired idea shows blurred preview + "๐ Members Only" overlay. Clicking opens auth modal with email/Google sign-up + pricing.
User Upgrades ($67/yr or $97 lifetime)
Clerk Billing handles Stripe checkout. Payment succeeds โ user.plan = "member". All past ideas unlock instantly (real-time, no refresh).
Full Archive Access
Paid members can browse, search, and filter all 365+ past ideas. Every new daily idea is also immediately available.
4 Tech Stack
Why we chose each piece.
| Layer | Technology | Why | Cost |
|---|---|---|---|
| Frontend | Next.js 16 (App Router) + Tailwind CSS | SSR for SEO, file-based routing, edge middleware for auth gating, latest security | $0 |
| Backend / DB | Convex | Real-time queries, TypeScript, built-in cron, no DevOps | $0 (free tier) |
| Auth | Clerk | Magic links, Google OAuth, billing built-in, beautiful UI | $0 (10K users) |
| Payments | Stripe (via Clerk Billing) | Clerk handles checkout + webhooks. No wiring needed. | 2.9% + 30ยข/txn |
| Hosting | Vercel + Convex Cloud | Zero config, free tiers, global CDN | $0 |
๐ฐ Total Monthly Cost at Launch
~$1.94 per founder sale (Stripe processing fee on $67). All infrastructure is free until you hit 10K users or 1M function calls/month.
5 Architecture
How the pieces connect.
6 Database Schema
Three tables in Convex.
The core content table. Each row is one funnel idea with full market data.
{
title: string, // "ADU permit lead gen for homeowners..."
slug: string, // "adu-permit-lead-gen-homeowners"
description: string, // Short preview (2-3 sentences)
fullReport: string, // Full markdown (LOCKED content)
publishedAt: number, // Unix timestamp ms
expiresAt: number, // publishedAt + 24h
isIdeaOfTheDay: boolean, // true for today's idea only
status: string, // "live" | "expired" | "draft"
niche: string, // "hvac", "roofing", "solar", "adu"
tags: string[], // ["high-ticket", "geo-targeted"]
scores: {
opportunity: number, // 1-10
problem: number, // 1-10
feasibility: number, // 1-10
timing: number, // 1-10
},
keyword: string, // Primary SEO keyword
searchVolume: number, // Monthly searches
growthPercent: number, // YoY growth
revenuePotential: string,// "$" | "$$" | "$$$"
executionDifficulty: number, // 1-10
goToMarket: number, // 1-10
offer: {
leadMagnet: { name: string, price: string },
frontend: { name: string, price: string },
core: { name: string, price: string },
},
createdAt: number,
updatedAt: number,
}
// Indexes: by_published, by_slug, by_niche, by_status, by_active
Synced from Clerk. Stores member level for content gating.
{
clerkId: string, // Clerk user ID
email: string,
memberLevel: string, // "free" | "member" | "premium"
stripeCustomerId: optional<string>,
subscribedAt: optional<number>,
lastLoginAt: number,
createdAt: number,
}
// Indexes: by_clerk, by_email
Tracks user engagement for "Interested", "Saved", "Building" filter tabs.
{
userId: string, // Clerk user ID
ideaId: Id<"ideas">,
type: string, // "viewed" | "interested" | "not_interested" | "saved" | "building"
createdAt: number,
}
// Indexes: by_user, by_idea, by_user_idea
7 Pages & Layouts
What each page looks like and does.
Browse Page (/ideas) โ The Main Page
This is the heart of the app. Matches IdeaBrowser's browse layout.
โ Top to bottom layout
| Layer | What's There | Details |
|---|---|---|
| 1. Header | Logo + breadcrumb + Upgrade button | 48px sticky, white bg |
| 2. Welcome | Dismissable banner with quiz CTA | White card, blue border, phone graphic |
| 3. Section | "Find Your Next Idea" + subtitle | Blue heading, gray subtitle |
| 4. Filters | 7 tabs + search + AI Suggest + All Filters | Text tabs, blue underline on active |
| 5. Results | "12 ideas" + Sort dropdown | Bold count, gray sort |
| 6. Cards | Vertical list of idea cards | Top 3 unlocked, rest locked with blur |
| 7. Pagination | Results count + page controls | Bottom of page |
Idea Card Structure (Unlocked)
Chart + KPIs
ADU permit lead gen for homeowners in restricted cities
โญ Idea of the Day Jul 1, 2026
Homeowners in cities with strict ADU regulations spend weeks navigating permit requirements...
Interested
Not Int.
Save
Idea Card Structure (Locked)
Idea Detail Page (/ideas/[slug])
Full report page with all sections: Problem, Solution, Scores, Trend chart, Offer ladder, Why Now, Proof & Signals, Market Gap, Execution Plan, Framework Fit, AI chat.
Expired Page
Shown when a free user tries to view an expired idea. Orange "Expired" badge, teaser image, "Explore Plans" + "See Today's Free Idea" CTAs.
Pricing Page (/pricing)
Clerk's <PricingTable> component renders Stripe checkout. Shows Free vs Member plans with feature comparison.
8 Components
React components to build.
| Component | Props | Description |
|---|---|---|
<IdeaCard> | idea, locked, onInteract | Full card with thumbnail, content, buttons, icons |
<IdeaThumbnail> | niche, volume, growth | Mini dashboard preview with SVG chart + KPI pills |
<LockedOverlay> | onUnlock | Frosted glass "Members Only" overlay |
<AuthModal> | isOpen, onClose | Clerk SignIn + Google OAuth + pricing note |
<FilterTabs> | activeTab, onChange | 7 tabs: All, New, For You, Interested, Saved, Building, Not Int. |
<SearchBar> | value, onChange | Debounced search input + AI Suggest + All Filters |
<Pagination> | page, total, onChange | Results count + rows per page + page nav |
<WelcomeBanner> | onDismiss | Dismissable banner with quiz CTA |
<Header> | user | Logo, breadcrumb, Upgrade button, UserButton |
9 Colors & Design Tokens
Match IdeaBrowser's palette.
Primary Palette
Grays
Usage Rules
| Element | Color |
|---|---|
| Page background | #f5f6fa (gray-50) |
| Card background | #ffffff |
| Card border | #eef0f4, 10px radius |
| Card hover | Shadow 0 2px 8px rgba(0,0,0,0.04) |
| "View Full Report" button | #3b82f6 (blue), white text |
| "Build with AI Studio" button | #0f172a (navy), white text |
| "Upgrade" button | #7c3aed (purple), white text |
| Active tab | Blue text + blue underline |
| Section heading | #1e40af (blue-dark) |
| Body text | #6b7280 (gray-500) |
| Expiry badge | #f59e0b (orange) bg |
10 Typography
| Element | Font | Size | Weight | Color |
|---|---|---|---|---|
| Page title | Inter | 22px | 700 | #1e40af |
| Card title | Inter | 15px | 700 | #0f172a |
| Card description | Inter | 12px | 400 | #6b7280 |
| Badge text | Inter | 11px | 600 | varies |
| Date/meta | Inter | 11px | 400 | #9ca3af |
| Button text | Inter | 12px | 600 | #fff |
| Filter tab | Inter | 13px | 500 | #6b7280 |
| Code/schema | JetBrains Mono | 13px | 400 | #e2e8f0 |
11 Auth Flow
Clerk handles everything. Zero custom auth code.
User clicks "Unlock Report" or "Upgrade"
Clerk's <SignIn> modal opens with email input + Google OAuth button.
Magic Link or Google OAuth
Email โ Clerk sends magic link. Google โ OAuth popup. No passwords to manage.
First sign-up creates user in Convex
Convex mutation checks if user exists, creates if not. Sets memberLevel: "free".
Clerk JWT contains user identity
Convex reads ctx.auth.getUserIdentity() in every query. No session management needed.
Key Convex Code
// convex/users.ts
export const createOrUpdateUser = mutation({
handler: async (ctx) => {
const identity = await ctx.auth.getUserIdentity();
if (!identity) throw new Error("Not authenticated");
const existing = await ctx.db.query("users")
.withIndex("by_clerk", q => q.eq("clerkId", identity.subject))
.first();
if (!existing) {
await ctx.db.insert("users", {
clerkId: identity.subject,
email: identity.email!,
memberLevel: "free", // "free" | "founder" | "lifetime"
lastLoginAt: Date.now(),
createdAt: Date.now(),
});
} else {
await ctx.db.patch(existing._id, { lastLoginAt: Date.now() });
}
},
});
12 Payment Flow
Clerk Billing connects to Stripe. No webhook wiring needed.
Create plans in Clerk Dashboard
"Free" ($0), "Founder" ($67/yr, locked in), and "Lifetime" ($97 one-time). Clerk Dashboard โ Billing โ Plans.
Connect Stripe account
Clerk Dashboard โ Billing โ Connect Stripe. One-click setup.
User clicks "Subscribe"
Clerk's <PricingTable> component renders Stripe checkout inline.
Payment succeeds
Clerk updates user.publicMetadata.plan = "founder". Convex reads this from JWT.
Cards unlock instantly
Convex real-time query detects the plan change. UI updates without page refresh. No webhooks needed.
13 24-Hour Expiry Logic
Convex cron job handles automatic expiry.
// convex/cron.ts
import { cronJobs } from "convex/server";
import { internal } from "./_generated/api";
const crons = cronJobs();
crons.interval("expire old ideas", { hours: 1 }, internal.ideas.expireOld);
export default crons;
// convex/ideas.ts
export const expireOld = mutation({
handler: async (ctx) => {
const now = Date.now();
const liveIdeas = await ctx.db.query("ideas")
.withIndex("by_status", q => q.eq("status", "live"))
.collect();
for (const idea of liveIdeas) {
if (idea.expiresAt <= now) {
await ctx.db.patch(idea._id, {
status: "expired",
isIdeaOfTheDay: false,
});
}
}
},
});
Publishing New Ideas
Admin script or dashboard publishes at midnight UTC:
- Sets
publishedAt = Date.now() - Sets
expiresAt = publishedAt + 24 * 60 * 60 * 1000 - Sets
status = "live",isIdeaOfTheDay = true - Previous day's idea auto-expires via cron
14 File Structure
digitalassetideas/
โโโ convex/
โ โโโ schema.ts # Database schema (ideas, users, interactions)
โ โโโ ideas.ts # Idea queries & mutations
โ โโโ users.ts # User queries & mutations
โ โโโ interactions.ts # User interaction tracking
โ โโโ cron.ts # Expiry cron jobs
โ โโโ auth.config.ts # Clerk auth config
โ โโโ _generated/ # Auto-generated Convex types
โโโ src/
โ โโโ app/
โ โ โโโ layout.tsx # Root layout (ClerkProvider + ConvexProvider)
โ โ โโโ page.tsx # Home โ redirect to /ideas
โ โ โโโ ideas/
โ โ โ โโโ page.tsx # Browse page (SSR)
โ โ โ โโโ [slug]/
โ โ โ โโโ page.tsx # Idea detail (SSR, checks expiry)
โ โ โโโ pricing/
โ โ โ โโโ page.tsx # Clerk PricingTable
โ โ โโโ api/
โ โ โโโ webhooks/
โ โ โโโ stripe/
โ โ โโโ route.ts # Stripe webhook (fallback)
โ โโโ components/
โ โ โโโ IdeaCard.tsx
โ โ โโโ IdeaThumbnail.tsx
โ โ โโโ LockedOverlay.tsx
โ โ โโโ AuthModal.tsx
โ โ โโโ FilterTabs.tsx
โ โ โโโ SearchBar.tsx
โ โ โโโ Pagination.tsx
โ โ โโโ WelcomeBanner.tsx
โ โ โโโ Header.tsx
โ โโโ lib/
โ โ โโโ convex.ts # Convex client setup
โ โ โโโ utils.ts # Helpers
โ โโโ middleware.ts # Clerk auth middleware (edge)
โโโ public/
โโโ .env.local
โโโ package.json
โโโ tailwind.config.ts
โโโ next.config.js
โโโ tsconfig.json
15 Environment Variables
# Convex
NEXT_PUBLIC_CONVEX_URL=https://your-deployment.convex.cloud
# Clerk
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_...
CLERK_SECRET_KEY=sk_test_...
# Stripe (if using direct Stripe instead of Clerk Billing)
STRIPE_SECRET_KEY=sk_test_...
STRIPE_WEBHOOK_SECRET=whsec_...
16 Getting Started
Step-by-step build instructions for the AI agent.
Scaffold the project
npx create-next-app@latest digitalassetideas --typescript --tailwind --app --src-dir โ install @clerk/nextjs, convex
Set up Convex
Run npx convex dev โ creates convex/ directory โ write schema.ts
Set up Clerk
Create app at clerk.com โ enable Magic Link + Google OAuth โ copy keys to .env.local โ activate Convex integration
Wire Clerk into Next.js
Create src/middleware.ts with clerkMiddleware(). Wrap layout.tsx with <ClerkProvider> + <ConvexProviderWithClerk>.
Implement schema + queries
Write convex/schema.ts, convex/ideas.ts, convex/users.ts, convex/cron.ts
Build pages + components
app/ideas/page.tsx (browse), app/ideas/[slug]/page.tsx (detail), app/pricing/page.tsx. Build components per Section 8.
Seed data + test
Run seed script with 12 sample ideas. Test free โ locked โ upgrade โ unlock flow.
Deploy
npx convex deploy โ vercel deploy โ point digitalassetideas.com DNS
17 Seed Data
12 sample ideas for testing. All home improvement lead gen niches.
| # | Title | Niche | Keyword Volume |
|---|---|---|---|
| 1 | ADU permit lead gen for homeowners in restricted cities | ADU | 14.8K |
| 2 | Roofing lead gen with drone footage previews | Roofing | 8.2K |
| 3 | HVAC seasonal tune-up funnel with geo-targeted ads | HVAC | 12.1K |
| 4 | Solar panel lead gen for new construction subdivisions | Solar | 5.4K |
| 5 | Landscape design lead gen with AI yard visualization | Lawn | 9.7K |
| 6 | Pool service route optimization + lead gen platform | Pool | 3.1K |
| 7 | Garage door replacement funnel with instant quote calculator | Garage | 6.8K |
| 8 | Pest control lead gen with seasonal pest prediction | Pest | 4.2K |
| 9 | Epoxy floor lead gen targeting garage and basement owners | Floor | 7.3K |
| 10 | Fence installation lead gen with property line estimator | Fence | 2.9K |
| 11 | Window replacement funnel with energy savings calculator | Window | 11.4K |
| 12 | Bathroom remodel lead gen with 3D design preview | Bath | 8.6K |
18 Roadmap
V1 (Launch)
- โ Browse page with filter tabs, search, pagination
- โ Idea cards with thumbnails, scores, action buttons
- โ Locked card blur effect + Members Only overlay
- โ Auth: magic link + Google OAuth via Clerk
- โ Payment: Clerk Billing โ Stripe checkout
- โ 24-hour expiry via Convex cron
- โ Idea detail page with full report
- โ Expired page with teaser + paywall CTA
V2 (Growth)
- โฌ Email digest (daily idea to inbox)
- โฌ AI-powered idea generator (custom niche + keyword)
- โฌ "Build with AI Studio" integration
- โฌ Idea feedback/rating system
- โฌ Niche-specific filtering (HVAC, roofing, solar tabs)
- โฌ Referral program (share link โ free month)
V3 (Scale)
- โฌ Mobile app (React Native + Convex)
- โฌ API for third-party integrations
- โฌ White-label licensing for agencies
- โฌ Community features (comments, discussions)
DigitalAssetIdeas Project Blueprint v1.0 โ Built with Next.js + Convex + Clerk + Stripe
Prototype: dai-browse-demo.pages.dev ยท Inspiration: ideabrowser.com