Skip to content

Deliver PRD: Brainshelf Resurface

Scenario

With the solution brief approved and the spike complete, Priya M. wrote the full PRD for the Resurface feature to hand off to engineering for Sprint 8 planning. The PRD consolidates decisions from the opportunity tree (email digest as Solution 1A), the ADR (Resend as email provider), the design rationale (structured text layout), and the spike summary (TF-IDF topic matching) into a single source of truth covering scope, functional requirements, success metrics, and the rollout timeline through the A/B test.

Source Notes:

  • Marty Cagan, “Inspired: How to Create Tech Products Customers Love” (svpg.com) . the PRD philosophy applied in this document; Cagan advocates for PRDs that focus on what the product does and why, leaving implementation details to engineering, while being precise enough about acceptance criteria that the team can build without ambiguity.
  • Lenny Rachitsky’s consumer app retention benchmarks (Lenny’s Newsletter, 2023) . the 7-day return rate benchmarks used to validate the 25% target; Rachitsky places the median for consumer utility apps at 25 - 35%, making the target the minimum viable retention performance for the category.
  • Nir Eyal, “Hooked: How to Build Habit-Forming Products” (nirandfar.com) . the external trigger framework that underpins the Resurface hypothesis; Eyal’s model identifies a daily email as the minimum viable external trigger for products where the internal trigger (self-motivation to return) has not yet been established.

Prompt

/prd
resurface prd for sprint 8. pulling everything together: solution brief,
adr (resend), design rationale (text layout), spike (tfidf).
building the daily email digest that surfaces 3-5 saved items matched
to recent reading. opt-in required. 7:30 AM local time. tfidf for
topic matching. resend for email. text-only layout.
target users: active savers (10+ items, active in last 30 days) .
about 9,800 users [fictional].
metrics: 7-day return rate 18%→25% [fictional], email CTR ≥15% [fictional],
unsub ≤2%/week [fictional].
scope: digest email, topic matching, opt-in flow, cadence setting,
one-click read, analytics events. NOT doing: in-app resurfacing,
push notifications, smart collections.
timeline: sprint 8 build (feb 3-16), setup week (mar 2-8),
a/b test (mar 9 - apr 5), decision (apr 11).

Output

PRD: Resurface . Morning Email Digest

Overview

Problem Statement

Brainshelf users save content at a high rate (~47 items/month average [fictional]) but almost never return to read it: fewer than 9% of saved items are revisited within 30 days [fictional]. The 7-day return rate is 18% [fictional], well below the Q1 retention OKR target of 25% [fictional]. The root cause is the absence of any external trigger to return . users save, close the tab, and the saved item disappears from their attention because nothing prompts them to come back. The saved library has become a guilt pile rather than a reading resource, actively discouraging re-engagement. See the full problem statement for additional detail.

Solution Summary

Resurface is a daily morning email digest that delivers 3 - 5 saved items matched to the user’s recent reading interests. The email arrives at 7:30 AM in the user’s local timezone and contains article titles, source domains, topic tags, and estimated read times in a structured text layout (no images). Each item links directly to the saved content for one-click reading. The feature requires explicit opt-in and supports daily or 3x/week delivery cadence. Resurface creates the external trigger that is currently missing from the Brainshelf experience, connecting moments of morning availability to the user’s most relevant saved content.

Target Users

Active savers: Brainshelf users who have saved 10 or more items and have been active within the past 30 days (at least one save event). This segment represents approximately 9,800 users, or ~45% of Brainshelf’s 22,000 MAU [fictional]. These users have demonstrated saving intent but have not formed a return-and-read habit.

Goals & Success Metrics

Goals

  1. Increase the 7-day return rate from 18% to 25% [fictional] by creating an external trigger (email digest) that brings users back to their saved content
  2. Validate the Resurface hypothesis through a 4-week A/B experiment measuring email click-through rate as the primary behavioral indicator of digest-driven re-engagement
  3. Establish Brainshelf’s first email channel as a foundation for future email-based features (weekly summaries, milestone notifications, onboarding sequences)

Success Metrics

MetricCurrent BaselineTargetTimeline
7-day return rate (primary)18% [fictional]25% [fictional]Q2 2026
Resurface email CTR (secondary)n/a≥15% [fictional]4-week A/B test
Email unsubscribe rate (guardrail)n/a≤2% per week [fictional]Ongoing
Opt-in rate (diagnostic)n/a≥10% of eligible users [fictional]First 7 days of enrollment

Non-Goals

  • Reducing the size of the saved library . Resurface does not delete, archive, or reorganize items; it resurfaces individual items from the existing library
  • Replacing the in-app reading experience . Resurface links directly to the original saved URL, not to a Brainshelf-hosted reading view
  • Building a full recommendation engine . the TF-IDF topic-matching algorithm is an MVP relevance filter, not a personalized recommendation system; it selects items that are topically similar to recent activity, not items predicted to maximize engagement

User Stories

IDUser StoryPriority
US-001As an active saver, I want to receive a daily email with my most relevant saved items so that I have a reason to return and readP0
US-002As a Brainshelf user, I want to opt in to the Resurface digest so that I control whether I receive email from BrainshelfP0
US-003As a digest subscriber, I want to click an item in the email and go directly to the article so that I can start reading immediatelyP0
US-004As a digest subscriber, I want to change my delivery frequency so that I can reduce email volume if daily is too muchP1
US-005As a digest subscriber, I want to unsubscribe from the digest from the email itself so that I can stop receiving email without opening the appP0

See the detailed user stories document for full acceptance criteria.

Scope

In Scope

  • Daily email digest delivery at 7:30 AM user local time via Resend API
  • TF-IDF - based topic-matching algorithm to select 3 - 5 items per digest
  • In-app opt-in flow (home screen card + settings toggle) with email confirmation
  • Structured text email template (React Email) with article title, source, topic tag, read time
  • Cadence setting: daily (default) or 3x/week (Monday, Wednesday, Friday)
  • One-click unsubscribe from email footer
  • Analytics event instrumentation: opt-in, email sent, email opened, item clicked, unsubscribe
  • A/B experiment infrastructure: feature flag, 50/50 split, variant assignment

Out of Scope

  • In-app resurfacing (notification card on home screen) . deferred to post-experiment
  • Push notifications . too aggressive for first version
  • Smart collections / auto-categorization . addresses a different opportunity (library overwhelm), not the trigger gap
  • Annotation-based resurfacing . requires highlighting, which most Brainshelf users do not do
  • Custom send time . the default is 7:30 AM local; custom time selection is a future iteration

Future Considerations

  • Custom send time selection . if user feedback indicates 7:30 AM is not optimal for a meaningful segment, add a time picker in settings; deferred because the extra UI complexity is not justified until we know the feature works
  • In-app resurfacing card . if the email digest validates the resurfacing hypothesis, an in-app card can extend the trigger to users who do not opt in to email; deferred to avoid splitting engineering effort across two surfaces before validating either
  • Embedding-based topic matching . the spike showed embeddings achieve ~84% relevance [fictional] vs. ~72% for TF-IDF [fictional]; migration to embeddings is planned if the feature ships and the precision gap becomes the binding constraint

Solution Design

Functional Requirements

Email Delivery

  • FR-1: The system shall send a digest email to each opted-in user at 7:30 AM in their stored timezone
  • FR-2: Each digest shall contain 3 - 5 saved items selected by the topic-matching algorithm; if fewer than 3 items pass the minimum relevance threshold, the digest shall contain only the qualifying items (minimum 1)
  • FR-3: If zero items pass the relevance threshold, no digest shall be sent for that day; the system shall not send empty or low-relevance digests
  • FR-4: The system shall not resurface the same item within a 14-day window; items included in a previous digest are excluded for 14 days from the send date
  • FR-5: The system shall use Resend API for email delivery, with SPF, DKIM, and DMARC configured on the brainshelf.app domain

Topic Matching

  • FR-6: The topic-matching algorithm shall use TF-IDF vectorization with cosine similarity to rank saved items by relevance to the user’s recent activity (items saved, clicked, or read in the prior 7 days)
  • FR-7: Items shall be ranked by cosine similarity score; the top 5 items above the minimum threshold (0.15 [fictional]) shall be selected for the digest
  • FR-8: For saved URLs where text extraction fails (~11% of URLs [fictional]), the system shall use the page’s Open Graph title and description as a fallback for vectorization

Opt-In Flow

  • FR-9: The opt-in prompt shall appear as a card on the Brainshelf home screen for eligible users (active savers with 10+ items) who have not yet opted in or dismissed the prompt
  • FR-10: The opt-in flow shall require the user to confirm their email address and tap “Enable Digest” . two interactions maximum
  • FR-11: Users who dismiss the prompt shall not see it again for 14 days; after 14 days the prompt may reappear once
  • FR-12: Opt-in state shall be stored as a user preference and accessible from the Settings screen

Cadence and Preferences

  • FR-13: The default delivery cadence shall be daily; users may switch to 3x/week (Monday, Wednesday, Friday) from the email footer or the Settings screen
  • FR-14: Users shall be able to unsubscribe from the digest via a one-click unsubscribe link in the email footer (compliant with CAN-SPAM and GDPR requirements)

User Experience

The email template follows the structured text layout selected in the design rationale (Option B). Each item displays: article title (hyperlinked to the saved URL), source domain, topic tag, and estimated read time. Items are separated by horizontal rules. The email header reads “Your morning reads” with a single-line subheading: “3 things worth your time from your Brainshelf library.” The footer contains the cadence setting link, the unsubscribe link, and the Brainshelf wordmark. See Figma . Resurface Email v1 / Option B for the approved design.

Edge Cases

ScenarioExpected Behavior
User has fewer than 10 saved itemsOpt-in prompt is not shown; user is not eligible for the digest until they reach 10 items
All items in the user’s library have been resurfaced within the 14-day exclusion windowNo digest is sent for that day; the user receives no email rather than repeated content
User changes timezone in device settingsTimezone is updated on next app open; digest delivery shifts to the new timezone the following day
Saved URL returns a 404 when the user clicks from the emailThe link opens in the browser and shows the site’s 404 page; Brainshelf does not intercept broken links in this version
Resend API is down during the scheduled send windowThe send job retries 3 times with exponential backoff (1 min, 5 min, 15 min); if all retries fail, the digest is skipped for that day and an alert is sent to the on-call engineer

Technical Considerations

Constraints

  • Backend team is 2 engineers (Alex R., Jess T.); Sprint 8 must deliver the complete digest pipeline, opt-in flow backend, and topic-matching algorithm within 10 business days
  • No existing email infrastructure; DNS configuration (SPF, DKIM, DMARC) must be completed before any email can be sent from the brainshelf.app domain
  • TF-IDF vectors must be pre-computed for all existing saved items (~460K items across 9,800 eligible users [fictional]) in a batch migration before the A/B test begins

Integration Points

  • Resend API: email sending, delivery/open/click webhooks
  • Cheerio: server-side HTML parsing for article text extraction
  • Amplitude: experiment event tracking (opt-in, email_sent, email_opened, item_clicked, unsubscribe)
  • PostgreSQL: TF-IDF vector storage (JSONB), opt-in preferences, digest send log, 14-day exclusion tracking

Data Requirements

User email addresses are already stored in the Brainshelf user table (required for account creation). No additional PII collection is needed. The opt-in flow confirms the existing email address rather than collecting a new one. Email delivery logs (send time, click events, unsubscribe events) will be stored in a new digest_events table with a 90-day retention policy. TF-IDF vectors are derived data and can be recomputed from source URLs if needed.

Dependencies & Risks

Dependencies

DependencyOwnerStatusImpact if Delayed
Resend account setup + DNS configurationAlex R.Not startedBlocks all email sending; must be completed in Sprint 8 week 1
TF-IDF batch migration for existing saved itemsAlex R.Not startedBlocks digest generation for existing users; can run in parallel with other Sprint 8 work
Amplitude experiment SDK integrationChloe B.In progressBlocks A/B test variant assignment; Chloe is integrating during Sprint 7
React Email template implementationSam W.Not startedBlocks email rendering; depends on Dan K.’s approved design (complete)

Risks

RiskLikelihoodImpactMitigation
Opt-in rate below 10% [fictional] . experiment underpoweredMediumHighMonitor daily in week 1 of enrollment; if below 5% at day 7, revise opt-in prompt copy and extend enrollment window
Digest emails classified as promotions by GmailMediumHighText-only layout, proper DNS config, seed list testing in week 1; monitor inbox placement via Resend dashboard
Timezone handling error . wrong delivery timeLowMediumStore timezone at opt-in; validate against device locale; integration tests for DST transitions
Text extraction fails for >15% of URLsLowMediumOG title/description fallback; exclude items with no extractable text from the digest pool

Timeline & Milestones

MilestoneDescriptionTarget Date
Sprint 8 startEngineering begins Resurface buildFeb 3, 2026
DNS + Resend integration completeEmail can be sent from brainshelf.appFeb 7, 2026
Topic matching + email template completeEnd-to-end digest generation working in stagingFeb 14, 2026
Sprint 8 shipResurface deployed to production behind feature flagFeb 16, 2026
Setup weekOpt-in enrollment begins; A/B experiment configured in AmplitudeMar 2 - 8, 2026
A/B test startFeature flag enabled for treatment group; first digests sentMar 9, 2026
A/B test end4-week test window closesApr 5, 2026
Analysis + decisionExperiment results analyzed; ship/iterate/kill decisionApr 6 - 11, 2026

Open Questions

  • What opt-in rate should trigger the “extend enrollment window” contingency? Current threshold is 5% at day 7 . is this too conservative? . Owner: Priya M.
  • Should the digest exclude items the user saved with “reference” intent (if intent tagging is built later), or should all saved items be eligible regardless of save intent? . Owner: Priya M.
  • How should the 14-day exclusion window interact with users who have very small libraries (<20 items)? Should the window be shortened for small libraries to avoid running out of content? . Owner: Alex R.

Appendix

  • Problem Statement . Saved Content Re-Engagement Gap (Define phase)
  • Hypothesis . Resurface Morning Digest (Define phase)
  • JTBD Canvas . Rediscover Saved Content Worth My Time (Define phase)
  • Opportunity Tree . Increase 7-Day Return Rate (Define phase)
  • ADR-007 . Use Resend as Email Sending Provider (Develop phase)
  • Design Rationale . Digest Email Layout (Develop phase)
  • Solution Brief . Resurface Morning Email Digest (Develop phase)
  • Spike Summary . Topic-Matching Algorithm (Develop phase)

Revision History

VersionDateAuthorChanges
1.0Feb 1, 2026Priya M.Initial draft
1.1Feb 2, 2026Alex R.Added technical considerations and integration points