Ask the Human — Say It Now

Beta Feedback Fixes

Session 11 — 8 bugs, 2 discussion items, 1 one-pager

March 2, 2026 — All Items Resolved

Context: Sheri conducted beta testing of the live site and reported 8 bugs and 2 discussion items. The core issue was architectural: one database row per prompt answer caused tribute counts, PDF pages, and the preview to treat each individual answer as a separate "tribute." All items were resolved in a single session.

Feedback Traceability Matrix

# Type Feedback Root Cause Status
1 Bug Anyone logged in can see all books Overly permissive RLS (Row Level Security) policy — a database rule that was set to "allow everyone" with no conditions Done
2 Bug Prompts not included — "one word to describe" shows just the word The question text wasn't being passed along to the PDF or preview — only the contributor's answer was stored Done
3 Bug Upload 5 photos but only one shows Photos attached only to first submission per contributor Done
4 Bug Photos oriented incorrectly The PDF generator ignores EXIF rotation metadata — the hidden "right-side up" flag that phone cameras embed in photos Done
5 Bug Each question on a separate page instead of grouped per person One DB row per prompt answer; PDF treated each as separate tribute Done
6 Bug Wrong tribute count (counts answers, not people) Dashboard counted submissions.length not unique contributors Done
7 Bug Same person can submit multiple times via same link No duplicate detection; every visit creates new rows Done
8 Bug PDF back cover says "sayitnow.com" (wrong domain) Hardcoded old domain string Done
9 Discussion Need ability to finalize book and download for print No "complete" workflow existed Done
10 Discussion Pricing shows "/book" — implies physical book included Price labels said $29/book Done
11 Extra One-pager for Sheri to share with potential customers N/A — new deliverable Done

Bug #1 Dashboard Showing All Books

Feedback: "Anyone logged in can see all books, including test books with visible titles."

Root cause: A database security rule (RLS — Row Level Security controls which users can read or edit which records) was set to allow any logged-in user to read all books. It was intended to let anonymous contributors look up a book by share link, but it also exposed every book title to every logged-in account holder.
Fix: The dashboard now explicitly filters to only fetch books belonging to the logged-in user. The broad database rule stays in place (anonymous contributors still need it to submit a tribute), but the dashboard ignores any books that don't belong to you.
Dashboard showing only the owner's books
Dashboard now only shows books belonging to the logged-in owner

Files: src/pages/dashboard/index.astro

Bug #2 Prompts Not Included in PDF/Preview

Feedback: "Prompts aren't included — for example, 'one word to describe [Name]' just shows the single word without any context of what the question was."

Root cause: When saving a contributor's answers, only the answer text was stored and passed to the PDF and preview — the question text was dropped along the way. The result was answers floating without any context.
Fix: The question text is now carried through the full pipeline alongside each answer. The PDF shows each question in italics above the contributor's answer. The preview does the same, with [Name] automatically replaced by the honoree's actual name.
Preview showing prompt question above each answer
Each answer now preceded by the question in italics — e.g., "Describe [Name] in one word:" followed by the contributor's word

Files: TributeBookPDF.tsx, preview/[code].astro

Bug #3 Only One Photo Showing

Feedback: "The form lets you upload 5 photos but only one shows up in the preview and PDF."

Root cause: Photos were only attached to the first submission row per contributor (the i === 0 logic). Since each prompt answer was a separate database row, photos on subsequent answers were lost.
Fix: After grouping submissions by contributor, all photo_urls are consolidated into a single array per contributor. The preview shows a full photo gallery for each person.
Preview showing full photo gallery per contributor
All photos from a contributor now shown — previously only the first photo appeared

Files: TributeBookPDF.tsx, preview/[code].astro

Bug #4 Photo Orientation Wrong

Feedback: "Photos taken on my phone show up rotated or sideways."

Root cause: Phone cameras don't physically rotate the image pixels — they just add a hidden flag (called EXIF metadata) that says "display this sideways." Most apps read that flag automatically. The PDF generator does not, so it showed the raw unrotated pixels.
Fix: Every photo is now processed through the browser's built-in image drawing tool (canvas) before upload. Browsers automatically apply the EXIF rotation when drawing, which permanently bakes the correct orientation into the image pixels before it ever reaches the PDF. Photos now display correctly regardless of which direction the phone was held.

Files: src/pages/b/[code].astro

Bug #5 Each Question on Separate Page

Feedback: "Each question shows as a separate page in the PDF instead of being compiled together per contributor."

This was the core architectural issue. The submission model stored one database row per prompt answer, not per contributor. Everything downstream — tribute counts, PDF pages, and the preview — treated each row as a separate "tribute."

Fix: Major rewrite of the PDF layout. Everything from one person is now collected and grouped together before the PDF is built. Each contributor gets their own section: a header with their name and relationship, all their question-and-answer pairs, and all their photos. The Table of Contents lists contributors by name, not by question.
Grouped by Contributor
Preview grouped by contributor
Full Preview Page
Full preview page layout

Files: TributeBookPDF.tsx, PDFDownloadButton.tsx, PDFGenerator.tsx, preview/[code].astro

Bug #6 Wrong Tribute Count

Feedback: "The tribute count shows each question as an individual tribute instead of counting everything from one contributor as one tribute."

Fix: Dashboard now counts unique contributors using new Set(submissions.map(s => name + email)).size instead of submissions.length. The PDF generator also reports contributor count, not row count.
Dashboard showing correct contributor count
Contributor count now shows unique people, not total submission rows

Files: dashboard/[bookId].astro, PDFGenerator.tsx

Bug #7 Link Reusable by Same Person

Feedback: "The invitation link can be used more than once by the same person, creating duplicate tributes."

Fix: When a signed-in contributor revisits the form, the app now checks whether they've already submitted. If they have, the form pre-fills with their previous answers (edit mode) and saving overwrites the original rather than creating a duplicate. Two new database permission rules were added so contributors can view and update their own submissions — and only their own.
Database update deployed: The new permission rules (allowing contributors to read and edit their own submissions) were applied to the live database on 2026-03-02.
Contributor form showing edit mode
Returning contributor form — pre-populated with previous responses when signing in again

Files: b/[code].astro, migration SQL

Bug #8 PDF Says "sayitnow.com"

Feedback: "The back cover of the PDF says sayitnow.com, which is the wrong domain."

Fix: Changed to sayitnowbook.com in both the PDF back cover and the preview page (which had sayitnow.io).

Files: TributeBookPDF.tsx, preview/[code].astro

Discussion #1 Finalize Workflow

Feedback: "Need a way to finalize the book and send it to print (as PDF)."

Implementation:
  • "Finalize Book" button sets book status to published
  • Finalized books show a green banner with prominent "Download PDF" button
  • "Reopen for Contributions" button to revert if needed
  • Confirmation dialog before finalizing
Finalize Button
Finalize Book button on dashboard
Full Book Dashboard
Full book dashboard with finalize workflow

Files: dashboard/[bookId].astro

Discussion #2 Pricing Wording

Feedback: "The pricing shows '/book' which is confusing — it implies a physical book is included."

Fix: Removed /book suffix from all price displays. Added subtitle: "All plans include a digital book with downloadable PDF. Physical printing available separately through our print partner." Updated Premium tier features to consolidate into "High-resolution print-ready PDF."

Before & After

Before (Production)
Pricing before: shows $29/book, $49/book, $69 base/book
After (Updated)
Pricing after: shows $29, $49, $69 with digital clarification

Files: pricing.astro, stripe.ts

Extra One-Pager for Sheri

A standalone, print-ready one-pager Sheri can share with potential customers — or print to PDF. Covers the pitch, how it works, occasions, and pricing in a single scrollable page.

One-pager — full page
Full one-pager: hero, how it works, occasions, pricing, and call to action

File: landing-site/one-pager.html

Product Screenshots

Homepage

Say It Now homepage
Homepage hero with "What would you say at their memorial?" messaging

Create Book Flow

Create a tribute book form
4-step book creation: Details → Questions → Tier → Pay

Super Admin Dashboard

Super admin dashboard
Admin view: all books, search, filters, payment column

Decisions Made

DecisionRationale
Group by contributor in PDFOne section per person, not per question answer
Re-process all photos through the browser before uploadPermanently bakes in the correct orientation before it reaches the PDF generator
Edit mode for signed-in onlyAnonymous contributors can't be reliably identified for updates
Finalize = published statusReuses existing status value in the schema
Keep the permissive book lookup rule in placeAnonymous contributors (who aren't logged in) need it to find a book by share link; the dashboard filters at the query level instead
Physical book pricing deferredText changes done now; pricing structure for fancier books discussed later

Files Modified

FileChanges
TributeBookPDF.tsxMajor rewrite: group by contributor, show question labels, fix domain URL
PDFDownloadButton.tsxUpdated to match new contributor-grouped data structure
PDFGenerator.tsxUpdated data structure, counts unique contributors instead of answer rows
preview/[code].astroContributor grouping, prompt text, all photos, fixed URL
dashboard/index.astroAdded owner_id filter
dashboard/[bookId].astroUnique contributor count, finalize/reopen workflow
b/[code].astroEXIF orientation fix, edit mode for returning contributors
pricing.astroRemoved /book, added digital clarification
stripe.tsUpdated feature list wording
migration SQLDatabase permission rules: contributors can view and update their own submissions
one-pager.htmlNew: shareable one-pager

Deployment Status

ItemStatus
Database permission rules applied to productionDone
Code deployed to sayitnowbook.com (commit aea57d4)Done
E2E screenshots captured via PlaywrightDone

Pending Sheri Review