Pare sponsor offerings to 4 tiers and raise pricing ~1.75x#21
Pare sponsor offerings to 4 tiers and raise pricing ~1.75x#21RobbieTheWagner wants to merge 1 commit into
Conversation
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>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
📝 WalkthroughWalkthroughThe 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. ChangesSponsorship Product Lineup Update
Possibly Related PRs
Estimated Code Review Effort🎯 2 (Simple) | ⏱️ ~10 minutes Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
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
📒 Files selected for processing (4)
.env.exampleREADME.mdsrc/components/AdPackageCard.astrosrc/pages/sponsor.astro
| 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; |
There was a problem hiding this comment.
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.
| 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.
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.
/contactfor 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 tiersrc/components/AdPackageCard.astro— optionalctaLabel/ctaHrefand suppressibleperiod;productIdnow optional (backward-compatible).env.example/README.md— drop unusedPOLAR_30SEC/BOTTLEDROP/LABELproduct IDsNotes for reviewers
astro checkpasses (0 errors).🤖 Generated with Claude Code
Summary by CodeRabbit
Release Notes
Documentation
New Features