Skip to content

Pare sponsor offerings to 4 tiers and raise pricing ~1.75x#21

Open
RobbieTheWagner wants to merge 1 commit into
mainfrom
sponsor-page-4-tiers
Open

Pare sponsor offerings to 4 tiers and raise pricing ~1.75x#21
RobbieTheWagner wants to merge 1 commit into
mainfrom
sponsor-page-4-tiers

Conversation

@RobbieTheWagner

@RobbieTheWagner RobbieTheWagner commented Jun 6, 2026

Copy link
Copy Markdown
Member

What

Trims the sponsor page from six packages down to a clean four-tier ladder and raises pricing across the board (~1.75x). Adds a new bespoke "Single Barrel" tier to stand out from typical podcast sponsorship menus.

Tier Offering Price
Entry (single ep) The Distiller's Cut — 60s baked-in host-read + show-notes/site placement $1,750/episode
Workhorse (monthly) The Crate — 4× 60s host-reads + 4× placements $4,200/mo
Flagship (monthly) The Full Barrel — Crate + "Presented By" titles + per-episode social $7,000/mo
Bespoke The Single Barrel — co-branded on-air single-barrel whiskey pick, custom bottles, multi-channel Custom → "Let's talk"
  • The old Label folds into the Distiller's Cut as a bundled placement.
  • The Drop (product review) and the standalone 30s read are retired.
  • The bespoke tier routes to /contact for a custom quote rather than Polar checkout.

Why

Too many overlapping options and a desire to raise rates. Based on 2026 benchmark research: dev/tech podcasts command premium host-read CPMs ($45–65), peers (Changelog $3k/wk, Practical AI $1.2k/ep) sell flat-rate per-episode/monthly, and almost nobody productizes a bespoke/experiential offering — hence the whiskey-native Single Barrel as a differentiator.

Changes

  • src/pages/sponsor.astro — 6 → 4 cards, new pricing, bespoke tier
  • src/components/AdPackageCard.astro — optional ctaLabel/ctaHref and suppressible period; productId now optional (backward-compatible)
  • .env.example / README.md — drop unused POLAR_30SEC/BOTTLEDROP/LABEL product IDs

Notes for reviewers

  • Pricing vs CPM: at 3–10K downloads/ep, $1,750 for a 60s read sits above the $45–65 tech CPM benchmark — defensible on the multi-channel + evergreen story, but it's a value/scarcity play, not CPM.
  • Volume discounts (10/15/20% for 3/6/12-month commits) are common among peers but not added here — easy follow-up if wanted.
  • astro check passes (0 errors).

🤖 Generated with Claude Code

Summary by CodeRabbit

Release Notes

  • Documentation

    • Updated sponsorship integration documentation to reflect revised tier setup and configuration instructions.
  • New Features

    • Refreshed sponsorship tier offerings with updated pricing structure and a new tier option.
    • Improved sponsorship package cards with enhanced flexibility for customizing call-to-action elements.

Trim six sponsorship packages down to a clean four-tier ladder and bump
pricing across the board (~1.75x):

- The Distiller's Cut — single 60s host-read + show-notes/site placement,
  $1,750/episode (absorbs the old "The Label" as a bundled placement)
- The Crate — 4x 60s host-reads + placements, $4,200/mo
- The Full Barrel — flagship monthly, $7,000/mo
- The Single Barrel — new bespoke tier: a co-branded on-air single-barrel
  whiskey pick, routed to /contact for a custom quote

Retire "The Drop", "The Label", and the 30s read. AdPackageCard gains
optional ctaLabel/ctaHref (bespoke tier links to /contact instead of
Polar checkout) and a suppressible period (so "Custom" renders without a
"/ per episode" suffix); productId is now optional. Drop the unused
POLAR_30SEC/BOTTLEDROP/LABEL product IDs from .env.example and README.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 6, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
www-starpod Building Building Preview, Comment Jun 6, 2026 11:48pm

Request Review

@coderabbitai

coderabbitai Bot commented Jun 6, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The PR updates the Polar.sh sponsorship product lineup from a prior setup to three distinct paid tiers: "The Distiller's Cut" (60-second), "Crate," and "The Full Barrel," with an optional "Single Barrel" contact tier. The AdPackageCard component is made more flexible to support custom CTA buttons, and environment variables and documentation are aligned with the new product structure.

Changes

Sponsorship Product Lineup Update

Layer / File(s) Summary
AdPackageCard component flexibility
src/components/AdPackageCard.astro
productId, ctaLabel, and ctaHref become optional Props. Period suffix rendering is conditional on the period value, and the CTA button text and URL are now derived from component props instead of hard-coded values.
Configuration and documentation updates
.env.example, README.md
Environment variables are updated to remove POLAR_30SEC_PRODUCT_ID and POLAR_BOTTLEDROP_PRODUCT_ID, and add/retain POLAR_60SEC_PRODUCT_ID, POLAR_CRATE_PRODUCT_ID, and POLAR_FULLBARREL_PRODUCT_ID. README.md sponsorship setup instructions are revised to enumerate the three new products and explain that "Single Barrel" is handled via /contact.
Sponsorship package lineup updates
src/pages/sponsor.astro
"The Distiller's Cut" is reframed as 60-second with new bullet copy and pricing; "The Full Barrel" price is increased. A new "The Single Barrel" card is added with custom CTA label (ctaLabel) and link (ctaHref) to support the contact form pattern.

Possibly Related PRs

  • shipshapecode/www-starpod#16: Both PRs modify src/pages/sponsor.astro's "The Distiller's Cut" AdPackageCard props (main PR also changes package lineup and component CTA flexibility).
  • shipshapecode/www-starpod#8: The main PR extends #8 by making AdPackageCard Props more flexible and updating Polar.sh product IDs (removing BottleDrop/Label, keeping/adding Crate/Full Barrel) across environment, documentation, and sponsorship page.

Estimated Code Review Effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Poem

🐰 A hop through sponsor tiers so fine,
From Distiller's Cut to Barrel's shine,
The Card now bends to any call,
And Single Barrel waits for all! ✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the main changes: reducing sponsor offerings from six to four tiers and raising pricing by ~1.75x, which aligns with the core intent of the changeset.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch sponsor-page-4-tiers

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/components/AdPackageCard.astro`:
- Around line 6-20: The default ctaHref currently uses a template literal with
productId (const ... ctaHref = `/api/checkout?products=${productId}`) which
yields an invalid URL when productId is undefined; update the logic that sets
ctaHref (in the Astro.props destructure or immediately after) to guard
productId—e.g., compute ctaHref conditionally so that when productId is missing
you either omit the products query param or fallback to a safe URL (or
throw/require ctaHref), and ensure the component uses the guarded value;
reference the ctaHref and productId symbols when making the change.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 55b0fa24-265d-4402-a487-1165d67ecca2

📥 Commits

Reviewing files that changed from the base of the PR and between 51882e7 and 09fbf19.

📒 Files selected for processing (4)
  • .env.example
  • README.md
  • src/components/AdPackageCard.astro
  • src/pages/sponsor.astro

Comment on lines +6 to +20
productId?: string;
period?: string;
ctaLabel?: string;
ctaHref?: string;
}

const { bullets, heading, price, productId, period = 'per episode' } = Astro.props;
const {
bullets,
heading,
price,
productId,
period = 'per episode',
ctaLabel = 'Become a sponsor',
ctaHref = `/api/checkout?products=${productId}`
} = Astro.props;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Default ctaHref will produce an invalid URL when productId is undefined.

Line 19 constructs the default ctaHref as `/api/checkout?products=${productId}`. Since productId is now optional (line 6), when it's undefined the URL becomes /api/checkout?products=undefined, which will fail at the Polar checkout endpoint. The Single Barrel tier (which omits productId) works because it provides its own ctaHref, but this default is fragile and could break future cards that omit productId without providing ctaHref.

Guard the template literal or make the logic explicit.

🛡️ Proposed fix to guard against undefined productId
 const {
   bullets,
   heading,
   price,
   productId,
   period = 'per episode',
   ctaLabel = 'Become a sponsor',
-  ctaHref = `/api/checkout?products=${productId}`
+  ctaHref = productId ? `/api/checkout?products=${productId}` : '#'
 } = Astro.props;

Alternatively, if a ctaHref is always expected when productId is omitted, add a runtime check or TypeScript constraint to enforce the mutual dependency.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
productId?: string;
period?: string;
ctaLabel?: string;
ctaHref?: string;
}
const { bullets, heading, price, productId, period = 'per episode' } = Astro.props;
const {
bullets,
heading,
price,
productId,
period = 'per episode',
ctaLabel = 'Become a sponsor',
ctaHref = `/api/checkout?products=${productId}`
} = Astro.props;
productId?: string;
period?: string;
ctaLabel?: string;
ctaHref?: string;
}
const {
bullets,
heading,
price,
productId,
period = 'per episode',
ctaLabel = 'Become a sponsor',
ctaHref = productId ? `/api/checkout?products=${productId}` : '#'
} = Astro.props;
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/AdPackageCard.astro` around lines 6 - 20, The default ctaHref
currently uses a template literal with productId (const ... ctaHref =
`/api/checkout?products=${productId}`) which yields an invalid URL when
productId is undefined; update the logic that sets ctaHref (in the Astro.props
destructure or immediately after) to guard productId—e.g., compute ctaHref
conditionally so that when productId is missing you either omit the products
query param or fallback to a safe URL (or throw/require ctaHref), and ensure the
component uses the guarded value; reference the ctaHref and productId symbols
when making the change.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant