Podia

podia.comcontributed by Samuele Ongaro

YES

Replaceable in one session with an AI coding agent.

A storefront for digital products, courses and memberships with a website and email built in, aimed at creators who want one bill and no plugins.

Promptfree, for everyone, and the only version there is
Build me the storefront I actually need instead of Podia: digital products, courses and memberships, with one customer record behind all of them.

STACK
- Astro with a Node adapter, or Fastify with server-rendered templates
- SQLite through better-sqlite3, WAL mode
- One payment provider, hosted checkout, so no card data touches this
- SMTP through a provider set in .env
- Caddy in front

THE DATA MODEL, AND THE ONE THING THAT MATTERS
- customers: id, email, name, created_at, last_seen_at, labels_json, marketing_consent_at, consent_text
- One customer record. The person who bought an ebook, the person enrolled in the course and the person on the newsletter are the same row. That single identity is why this product is bought instead of four tools, and it is the thing to build first
- products: id, kind, slug, name, description_md, cover_path, price_cents, currency, pricing_kind, is_active — one-off, subscription, pay-what-you-want, or free
- files: id, product_id, path, sha256, bytes, filename, position
- courses: id, product_id; sections: id, course_id, name, position; lessons: id, section_id, name, body_md, video_path, attachments_json, position, is_preview
- progress: customer_id, lesson_id, completed_at, last_position_ms
- orders: id, customer_id, product_id, amount_cents, currency, tax_cents, coupon_id, provider_ref, status, created_at, refunded_at
- subscriptions: id, customer_id, plan_id, provider_ref, status, current_period_end, cancel_at
- entitlements: derived from orders and subscriptions. Never a stored flag that can drift from what was actually paid for
- coupons, licences, downloads, email_campaigns, deliveries

SELLING
- A product page that is fast, server-rendered, with the price, what is included and a buy button. Nothing else above the fold
- Hosted checkout from the provider. This application never sees a card
- Pay what you want with a minimum and a suggested amount
- Coupons with a percentage or an amount, a limit, an expiry and a product scope, applied against the itemised total
- Tax: for digital goods sold across borders the rate is usually the buyer's, not yours. Collect the country, apply the right rate, keep the evidence of where they were, and put a line in the README saying to take advice — this is the part people discover a year late
- Webhooks with signature verification, idempotency by event id, and out-of-order delivery handled. The order is created from the webhook, never from the browser returning to a success page

DELIVERING
- Files served through signed expiring links, never a public path, with a download limit per order and every download recorded
- Large files streamed with range support so a resume works
- Licence keys generated per order where a product needs them, with a verification endpoint
- The delivery email arrives immediately and can be resent from the customer's own page

COURSES
- Sections and lessons, with video, text and attachments
- Progress tracked per lesson with a resume position, which is what makes somebody come back
- Preview lessons visible without buying, which is the best sales tool a course has
- Drip: release a section a week after enrolment, computed from the enrolment date rather than a stored schedule
- Completion, and a certificate if it is wanted
- Video hosted by you, transcoded to a couple of sizes, or through a provider — say which, and if it is yours, budget for the bandwidth

MEMBERSHIPS
- A plan that grants access to a set of products for as long as it is paid
- Access checked on the server for every gated page and every file. Gating in the browser is not gating
- Cancellation at period end, with access until then, and a way out that takes two clicks

EMAIL
- The list is the customers table plus anyone who signed up without buying, with consent recorded exactly as they saw it
- Broadcasts to a segment: all, buyers of a product, subscribers, or a label
- Automations that are worth having and no more: welcome, post-purchase, abandoned checkout, and a drip for a course
- Built with tables and inline styles, with a plain-text alternative, a test send required before any broadcast, batched and idempotent per recipient
- One-click unsubscribe with no login, and the List-Unsubscribe headers
- SPF, DKIM and DMARC documented; a storefront whose receipts land in spam has a support problem, not a marketing one

THE SITE
- Product pages, a home page, a customer's own library of what they have bought, and a checkout that is three fields
- Fast, server-rendered, under 100KB, dark and light
- Open Graph tags and a generated share image per product

OPERATIONS
- .env: DATABASE_PATH, STORAGE_PATH, BASE_URL, SESSION_SECRET, SMTP_URL, FROM_ADDRESS, PROVIDER_KEY, PROVIDER_WEBHOOK_SECRET, HASH_SALT
- Migrations on boot, each once
- Nightly backup off the machine, restore script — this holds your customers and your revenue
- Health endpoint checking the database, mail, the provider and free disk

WHAT MATTERS MOST
One customer record and webhook idempotency. Build the shared identity and the event table with the provider's event id as a unique key first, then replay a duplicate webhook and confirm nobody is charged or granted access twice. Everything else here is pages.

Give me the repository, migrations, .env.example, a seed store with a file product, a course and a membership, and a README with deploy steps behind Caddy, the DNS records, and the tax note.

What you lose

  • Products, email and a website sharing one customer record with nothing to connect
  • Payments and delivery handled without a Stripe account to configure
  • A finished storefront design

If you would rather not build

  • Stripe plus a static site, assembled yourself
  • Gumroad, for the simplest version
  • Lemon Squeezy, if tax handling matters

What it costs

as published on their pricing page

PlanBilled monthlyBilled yearlyLast read
—$39/mo——

Their pricing page is where these came from. Seeing a different price? Tell us.

The escape hatch

open source · no votes, no paid placement

Medusa

$0

Commerce backend for products, orders and digital delivery.

medusajs/medusafree · open source

Listmonk

$0

The audience half, self-hosted, driven by your own customer table.

knadh/listmonkfree · open source

Why this verdict

our own opinion · changed only by a person

74/100

Verdict yes at 74. Stripe plus storage plus a customer table. Treating buyers and subscribers as separate consents is the detail that keeps you legal.

History

tracked since 10 Aug 2026 · nothing is ever overwritten

Interest · last 30 dayspeak 5/day
views024530 Aug4 Sept9 Sept14 Sept19 Sept24 Sept28 Sept
— views— prompt copies none yet— votes none yet

Questions about Podia

answered from the record above

Is Podia free?

No — the plan we track is $39 a month. Mover at around $39/month billed monthly, cheaper annually.

Can you replace Podia by building your own?

YES. Replaceable in one session with an AI coding agent. Replacement score 74 out of 100, build time one session. Read what you lose before you decide.

How much does Podia cost?

$39 a month on Mover — $468 a year. Recorded 10 Aug 2026.

What do you lose by replacing Podia?

Products, email and a website sharing one customer record with nothing to connect; Payments and delivery handled without a Stripe account to configure; A finished storefront design. If any of those carry weight for you, keep paying.

Is there an open-source alternative to Podia?

Yes: Medusa, Listmonk. The prompt on this page is for when you want it your way instead.

Related entries

same category first, most replaced first

All 27 in Commerce & contracts

Not sending yet

Every week, something stops being worth paying for.

New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.

free forever · no tracking pixel · stored here, never passed to anyone

Esc