π DECEMBER WEEK 1: COMPLETE
If you followed along, you now have:
β PostgreSQL database running
β Authentication working
β Core feature functional
β Deployed somewhere real
That's more than most "I'll build something" promises ever become.
---
π COMMUNITY PULSE
Builders who started: 200+
First deploys shared: 47
"It works!" messages: still counting
Not everyone finished. That's fine.
Week 2 is where stragglers catch up
and leaders pull ahead.
---
π― WEEK 2: FEATURE WEEK
This week we add the parts that
turn a project into a product:
Mon: Transition + catch-up day
Tue: Payment concepts (the traps to avoid)
Wed: π° Complete Stripe billing system
Thu: Analytics & feedback loops
Fri: Demo Friday #2
---
The difference between a side project
and a SaaS is one thing:
Someone can pay you.
Week 2 makes that happen.
---
Week 1 builders: take today to clean up.
Week 1 stragglers: perfect day to catch up.
Tomorrow we talk money. πΈ
#DecemberShipping
If you followed along, you now have:
β PostgreSQL database running
β Authentication working
β Core feature functional
β Deployed somewhere real
That's more than most "I'll build something" promises ever become.
---
π COMMUNITY PULSE
Builders who started: 200+
First deploys shared: 47
"It works!" messages: still counting
Not everyone finished. That's fine.
Week 2 is where stragglers catch up
and leaders pull ahead.
---
π― WEEK 2: FEATURE WEEK
This week we add the parts that
turn a project into a product:
Mon: Transition + catch-up day
Tue: Payment concepts (the traps to avoid)
Wed: π° Complete Stripe billing system
Thu: Analytics & feedback loops
Fri: Demo Friday #2
---
The difference between a side project
and a SaaS is one thing:
Someone can pay you.
Week 2 makes that happen.
---
Week 1 builders: take today to clean up.
Week 1 stragglers: perfect day to catch up.
Tomorrow we talk money. πΈ
#DecemberShipping
β€3
πΈ THE PAYMENT INTEGRATION TRAP
Every developer building SaaS hits this wall:
"Time to add payments"
β Google "Stripe integration tutorial"
β 47 different approaches
β 3 days later: spaghetti code
β Still missing edge cases
Sound familiar?
---
WHAT TUTORIALS TEACH
- Create checkout session β
- Handle success redirect β
- Done! Ship it! π
WHAT TUTORIALS SKIP
- Webhook signature verification
- Subscription state management
- Failed payment recovery
- Plan changes mid-cycle
- Usage-based billing
- Refund states
- Customer portal sync
- Race conditions
The "2 hour integration" becomes 2 weeks.
---
THE REAL PROBLEM
Most devs treat Stripe as the source of truth.
Wrong.
Your PostgreSQL database is the source of truth.
Stripe is just the payment processor.
This means:
β Every webhook updates YOUR tables
β Subscription status lives in YOUR schema
β Access control queries YOUR data
β You can switch processors without rewriting
---
THE SCHEMA MISTAKE
---
Tomorrow: the complete system.
Production schema + all webhook handlers + subscription lifecycle + access control middleware.
The billing system I actually use.
One time purchase, forever yours.
6 β
#DecemberShipping
Every developer building SaaS hits this wall:
"Time to add payments"
β Google "Stripe integration tutorial"
β 47 different approaches
β 3 days later: spaghetti code
β Still missing edge cases
Sound familiar?
---
WHAT TUTORIALS TEACH
- Create checkout session β
- Handle success redirect β
- Done! Ship it! π
WHAT TUTORIALS SKIP
- Webhook signature verification
- Subscription state management
- Failed payment recovery
- Plan changes mid-cycle
- Usage-based billing
- Refund states
- Customer portal sync
- Race conditions
The "2 hour integration" becomes 2 weeks.
---
THE REAL PROBLEM
Most devs treat Stripe as the source of truth.
Wrong.
Your PostgreSQL database is the source of truth.
Stripe is just the payment processor.
This means:
β Every webhook updates YOUR tables
β Subscription status lives in YOUR schema
β Access control queries YOUR data
β You can switch processors without rewriting
---
THE SCHEMA MISTAKE
-- β What tutorials teach
ALTER TABLE users
ADD COLUMN stripe_customer_id TEXT,
ADD COLUMN subscription_status TEXT;
-- Breaks when:
-- User has multiple subscriptions
-- Team billing (one payer, many users)
-- You need subscription history
-- Plan changes mid-cycle
---
Tomorrow: the complete system.
Production schema + all webhook handlers + subscription lifecycle + access control middleware.
The billing system I actually use.
One time purchase, forever yours.
6 β
#DecemberShipping
π1π₯1
This media is not supported in the widget
VIEW IN TELEGRAM
β€1
PostgreSQL Pro | Database Mastery pinned Β«π COMPLETE STRIPE + POSTGRESQL BILLING Stop copying broken tutorials. Ship production billing today. --- WHAT'S INSIDE π¦ Production Database Schema 6 tables handling every edge case: customers, subscriptions, invoices, payments, webhook events, plan featuresβ¦Β»
π DAY 10: KNOW YOUR USERS
You've got auth. Maybe payments now.
But do you know what users actually do?
Today: analytics that live in YOUR database.
---
THE THIRD-PARTY TRAP
Mixpanel: $25/month β $200/month β $1000/month
Amplitude: "Contact sales"
Google Analytics: Free but... Google
For early-stage SaaS, you need:
- Who signed up
- Who's active
- Who's paying
- Who's leaving
PostgreSQL handles all of this.
---
SIMPLE EVENT TRACKING
That's it. Now track anything:
---
QUERIES THAT MATTER
Daily active users:
Feature adoption:
Users at risk (no activity 7+ days):
---
COST COMPARISON
PostgreSQL analytics: $0/month
Mixpanel at scale: $500+/month
You own the data.
You control the queries.
You pay nothing extra.
---
Ship something trackable today.
Tomorrow we show it off.
#DecemberShipping
You've got auth. Maybe payments now.
But do you know what users actually do?
Today: analytics that live in YOUR database.
---
THE THIRD-PARTY TRAP
Mixpanel: $25/month β $200/month β $1000/month
Amplitude: "Contact sales"
Google Analytics: Free but... Google
For early-stage SaaS, you need:
- Who signed up
- Who's active
- Who's paying
- Who's leaving
PostgreSQL handles all of this.
---
SIMPLE EVENT TRACKING
CREATE TABLE user_events (
id BIGSERIAL PRIMARY KEY,
user_id UUID REFERENCES users(id),
event_name TEXT NOT NULL,
properties JSONB DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_events_user_time
ON user_events(user_id, created_at DESC);
CREATE INDEX idx_events_name_time
ON user_events(event_name, created_at DESC);
That's it. Now track anything:
INSERT INTO user_events (user_id, event_name, properties)
VALUES (
$1,
'feature_used',
'{"feature": "export", "format": "csv"}'
);
---
QUERIES THAT MATTER
Daily active users:
SELECT DATE(created_at), COUNT(DISTINCT user_id)
FROM user_events
WHERE created_at > NOW() - INTERVAL '30 days'
GROUP BY 1 ORDER BY 1;
Feature adoption:
SELECT
properties->>'feature' as feature,
COUNT(DISTINCT user_id) as users
FROM user_events
WHERE event_name = 'feature_used'
GROUP BY 1 ORDER BY 2 DESC;
Users at risk (no activity 7+ days):
SELECT u.id, u.email, MAX(e.created_at) as last_seen
FROM users u
LEFT JOIN user_events e ON u.id = e.user_id
GROUP BY u.id
HAVING MAX(e.created_at) < NOW() - INTERVAL '7 days'
OR MAX(e.created_at) IS NULL;
---
COST COMPARISON
PostgreSQL analytics: $0/month
Mixpanel at scale: $500+/month
You own the data.
You control the queries.
You pay nothing extra.
---
Ship something trackable today.
Tomorrow we show it off.
#DecemberShipping
β€3
π¬ DEMO FRIDAY #2
Week 2 checkpoint.
If your project can accept payments
(or at least looks like it could),
you're ahead of schedule.
---
SHOW YOUR PROGRESS
Reply with:
β What you built this week
β Screenshot or link
β Biggest challenge faced
Broken? Incomplete? Ugly?
Ship anyway. Feedback > perfection.
---
π WEEK 2 PULSE CHECK
Stripe integrations started: ?
First test payments: ?
Analytics tables created: ?
Drop your numbers.
Let's count together.
---
WEEK 2 RECAP
Mon: Week 1 complete, Week 2 kickoff
Tue: Payment integration traps
Wed: Complete Stripe billing system π°
Thu: PostgreSQL analytics
Fri: You are here
---
NEXT WEEK: LAUNCH PREP
Week 3 is about getting ready to ship publicly:
- Landing page essentials
- Launch checklist
- Pre-launch marketing
- Final polish
We're past the halfway point.
---
Weekend: REST.
No posts Saturday/Sunday.
Touch grass. See humans.
Recharge for the final push.
Monday we prep for launch.
What did you ship this week? π
#DecemberShipping
Week 2 checkpoint.
If your project can accept payments
(or at least looks like it could),
you're ahead of schedule.
---
SHOW YOUR PROGRESS
Reply with:
β What you built this week
β Screenshot or link
β Biggest challenge faced
Broken? Incomplete? Ugly?
Ship anyway. Feedback > perfection.
---
π WEEK 2 PULSE CHECK
Stripe integrations started: ?
First test payments: ?
Analytics tables created: ?
Drop your numbers.
Let's count together.
---
WEEK 2 RECAP
Mon: Week 1 complete, Week 2 kickoff
Tue: Payment integration traps
Wed: Complete Stripe billing system π°
Thu: PostgreSQL analytics
Fri: You are here
---
NEXT WEEK: LAUNCH PREP
Week 3 is about getting ready to ship publicly:
- Landing page essentials
- Launch checklist
- Pre-launch marketing
- Final polish
We're past the halfway point.
---
Weekend: REST.
No posts Saturday/Sunday.
Touch grass. See humans.
Recharge for the final push.
Monday we prep for launch.
What did you ship this week? π
#DecemberShipping
π HALFWAY CHECK-IN
We're 2 weeks into December.
Some of you have:
β Working app deployed
β Auth system running
β Maybe even payments
Some of you have:
π Half-finished features
π "I'll catch up this weekend"
π Scope creep taking over
Both are normal. Here's what matters now.
---
π― WEEK 3: LAUNCH PREP
This week isn't about building more features.
It's about getting ready to show real humans
what you've built.
Mon: Reset and refocus
Tue: The minimum viable launch
Wed: π° Solo dev launch toolkit
Thu: Getting your first 10 users
Fri: Demo Friday #3
---
THE SOLO DEV REALITY
You don't need:
β Perfect landing page
β Complex billing system
β Analytics dashboard
β 47 features
You need:
β Something that works
β A way to collect emails
β A way to talk to users
β Courage to share it
---
THIS WEEK'S MISSION
By Friday, have ONE link you can share
that lets someone try your thing.
Not perfect. Not complete.
Just real enough to get feedback.
---
What's blocking you from launching?
Reply below. Let's solve it together.
#DecemberShipping
We're 2 weeks into December.
Some of you have:
β Working app deployed
β Auth system running
β Maybe even payments
Some of you have:
π Half-finished features
π "I'll catch up this weekend"
π Scope creep taking over
Both are normal. Here's what matters now.
---
π― WEEK 3: LAUNCH PREP
This week isn't about building more features.
It's about getting ready to show real humans
what you've built.
Mon: Reset and refocus
Tue: The minimum viable launch
Wed: π° Solo dev launch toolkit
Thu: Getting your first 10 users
Fri: Demo Friday #3
---
THE SOLO DEV REALITY
You don't need:
β Perfect landing page
β Complex billing system
β Analytics dashboard
β 47 features
You need:
β Something that works
β A way to collect emails
β A way to talk to users
β Courage to share it
---
THIS WEEK'S MISSION
By Friday, have ONE link you can share
that lets someone try your thing.
Not perfect. Not complete.
Just real enough to get feedback.
---
What's blocking you from launching?
Reply below. Let's solve it together.
#DecemberShipping
π THE MINIMUM VIABLE LAUNCH
What do you actually need to launch?
Spoiler: Way less than you think.
---
THE INDIE HACKER LAUNCH STACK
Successful solo devs launch with:
1. Landing page (1 hour)
- Headline explaining what it does
- 3 bullet points of benefits
- Email signup or "Try it" button
- That's it.
2. Waitlist/signup (30 min)
- Collect email
- Maybe collect one more field
- Send confirmation
- Done.
3. The actual thing (you have this)
- It works, mostly
- It solves one problem
- Someone can use it
4. Feedback channel (10 min)
- Simple form
- Or just your email
- Or a Telegram/Discord link
---
WHAT YOU DON'T NEED
β Perfect design (ship ugly, iterate later)
β All features done (launch with 20%)
β Pricing figured out (offer free access first)
β Legal pages (add them week 2)
β Custom analytics (check server logs)
β Complex onboarding (just let them use it)
---
THE POSTGRESQL ADVANTAGE
Your database can handle launch day with
zero extra services:
No Mailchimp. No Typeform. No Mixpanel.
Just PostgreSQL.
---
Tomorrow: Complete launch toolkit.
Waitlist with referral tracking.
Feedback widget.
Launch day dashboard.
All PostgreSQL. All simple.
5 β - Ship this weekend.
#DecemberShipping
What do you actually need to launch?
Spoiler: Way less than you think.
---
THE INDIE HACKER LAUNCH STACK
Successful solo devs launch with:
1. Landing page (1 hour)
- Headline explaining what it does
- 3 bullet points of benefits
- Email signup or "Try it" button
- That's it.
2. Waitlist/signup (30 min)
- Collect email
- Maybe collect one more field
- Send confirmation
- Done.
3. The actual thing (you have this)
- It works, mostly
- It solves one problem
- Someone can use it
4. Feedback channel (10 min)
- Simple form
- Or just your email
- Or a Telegram/Discord link
---
WHAT YOU DON'T NEED
β Perfect design (ship ugly, iterate later)
β All features done (launch with 20%)
β Pricing figured out (offer free access first)
β Legal pages (add them week 2)
β Custom analytics (check server logs)
β Complex onboarding (just let them use it)
---
THE POSTGRESQL ADVANTAGE
Your database can handle launch day with
zero extra services:
-- This is your entire waitlist system
CREATE TABLE waitlist (
id SERIAL PRIMARY KEY,
email TEXT UNIQUE NOT NULL,
source TEXT,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- This is your feedback system
CREATE TABLE feedback (
id SERIAL PRIMARY KEY,
user_email TEXT,
message TEXT NOT NULL,
page_url TEXT,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- This is your launch analytics
SELECT DATE(created_at), COUNT(*)
FROM waitlist
GROUP BY 1 ORDER BY 1;
No Mailchimp. No Typeform. No Mixpanel.
Just PostgreSQL.
---
Tomorrow: Complete launch toolkit.
Waitlist with referral tracking.
Feedback widget.
Launch day dashboard.
All PostgreSQL. All simple.
5 β - Ship this weekend.
#DecemberShipping
π1
This media is not supported in the widget
VIEW IN TELEGRAM
PostgreSQL Pro | Database Mastery pinned Β«π SOLO DEV LAUNCH TOOLKIT Everything you need to launch this weekend. Nothing you don't. --- WHAT'S INSIDE π§ Waitlist System - Email collection with duplicate handling - Source tracking (twitter, reddit, HN...) - Referral program (track who invited who)β¦Β»
π₯ YOUR FIRST 10 USERS
You've built something. Now what?
Where do first users come from?
---
THE COLD START PROBLEM
"I launched and nobody came."
This is normal. Expected, even.
Nobody knows you exist.
That's not a product problem.
That's a distribution problem.
---
WHERE SOLO DEVS FIND FIRST USERS
Free channels that work:
1. Friends & colleagues (Users 1-3)
Ask directly. "I built X, can you try it?"
Don't be shy. They want to help.
2. Communities you're already in (Users 4-7)
- Slack/Discord groups
- Reddit (carefully, no spam)
- Twitter/X if you have followers
- Your Telegram channels π
3. Show HN / Indie Hackers (Users 8-10+)
- Launch posts get visibility
- Be honest: "Solo dev, first launch"
- Ask for feedback, not praise
---
THE ASK THAT WORKS
Bad: "Check out my new app!"
Good: "I built a tool that does X.
Looking for 5 people to try it free
and give me honest feedback.
Anyone interested?"
Specific. Humble. Clear value exchange.
---
TRACK EVERYTHING
This tells you where to double down.
---
THE GOAL
10 users who actually use it.
Not 1,000 signups who forget.
10 real conversations > 10,000 vanity metrics
---
Friday: Show what you've got.
Demo Friday #3. Last one before launch week.
Where will you find your first users? π
#DecemberShipping
You've built something. Now what?
Where do first users come from?
---
THE COLD START PROBLEM
"I launched and nobody came."
This is normal. Expected, even.
Nobody knows you exist.
That's not a product problem.
That's a distribution problem.
---
WHERE SOLO DEVS FIND FIRST USERS
Free channels that work:
1. Friends & colleagues (Users 1-3)
Ask directly. "I built X, can you try it?"
Don't be shy. They want to help.
2. Communities you're already in (Users 4-7)
- Slack/Discord groups
- Reddit (carefully, no spam)
- Twitter/X if you have followers
- Your Telegram channels π
3. Show HN / Indie Hackers (Users 8-10+)
- Launch posts get visibility
- Be honest: "Solo dev, first launch"
- Ask for feedback, not praise
---
THE ASK THAT WORKS
Bad: "Check out my new app!"
Good: "I built a tool that does X.
Looking for 5 people to try it free
and give me honest feedback.
Anyone interested?"
Specific. Humble. Clear value exchange.
---
TRACK EVERYTHING
-- Know where your users came from
SELECT
source,
COUNT(*) as signups,
MIN(created_at) as first_signup
FROM waitlist
GROUP BY source
ORDER BY signups DESC;
This tells you where to double down.
---
THE GOAL
10 users who actually use it.
Not 1,000 signups who forget.
10 real conversations > 10,000 vanity metrics
---
Friday: Show what you've got.
Demo Friday #3. Last one before launch week.
Where will you find your first users? π
#DecemberShipping
π¬ DEMO FRIDAY #3
Last demo before launch week.
Next week = the real thing.
---
SHOW YOUR PROGRESS
Share:
β Link to your landing page
β Screenshot of what you built
β Your launch plan for next week
No landing page yet?
Screenshot of the app works.
---
π WEEK 3 PULSE
Waitlists set up: ?
Landing pages live: ?
First beta users invited: ?
Drop your numbers.
---
WEEK 3 RECAP
Mon: Reality check, scope down
Tue: Minimum viable launch
Wed: Solo dev launch toolkit π°
Thu: Finding first 10 users
Fri: You are here
---
NEXT WEEK: LAUNCH WEEK π
The final sprint:
- Monday: Last-minute fixes
- Tuesday: Launch prep checklist
- Wednesday: LAUNCH DAY
- Thursday: Post-launch survival
- Friday: December retro
One week left in December.
One week to ship.
---
WEEKEND TASK
If you do ONE thing:
Get a link ready to share.
Landing page > Notion doc > Google form >
Literally anything someone can click.
---
What are you launching? π
Show us. We'll hype you up.
#DecemberShipping
Last demo before launch week.
Next week = the real thing.
---
SHOW YOUR PROGRESS
Share:
β Link to your landing page
β Screenshot of what you built
β Your launch plan for next week
No landing page yet?
Screenshot of the app works.
---
π WEEK 3 PULSE
Waitlists set up: ?
Landing pages live: ?
First beta users invited: ?
Drop your numbers.
---
WEEK 3 RECAP
Mon: Reality check, scope down
Tue: Minimum viable launch
Wed: Solo dev launch toolkit π°
Thu: Finding first 10 users
Fri: You are here
---
NEXT WEEK: LAUNCH WEEK π
The final sprint:
- Monday: Last-minute fixes
- Tuesday: Launch prep checklist
- Wednesday: LAUNCH DAY
- Thursday: Post-launch survival
- Friday: December retro
One week left in December.
One week to ship.
---
WEEKEND TASK
If you do ONE thing:
Get a link ready to share.
Landing page > Notion doc > Google form >
Literally anything someone can click.
---
What are you launching? π
Show us. We'll hype you up.
#DecemberShipping
π FINAL WEEK
December ends in 9 days.
Whatever state your project is in right now β
that's your launch state.
No more "one more feature."
No more "just need to fix this."
No more "almost ready."
---
TODAY'S MISSION
If you haven't shared your project publicly yet,
today is the day.
Not tomorrow. Not after Christmas.
Today.
Share it in:
β This chat (reply below)
β Twitter/X
β Reddit
β A friend's DMs
β Anywhere with humans
---
WHAT COUNTS AS A LAUNCH
β Landing page with signup
β Working demo people can try
β Beta invite link
β "Coming soon" page with email capture
β Even a Notion doc explaining what you're building
If someone can look at it and understand what you're making,
it counts.
---
THE UNCOMFORTABLE TRUTH
You will never feel ready.
The project will never feel finished.
The code will never feel clean enough.
Launch anyway.
---
Reply with your link. Any link.
Let's see what December produced. π
#DecemberShipping
December ends in 9 days.
Whatever state your project is in right now β
that's your launch state.
No more "one more feature."
No more "just need to fix this."
No more "almost ready."
---
TODAY'S MISSION
If you haven't shared your project publicly yet,
today is the day.
Not tomorrow. Not after Christmas.
Today.
Share it in:
β This chat (reply below)
β Twitter/X
β Reddit
β A friend's DMs
β Anywhere with humans
---
WHAT COUNTS AS A LAUNCH
β Landing page with signup
β Working demo people can try
β Beta invite link
β "Coming soon" page with email capture
β Even a Notion doc explaining what you're building
If someone can look at it and understand what you're making,
it counts.
---
THE UNCOMFORTABLE TRUTH
You will never feel ready.
The project will never feel finished.
The code will never feel clean enough.
Launch anyway.
---
Reply with your link. Any link.
Let's see what December produced. π
#DecemberShipping
π DECEMBER LAUNCH DAY
This is it. The thread.
Post your project below.
---
FORMAT
π Link:
π What it does (1 sentence):
π οΈ Built with:
β±οΈ Time spent:
---
RULES
1. No judging. Everyone ships at their own pace.
2. Try at least one other person's project.
3. Leave actual feedback, not just "cool!"
4. Upvote/react to projects you like.
---
REMEMBER
A launched ugly project beats
an unlaunched perfect one.
Every successful product you use today
once looked embarrassing.
---
I'll start:
This channel. 1,000+ of you now.
Started as "I'll post some PostgreSQL tips."
Still figuring it out. Still shipping.
---
Your turn. π
What did you build this December?
#DecemberShipping
This is it. The thread.
Post your project below.
---
FORMAT
π Link:
π What it does (1 sentence):
π οΈ Built with:
β±οΈ Time spent:
---
RULES
1. No judging. Everyone ships at their own pace.
2. Try at least one other person's project.
3. Leave actual feedback, not just "cool!"
4. Upvote/react to projects you like.
---
REMEMBER
A launched ugly project beats
an unlaunched perfect one.
Every successful product you use today
once looked embarrassing.
---
I'll start:
This channel. 1,000+ of you now.
Started as "I'll post some PostgreSQL tips."
Still figuring it out. Still shipping.
---
Your turn. π
What did you build this December?
#DecemberShipping
If you shipped something this month:
Congratulations. You did more than most.
If you didn't finish:
You learned. That counts too.
If you just followed along:
You're more prepared than you were December 1st.
---
THE DECEMBER STATS
Builders who joined the challenge: 200+
Projects shared publicly: [we'll count Friday]
Community posts: hundreds
Excuses defeated: countless
---
Tomorrow: No post. It's Christmas.
Friday: December retrospective.
We'll count the wins and plan for January.
---
Enjoy the break. You earned it.
Merry Christmas to those celebrating. π
See you Friday.
@postgres
Congratulations. You did more than most.
If you didn't finish:
You learned. That counts too.
If you just followed along:
You're more prepared than you were December 1st.
---
THE DECEMBER STATS
Builders who joined the challenge: 200+
Projects shared publicly: [we'll count Friday]
Community posts: hundreds
Excuses defeated: countless
---
Tomorrow: No post. It's Christmas.
Friday: December retrospective.
We'll count the wins and plan for January.
---
Enjoy the break. You earned it.
Merry Christmas to those celebrating. π
See you Friday.
@postgres
π₯1
π DECEMBER RETROSPECTIVE
The month is almost over.
Let's count what happened.
---
BY THE NUMBERS
Subscribers Dec 1: ~1,000
Subscribers now: 1364
---
WHAT WORKED THIS MONTH
β Daily accountability posts
β Simple, actionable content
β Community sharing progress
β "Ship broken, not perfect" mindset
β PostgreSQL doing everything
---
WHAT I LEARNED RUNNING THIS
β You want simple, not complex
β You want "today" not "someday"
β You're building real things, not just learning
β Community momentum is real
---
THE REAL WIN
December wasn't about finishing.
It was about starting.
If you wrote one line of code,
created one table,
deployed one thing β
You're ahead of December 1st you.
---
WHAT'S NEXT
January: New challenge?
Keep shipping?
Something different?
What do you want from @postgres in 2025?
Reply below. Seriously.
This shapes what comes next.
---
Thank you for being here.
1,000+ people learning PostgreSQL together.
That's pretty cool.
See you next year. π
@postgres
#DecemberShipping
The month is almost over.
Let's count what happened.
---
BY THE NUMBERS
Subscribers Dec 1: ~1,000
Subscribers now: 1364
---
WHAT WORKED THIS MONTH
β Daily accountability posts
β Simple, actionable content
β Community sharing progress
β "Ship broken, not perfect" mindset
β PostgreSQL doing everything
---
WHAT I LEARNED RUNNING THIS
β You want simple, not complex
β You want "today" not "someday"
β You're building real things, not just learning
β Community momentum is real
---
THE REAL WIN
December wasn't about finishing.
It was about starting.
If you wrote one line of code,
created one table,
deployed one thing β
You're ahead of December 1st you.
---
WHAT'S NEXT
January: New challenge?
Keep shipping?
Something different?
What do you want from @postgres in 2025?
Reply below. Seriously.
This shapes what comes next.
---
Thank you for being here.
1,000+ people learning PostgreSQL together.
That's pretty cool.
See you next year. π
@postgres
#DecemberShipping
π― 2026 STARTS NOW
December is done. Holidays over.
No more excuses.
What are you building this year?
---
DECEMBER RECAP
We had 200+ people join the shipping challenge.
Dozens of projects launched.
Some ugly. Some broken. All real.
That momentum doesn't have to stop.
---
2026: SIMPLER APPROACH
Last year I overcomplicated things.
Big masterclasses. Complex systems.
This year: small wins.
One useful thing per week.
Something you can implement in an hour.
Actually use it. Move on.
---
THIS WEEK
Mon: Fresh start (you're here)
Tue: The 3-table SaaS (all you actually need)
Wed: π° Copy-paste auth queries (3 β)
Thu: Your first mass email (from PostgreSQL)
Fri: Week 1 check-in
Simple. Useful. Cheap.
---
QUESTION FOR YOU
What's the ONE thing you want to build in January?
Not a roadmap. Not a vision.
One thing. Reply below.
Let's make it happen.
#January2026
December is done. Holidays over.
No more excuses.
What are you building this year?
---
DECEMBER RECAP
We had 200+ people join the shipping challenge.
Dozens of projects launched.
Some ugly. Some broken. All real.
That momentum doesn't have to stop.
---
2026: SIMPLER APPROACH
Last year I overcomplicated things.
Big masterclasses. Complex systems.
This year: small wins.
One useful thing per week.
Something you can implement in an hour.
Actually use it. Move on.
---
THIS WEEK
Mon: Fresh start (you're here)
Tue: The 3-table SaaS (all you actually need)
Wed: π° Copy-paste auth queries (3 β)
Thu: Your first mass email (from PostgreSQL)
Fri: Week 1 check-in
Simple. Useful. Cheap.
---
QUESTION FOR YOU
What's the ONE thing you want to build in January?
Not a roadmap. Not a vision.
One thing. Reply below.
Let's make it happen.
#January2026
β€2
ποΈ THE 3-TABLE SAAS
Every SaaS tutorial shows you 47 tables.
Users, profiles, settings, preferences,
organizations, memberships, roles, permissions...
You don't need that.
You need 3 tables to start making money.
---
TABLE 1: USERS
That's it. No name, no profile, no avatar.
Add them when ONE user asks for them.
---
TABLE 2: THE THING YOU'RE SELLING
Projects, documents, dashboards, reports β
whatever your product creates.
---
TABLE 3: PAYMENTS
Not subscriptions. Just payments.
Stripe Checkout handles the rest.
---
THAT'S THE WHOLE DATABASE
3 tables. 20 lines of SQL.
Add complexity when you need it.
Not before.
---
Tomorrow: Auth queries that work with this.
Session management.
Password reset.
Magic links.
All copy-paste ready.
3 β β less than a coffee.
#January2026
Every SaaS tutorial shows you 47 tables.
Users, profiles, settings, preferences,
organizations, memberships, roles, permissions...
You don't need that.
You need 3 tables to start making money.
---
TABLE 1: USERS
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email TEXT UNIQUE NOT NULL,
password_hash TEXT,
created_at TIMESTAMPTZ DEFAULT NOW()
);
That's it. No name, no profile, no avatar.
Add them when ONE user asks for them.
---
TABLE 2: THE THING YOU'RE SELLING
CREATE TABLE projects ( -- or whatever your thing is
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
name TEXT NOT NULL,
data JSONB DEFAULT '{}', -- flexibility for now
created_at TIMESTAMPTZ DEFAULT NOW()
);
Projects, documents, dashboards, reports β
whatever your product creates.
---
TABLE 3: PAYMENTS
CREATE TABLE payments (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
stripe_payment_id TEXT,
amount INTEGER, -- cents
status TEXT DEFAULT 'pending',
created_at TIMESTAMPTZ DEFAULT NOW()
);
Not subscriptions. Just payments.
Stripe Checkout handles the rest.
---
THAT'S THE WHOLE DATABASE
3 tables. 20 lines of SQL.
Add complexity when you need it.
Not before.
---
Tomorrow: Auth queries that work with this.
Session management.
Password reset.
Magic links.
All copy-paste ready.
3 β β less than a coffee.
#January2026
This media is not supported in the widget
VIEW IN TELEGRAM
π§ YOUR FIRST MASS EMAIL
You have a waitlist. Or users. Or both.
Time to email them.
No Mailchimp. No Sendgrid dashboard.
Just PostgreSQL + one API call.
---
THE SIMPLE WAY
Export. Paste into your email tool.
Or loop through in code.
---
TRACK WHAT YOU SEND
No double-sends. Ever.
---
SIMPLE UNSUBSCRIBE
---
THE ACTUAL SENDING
Use what you have:
- Resend: 3,000 free/month
- Postmark: 100 free/month
- AWS SES: $0.10 per 1,000
One API call per email.
PostgreSQL handles the logic.
---
YOUR ASSIGNMENT
If you have ANY users or waitlist signups,
send them an email this week.
"Hey, just checking in. Still interested in [thing]?"
That's it. You'll learn something.
---
Tomorrow: Week 1 check-in.
What did you ship?
#January2026
You have a waitlist. Or users. Or both.
Time to email them.
No Mailchimp. No Sendgrid dashboard.
Just PostgreSQL + one API call.
---
THE SIMPLE WAY
-- Get everyone who should receive this email
SELECT email, name
FROM users
WHERE created_at > '2025-12-01'
AND email_verified = true
AND unsubscribed = false;
Export. Paste into your email tool.
Or loop through in code.
---
TRACK WHAT YOU SEND
CREATE TABLE email_log (
id SERIAL PRIMARY KEY,
user_id UUID REFERENCES users(id),
email_type TEXT, -- welcome, update, promo
sent_at TIMESTAMPTZ DEFAULT NOW()
);
-- Before sending, check:
SELECT user_id FROM email_log
WHERE email_type = 'jan_update'
AND user_id = $1;
-- If empty, safe to send
No double-sends. Ever.
---
SIMPLE UNSUBSCRIBE
ALTER TABLE users ADD COLUMN unsubscribed BOOLEAN DEFAULT false;
-- Unsubscribe link: /unsubscribe?token=xxx
UPDATE users SET unsubscribed = true
WHERE id = (SELECT user_id FROM unsubscribe_tokens WHERE token = $1);
---
THE ACTUAL SENDING
Use what you have:
- Resend: 3,000 free/month
- Postmark: 100 free/month
- AWS SES: $0.10 per 1,000
One API call per email.
PostgreSQL handles the logic.
---
YOUR ASSIGNMENT
If you have ANY users or waitlist signups,
send them an email this week.
"Hey, just checking in. Still interested in [thing]?"
That's it. You'll learn something.
---
Tomorrow: Week 1 check-in.
What did you ship?
#January2026
β€1