Students who volunteered to moderate their campus. Approving grants them a college-scoped moderator role and sends a confirmation email. Denying sends a notification email with your comment.
Loading…
📸 PhotosPhoto submissions and suggestions awaiting review — campus/seal/logo suggestions and student-uploaded dorm photos.
📷 Photo Suggestions
Student-submitted campus photos, logos, and seals awaiting review. Approving replaces the live image immediately and notifies the submitter. Denying removes the pending file and sends a notification email.
Loading…
🏠 Dorm PhotosBuilding, common-room, laundry, study-space photos submitted by students. Approve to publish on the dorm detail page.
🚨 ReportsUser-reported content requiring action — user misconduct, broken/spam links, and photo issues.
🚨 User Reports
🚩 Reported LinksUser-reported broken/spam/inappropriate external links. Click Remove from page to strip the link from the dorm/room's external_links column.
📷 Reported PhotosUser-reported photos that won't load, are wrong for the dorm/room, or are inappropriate. Click Remove photo to delete the photo from the public page.
📌 Pending Pin SuggestionsPublic-submitted dorm/room pins for college-level alumni. Approve to apply (calls promoteAlumnusToDorm or promoteAlumnusToRoom), reject to decline.
✍️ Student ContributionsStudent-submitted text content awaiting review — building anecdotes and crowdsourced packing list items.
🎒 Packing ItemsNew packing suggestions and edits to existing items submitted by students.
🎥 Pending VideosUser-submitted room video links awaiting review. Approve to make public, reject to decline, or delete permanently.
⭐ Pending ReviewsSeeded and user-submitted room reviews awaiting approval. Approve to make visible on room pages, or reject to decline.
✨ Pending Before/AfterStudent-submitted move-in → decorated room composites. Approve to make publicly visible on the room page; share-link works for the submitter regardless.
👥 Roommate ListingsFlagged or hidden roommate-finder listings. Use the buttons to flip moderation state. Approved listings show on /roommates.html; flagged + hidden are admin-only.
🏫 Colleges & Dorms
Offline items are hidden from students.
All Dorms
🏛 Special Housing
Overview of Greek houses, theme houses, program houses, and residential colleges across all campuses.
🎓 Greek Chapters
Manage Greek chapter registry, affiliations, and properties.
🚪 Rooms
⚠️
Another save landed first
This record was modified by someone else (or another tab) while you were editing. Your changes are still here — pick how to proceed.
Current server version: —
🩺 Health
Data-completeness dashboards. Each tab shows what's missing or incomplete at that level so you can fix it quickly.
Sort:
🔴 = missing / zero | 🟡 = low / warning | 🟢 = looks good | ⚪ = N/A or offline
College health metrics including online status, enrollment, dorm counts, and content coverage
ID
College
Status
UG Enroll
Grad
Dorms
Stu/Dorm
No Desc
🏛 Greek
🎨 Theme
Rooms
Rm/100
Photos
Ratings
⏳ Queue
📷
Logo
Seal
📍
📝
🏠 URL
🎨 Colors
Founded
Enroll
Loading…
College:
Legend:✓ = has data✗ = missing data— = unknown
Dorm health metrics including status, style, content coverage, and admin actions
Dorm
College
Status
Style
Bathroom
Desc
Photo
Rooms
Reviews
Floor Plans
Actions
Select a college above to view dorm health data.
What users have added, by school — click any column to sort.
Staff-submitted rows are excluded, as is cited research content that we
sourced rather than a visitor typing it (that is ~10,000 rows — mostly highlights and
imported floor plans — and counting it would just rank schools by how much we seeded).
Anonymous submissions ARE included: Guest Mode is on, so most genuine
contributions carry no account.
Rejected items are not counted. Site-wide feedback has no school and is shown below the table.
Loading…
Room-level data completeness. Click any tile to drill in to the existing surface that has the fix flow.
Loading room health…
📋 Recent rooms missing data
Pulled from Missing Info Finder. Click "View →" for full filterable list.
Find colleges and dorms with gaps in high-value fields. Click any field chip to fix it inline. Most-missing rows surface first so you can fix the highest-leverage gaps.
📅 Housing Page Freshness
Lottery rules, deadlines, and class-year cohorts shift year-over-year — this panel flags colleges whose "How housing selection works" narrative is overdue for a re-review.
🧠 User Behavior
Tracks user sessions on the site (blocked IPs excluded). Admin sessions flagged separately — toggle above to include. Events retained 90 days.
👤 Active Users
Tracking:
Loading…
Loading…
📊 Contribution Funnel
How many sessions progress from visiting to contributing content.
Loading…
📅 Daily Sessions
📱 Devices
📄 Views
🚧 Auth Gate Hits — "Tried to act but wasn't logged in"
High numbers here mean users want to do things but friction stops them. Consider lowering the login barrier for these actions.
Action
Gate type
Hits
Unique sessions
Loading…
📋 Form Completion Rates
Opened vs. submitted. Low completion rate = confusing form, too many fields, or friction at a specific step.
Form
Opens
Completes
Rate
Avg time (sec)
Loading…
📐 Section Reach on Dorm Pages
% of dorm page sessions that scrolled far enough to see each section (threshold: 30% in viewport). Sections not visible = content users never reach.
Loading…
📜 Scroll Depth by View
% of sessions that reached each scroll milestone per view. 100% means they read the whole page.
🚫 No-Results Searches — "What we don't have"
These are schools or dorms users searched for that returned nothing. High-frequency no-results = content gap to fill.
Query
Source
Hits
Loading…
🔍 Top Searches
Query
Source
Searches
Loading…
🖱 CTA Click Performance
Which call-to-action buttons users actually click. Low-click CTAs may be buried, poorly labeled, or irrelevant.
CTA
Context
Total clicks
Unique sessions
Loading…
🔧 Filter Usage
Which quick-filters and dropdowns users apply when browsing dorms.
Filter
Value
Uses
Unique sessions
Loading…
Loading…
🕐 Recent Sessions
Last 7 days. Contributing sessions are those where the user submitted at least one form.
Started
Duration
Events
Views
Logged in?
Device
Contributed?
Loading…
📍 Pages Visited
Select a user above to see their journey.
📈 Search Positions
Top 25 colleges + top 25 dorms by impressions. Updated daily by the
search_position_snapshot job. Lower position = better.
Average position over time
Impression-weighted across all tracked pages. The axis is inverted, so
a line going up means you are ranking better.
Tracked pages
👁 Visitor Traffic
or→⏳ long windows take a few seconds
Daily Page Views
Views by Page Type
Hourly Distribution
Top Colleges
Top Dorms
Top Rooms
Devices
Top Referrers
📊 GA4 Insights
(GA4 data is delayed 24-48h)
📈 Daily Trend (GA4)
Top Countries (GA4)
Top US States (GA4)
Top Sources (GA4)
New vs. Returning (GA4)
Devices (GA4)
Top Landing Pages (GA4)
Top Pages by Pageviews (GA4)
🔍 Top On-Site Search Terms (GA4)
What users searched for within DormScouter (site-search, not Google queries).
🔎 Google Search Console
(GSC data is delayed 3-4 days)
📈 Daily Clicks + Impressions (GSC)
Top Google Search Queries
Queries people typed into Google that led them to DormScouter. Shows clicks + avg position.
Top Landing Pages (GSC)
Top Countries (GSC)
Devices (GSC)
👤 User Stats
Daily Signups
Logged-In vs Anonymous Traffic
🔍 Search Analytics
Top Search Queries
Zero-Result Queries
Daily Searches
🔍 Search Misses
Zero-result searches from /api/typeahead — students typed these into the home hero / header search and we returned nothing. Each row is a literal demand signal for a school or dorm to add.
🧩 Wizard Submissions
Every room logged through the Add-a-Room wizard, with live completeness — photos, comments,
filled structured fields, and whether we can reach the contributor by email. Confirms nothing is dropped,
shows exactly what each person added, and surfaces where they could add more.
Click any row to see the full detail (fields, photos, comments, rating, contributor).
🧙 Wizard Funnel — Reorder Lift
Did the Aug 2026 reorder (dorm rating first, room # last) lift contributions? Watch submit/open and dorm ratings/open climb vs. the pre-reorder baseline. Auto-refreshes every 6 hours.
Loading…
🧙 Wizard Funnel by College last 7 days
Per-college breakdown of the Add-Room wizard's start → submit conversion. Red rate = something's broken on that college's dorm picker. Green = healthy.
📱 Wizard Funnel by Device last 7 days
Mobile/desktop/tablet breakdown of opens, step-advances, submits, abandons, exits, and errors — useful for telling "broken on phones" apart from "broken everywhere."
When
College
Dorm
Room
By
New?
Media
Fields
Email?
Loading…
📈 Community Contributions
Genuine user contributions over time — corrections, wizard submissions, reviews, photo uploads, and comments.
Excludes admin/system entries (including the April 2026 bulk correction load). New dorm/college
additions are omitted until user-vs-admin attribution is tracked.
Loading…
🩺 Surface health
Last row seen per input surface, with the anonymous / signed-in split.
Quiet means nothing in the window — which may be a broken form or simply an unused feature.
Either way it is now visible instead of invisible.
Loading…
🌳 Referral Analytics
Two views: By User shows who referred whom person-to-person; By Campaign
shows admin-created tracking links (Reddit posts, FB groups, college newspaper pitches, etc.)
with click + signup detail per link.
Loading stats…
📈 Referral Signups Over Time
🏔 Top Pyramids — Network Builders
Ranked by total downline reach (direct + indirect, recursive). Different from the
points leaderboard — surfaces recruiters whose referrals also become recruiters.
Loading…
📋 All Referrals
Every referrer→referee pair, most recent first. The Funnel column shows where
each referee is in the conversion path: signed up → contributed → became recruiter.
Loading…
💰 Top Chain Earners
Sorted by total points earned through the unlimited-depth halving ledger
(direct + every ancestor level). Different from "Top Pyramids" — that
ranks by descendant count, this ranks by actual payouts received.
Loading…
🔺 Chain Payout Ledger
Source-of-truth audit log. Every signup writes one row per ancestor
(level 0 = direct, level N = great^N-grandparent). Halving stops when
below 0.5 pts. Daily-capped rows show what was clamped — those rows
sum 0 in recalcs.
Loading…
🔍 Pyramid Explorer
Pick any user to see their full referral tree — direct invites and everyone
their invites invited, recursively. Cap is 10 levels deep.
+ Create a campaign link
Make a named tracking link for a specific post / group / channel. The shareable URL will be
dormscouter.com/r/<slug> — every click increments a counter and writes a row
with timestamp, hashed IP, and user-agent. Signups are auto-attributed when the user signs up
from the same browser session.
📋 Campaigns
Loading…
📥 Inbox
Drop screenshots, logs or notes here and Claude can read them — no NAS, no file paths.
Works from your phone (the picker opens Photos).
Upload files
Credentials
Stored server-side and never echoed back — the listing above shows only a length,
so a secret never lands in a chat transcript or a screenshot.
👥 Activity Log
Every user submission and moderator action is recorded here. Use the tabs to switch between user contributions and moderator decisions, or view all in one place.
User Contributions excludes staff: a contribution made by an admin or moderator appears under Moderator Actions, so the first tab answers "what are real users adding?" (357 rows) rather than reflecting our own work back (4,772 of the old 5,223 were the owner's own account).
📊 Content Quality
Correction approval rates by college. Low approval rates may indicate spam submissions or ambiguous field descriptions. Sorted lowest-quality first.
📜 Audit Log
🔍 Recent Submissions
All new content across every type — reviews, comments, tips, packing items, highlights — in one chronological feed.
Use this when running in post-moderation mode (Moderation OFF, Guest Mode ON): content goes live immediately
and you review after the fact. Click Remove to soft-delete anything inappropriate.
Public mode: ranks all users by total points (reviews + photos + corrections + accepted suggestions). Mod-curation mode: ranks moderators+admins by approve/reject actions only — does NOT count their own submissions.
Where our accounts say they are. Chose it means the person picked their school on their profile or the signup prompt. .edu match and signup form were filled in by the backfill from an email domain or a registration field — informative, but not someone telling us. The three columns on the right answer a different question — whether those accounts are actually here. Active counts any sign of life: a signed-in page view, a sign-in, a logged action or a contribution. Contributors is anyone who has ever added a review, photo, correction, tip or highlight. Someone reading while signed out is invisible to all of these, so treat them as a floor rather than a full count. Click a school to see its people, or a column heading to sort.
👤 User Management
Add a User
Create accounts manually for moderators. In production this will be handled by OAuth (Google/Apple login).
📈 Signups last 30 days
👤 User Profile
📨 Email matches .
Loading…
Loading…
🎟 Invite link
🔀 Merge Account
Merge this account's contributions and linked emails into another account. The source account will be deactivated.
⚠️ Danger Zone
🔔 Send Notification
🔑 Set Password
📈 User Journey
Loading…
🎓 Accounts at this school
Loading…
📋 College Assignments
Loading…
💤 Dormant Users
Users who signed up N+ days ago but have made zero contributions. Users contacted within the last 30 days are automatically deselected to prevent repeat emails.
🏷 Moderator Assignments
How scope works:Global moderators can review any content. College moderators can review content for a specific college. Dorm moderators can review content only for a specific dorm building.
Assign a Moderator
✍️ Attribution
Search for corrections, reviews, or photos and change who is credited as the submitter.
Enter a name above to search.
⚙️ Settings
Moderation Mode
Controls whether submissions wait for admin review before going live. ON (recommended): everything submitted by regular users or guests sits in the moderation queue until an admin approves it. Admin and super-admin submissions always bypass the queue. OFF: all submissions go live instantly — use the 🔍 Recent Submissions feed to review and remove content after the fact.
🚪 Guest Submission Mode
Controls whether visitors must create an account before contributing. ON: anyone can submit reviews, comments, tips, corrections, highlights, and packing items without signing up — all go through moderation (see above). A nudge popup encourages guests to sign up to earn leaderboard points. OFF: users must be logged in to submit anything — stronger spam protection but higher barrier to contribute.
⭐ Wizard step 1 on the SSR dorm page
Renders the room wizard's first step (the four dorm stars) as a real form on the server-rendered dorm page, so "Add your room" banks a rating instantly instead of waiting ~7s for the SPA shell on a slow connection; the wizard then opens on step 2. Needs Guest Submission Mode ON (the form posts without a token — it is not rendered otherwise). Funnel events: ssr_step1_shown / ssr_step1_submit / ssr_step1_error. Default OFF.
📱 Social Media URLs
Public-facing links surfaced in the footer + hamburger drawer when set. Leave any field blank to hide that platform's link.
🏷️ Amazon Affiliate Tag
The Associates tag is appended as ?tag=<value> to every Amazon link across the shop, the Moving Hub strip and the dorm shop rail. It is edited in the Affiliate panel, which is the only place that writes it.
Send a test email to verify your SMTP/Resend configuration is working correctly.
🧪 Signup Testing
The live signup form only accepts .edu addresses. To test the full signup → verification email flow with a non-.edu address, use the form below. It creates the account and sends the magic-link email exactly as a real signup would.
Note: @dormscouter.com addresses are always allowed on the main signup form too.
🎨 Brand Assets
Upload logos, favicons, and PWA icons. Changes take effect on the next page load — no redeploy required. Uploading a file automatically updates the stored URL.
Logo (Light mode)
Logo (Dark mode)
🔖 Favicons & Small Icons
16×16 favicon
32×32 favicon
Apple Touch (180×180)
📱 PWA Icons (manifest.json)
192×192 PWA icon
512×512 PWA icon
🛡 Blocked IPs & Words
🚫 Blocked IP Addresses
IPs on this list cannot submit comments, ratings, or photos.
📉 Analytics discard list
Traffic from these IPs or IPv4 CIDR ranges is dropped from the stats only — scrapers and spoofed bots. Requests are still served, so this is separate from the request block above. One entry per line, e.g. 43.172.0.0/15.
🔤 Blocked Words & Phrases
Words that trigger automated actions on new submissions.
✉️ Email
All email campaigns are off by default. Toggle them on here when you're ready to send. Templates can also be edited below.
📈 Email engagement — opens & clicks (Resend)
Loading…
Opens are approximate — Apple Mail pre-loads images and inflates them. Clicks are the reliable signal.
Campaign Toggles
🔔 Watch Room Notifications
Email watchers when a room they follow gets a new review.
📷 24h Room-Photo Nudge
One thank-you email 24h after someone adds a room with no photos, asking for a photo when they get a chance. Signed-in contributors only, once per room ever, and the candidate window is bounded to 24-48h old so there is no backlog blast. Daily cron: room_photo_nudge_run.
🎂 Anniversary Nudge
Email past reviewers on the 1-year anniversary of their review asking for an update. Preview eligible reviews →
📅 Semester Campaign
Email past reviewers at the start of each semester to encourage fresh reviews.
🎓 Graduation Nudge
Auto-fires from the daily June 30 cron when a student's grad_year passes. Sends a "Congrats — you're an alum!" email + grants the alumni badge. Toggle OFF if you want the cron to flip students to alumni silently (badge only, no email).
📋 Condition Report — Move-Out Nudge
Daily cron, fires only in May. Emails users who have not yet documented their room this year, inviting them to use the move-out wizard before they leave. Idempotent via users.condition_report_moveout_nudge_year.
📦 Condition Report — Move-In Nudge
Daily cron, fires only in August. Emails users who have not yet documented their room this year, inviting them to use the move-in wizard while they unpack. Idempotent via users.condition_report_movein_nudge_year.
💤 Re-engagement Nudge
Manual trigger only — sent from the Dormant Users panel. Emails users who signed up but never contributed, inviting them back. Skips users emailed within the last 30 days. Default OFF — flip ON to enable sends from the Dormant Users panel.
📬 College Follow Weekly Digest
Manual trigger — sends each follower a personalized recap of new reviews and dorms at their followed colleges in the past 7 days. Only sends to followers with at least one active college. Skips anyone sent a digest in the last 6 days.
🚫 Admin-Alert Kill-Switches
Per-event admin email pings. All default to OFF (silenced) as of Phase 1 of the Communications Management System rollout.
The data behind each event still appears in its admin sub-tab — flipping a toggle ON just adds an email ping when the event happens.
Flip something ON only if you specifically want a real-time email for that event class.
📬 Contact Form Submissions
Email when someone submits via /contact. Data lives in 📬 Contact Messages sub-tab.
✨ New Website Suggestions
Email when someone submits a website suggestion. Data lives in ✨ Suggestion Dashboard.
💬 Suggestion-Thread Replies
Email when a submitter replies on an existing suggestion thread. Visible inside the suggestion detail modal.
🏠 Addition Requests
Email when a user requests a new college/dorm/room. Data lives in Submissions Queue.
🔺 Referral Signup
Email when someone signs up using a user's referral link. Default off — flip on for short bursts during a viral run. Data lives in Referrals.
⚠️ Disk Usage Warning (80%)
Email when the daily disk-usage cron reports the production VPS partition has crossed 80% full. Default off — the in-app bell always fires.
🚨 Disk Usage Critical (90%)
Email when the daily disk-usage cron reports the production VPS partition has crossed 90% full. Default off — flip on if you don't watch the bell.
📨 User-Facing Referral Emails
User-initiated referral emails. Default on — flip off only if a deliverability issue arises.
📧 Send invite emails
Allows logged-in users to email a referral invitation through DormScouter. When off, the invite-send route returns 503.
🎉 Signup confirmation to referrer
Sends "your friend joined" email to the direct referrer at level 0 of the chain. Ancestors don't receive emails (would be noisy).
📝 Email Templates
Edit subject lines and HTML body for each email type. Use {{variable}} placeholders — they are replaced at send time.
📝 Rich text editor — variables like {{poster_name}} are preserved literally.
📅 Run Semester Campaign
Send the semester campaign email to all past reviewers (skips those already sent this campaign ID).
Manage email digest preferences for all admins and moderators. You can set frequency (off/hourly/daily/twice-daily) and enable/disable digest emails per recipient.
Email digest preferences for admin and moderator users
User
Role
Admin Digest
Mod Digest
Actions
Digest Format: OFF = no emails sent | HOURLY = send if ≥1h since last send | DAILY = send if ≥24h since last send | TWICE-DAILY = send if ≥12h since last send. Emails only send when there are pending items (zero pending = no email).
🛒 Affiliate Products
The Amazon catalogue and curated lists, plus the partners, offers and surfaces that place them. Nothing appears on the public site until you enable it in Settings.
⚠️ Feature disabled
Curated Lists
Partners
Who pays us. Every offer belongs to one partner, so pausing a partner takes all of its offers off the site at once without editing them one by one.
Offers
One thing to show, plus the rules that say where. Inside a rule kind any single match is enough; across kinds every kind you have set must match. A kind with no rule does not constrain the offer at all.
Surfaces
Page type and format are fixed by the code that renders each surface — an offer only appears here if it declares this surface's format. Match strength is the weakest targeting that earns a slot: any match accepts an offer targeted only at the visitor's home state, college's own state needs the page's college to be in the offer's state list, strong only needs a dorm hook, a radius or a named college.
Amazon Associates Settings
Find this in your Amazon Associates account under Account Settings → Associate ID. All affiliate URLs are generated dynamically — change the tag here and every link on the site updates instantly.
Amazon reports clicks, orders and earnings per tracking ID, so giving a surface its own ID
is the only way to learn which one actually earns. Leave a field blank to use the main tag above.
🚨 Create the ID in Associates Central first (Account Settings →
Manage Your Tracking IDs). An ID that does not exist on the account earns nothing —
Amazon does not fall back, the click is simply uncredited.
The fot= value stamped on a FlexOffers tracking link at click time, so FlexOffers reports
blog clicks and page placements as separate campaigns. Codes come from the campaigns you create in the
FlexOffers dashboard (Default Campaign is 9999). The article slug or surface rides along as SubID.
Your AWS access key ID from the PA API application. Leave blank until approved.
Your AWS secret access key. Stored encrypted in settings. PA API requires 3 qualifying sales before access is granted.
Fetches current prices and images for all active products. Run this after your PA API access is approved. Takes ~1 minute for 60 products.
When off, no affiliate links or product sections appear anywhere on the public site regardless of list publish status.
⚠️ Not signed up yet? Enable this only after your Amazon Associates application is approved and you have a valid affiliate tag. Using affiliate links without an approved account violates Amazon's TOS.
or→
🤝 Partner offers
Impressions and clicks per offer and surface. Non-Amazon clicks are counted by the /go/<slug> redirect; Amazon offers link direct, so their orders and earnings stay in Associates Central. Internal traffic is already excluded.
🛍️ Personal Wishlist
Private — only visible to you. Not published anywhere on the site. Just your personal shopping list.
Add Product
🚨 Out of stock is not a reason to go offline. Stock comes back and
the page stays useful; a temporarily unbuyable link costs far less than losing the
item from its list. Take a product offline only when the listing is gone —
404, dead link, or wrong product.
📷 Manual fallback image
Upload your own or a manufacturer image — don't save one from amazon.com. If Amazon's API later provides an image, it replaces this one automatically.
Create List
Edit List
In this list
Loading…
Add from catalog
Add partner
Lower-case letters, digits and dashes. Set once — it cannot be changed later.
Leave blank if you do not know. Blank means unknown, and that is more useful than a guess.
A rate with no source is the thing that gets repeated as fact later.
Add offer
The offer
What a reader sees.
Already published as /go/<slug> — changing it breaks any link that used the old one.
Weighted rotation — a 10 is drawn ten times as often as a 1.
Where the click goes
Either a partner landing URL — clicks counted through /go/<slug>, the only way we see a network's clicks — or a product from the Amazon catalogue, linked direct with that surface's tracking ID.
Creative
A surface only shows an offer whose formats include that surface's own format.
Formats *
Run dates and status
A one-off dated campaign. For a window that repeats every year use a season or boost rule instead.
Targeting
Any one match inside a section is enough; every section you fill in has to match. An empty section places no limit at all — leave it alone and the offer is unconstrained on that axis.
Surfaces
Which places on the site this offer may appear in. Nothing ticked means any surface.
States
Matches when the page's college is in one of these states, or the visitor's own home state is. Nothing added means every state.
Colleges
Named schools. A college match is a strong match, so it clears every surface's match-strength floor.
Radius from service points
Matches when the college sits within this many miles of any one point — a partner's nearest stop or depot, measured straight-line, not along a route. Also a strong match.
Dorm facts
A fact about the building this offer answers. Only ever matches on a dorm page, and counts as a strong match.
Audience
Stored but not evaluated yet — nothing in the request tells the resolver who is reading. Set it to record intent; today it gates nothing.
Season windows
A gate: outside every window the offer does not show at all. Month and day, repeating every year; a window may wrap past 31 December.
Boost windows
Never a gate: inside the window the offer's weight becomes the boost weight, so it simply shows more often. Outside it the offer still runs, at its own weight.
📍 Campus Buildings
Add key campus buildings for each college. DormScouter calculates walking distances from each dorm using their lat/lng coordinates.
Add Building
Auto-fills from college center via Haversine when blank. Override if the actual route is longer (fences, hills, construction).
💡 Tip: Find lat/lng by right-clicking any location on Google Maps and selecting "What's here?"
☕ Campus Eateries
Cafés, grab-n-go, food trucks, convenience stores, and other ancillary food locations that live outside residence halls. For full-service meal-swipe dining halls (Valentine, Morrison, etc.), use the Dining Halls panel instead.
Add Eatery
Auto-fills from college center via Haversine when blank. Override if the real route deviates.
💡 Tip: Eateries with lat/lng coordinates show distance from each dorm on the public dorm pages.
🗑 Account Deletions
Users who have requested account deletion. They have a 30-day grace period before their PII is scrubbed — sign-in is blocked but their content stays attributed. Click Restore to undo the deletion, or Force delete to scrub immediately (skips the grace period). Both actions are audit-logged.
Loading…
🎒 Ambassador Applications
Students who applied via dormscouter.com/ambassadors.
Approve to admit them to the program; decline if they're not a fit. After approving, follow up by email with onboarding materials + compensation kickoff. Audit-logged.
Loading…
⏰ Jobs & Ops
⏰ Scheduled Jobs
Background jobs that run automatically. Change frequency with the dropdown — takes effect immediately.
Toggle the switch to pause a job. ▶ Run now fires it immediately regardless of schedule.
Loading…
🌱 Deploy guard runs
Every script in the deploy guard tier — when it last ran and whether it succeeded.
Auto-refreshes every 60 seconds while this tab is open.
not run indays
🖥 Server Info
Loading…
⬇ Export Data
Download approved content as CSV files for analysis or backup.
⭐
Ratings Export
All approved ratings including scores, reviewer info, college, dorm, and room.
Schools and dorms added as placeholders by students from the room wizard. Fill in the missing fields and publish them.
Loading…
📸 Photo Audit (Colleges)
Review and lock college imagery (campus / logo / seal). Lock = admin verified the photo is correct → public "Suggest" pills hide automatically.
📸 Photo Audit (Dorms)
Review and lock dorm building photos across every college.
🖼 Photo Hygiene
Review, rotate, recategorize, and caption approved dorm & room photos. Breadcrumb on each card shows College → Dorm [→ Room] for context. Changes save immediately.
Select a college or click Refresh to load photos.
Photo Review
Space = mark reviewed & next · → = skip · ← = back · R = rotate right · L = rotate left · Esc = exit
✨
Suggestion Dashboard
User-submitted improvement ideas. Submissions auto-email hello@dormscouter.com. Click any card to open the chat thread + admin notes, or use the status buttons to move items between columns.
🔔
0 suggestion(s) pending review
Click Pending below or scroll the Kanban to triage.
—
⏳ Pending
—
✅ Approved
—
🔨 In Progress
—
🚀 Shipped
—
✅ Verified
—
✗ Declined
—
🔁 Deferred
Tip: paste the export into a fresh Claude chat. After it lands in production, click "Last export" to bulk-mark all items as shipped.
Last batch export
Loading…
📁 Source of truth: bug entries live in BUGS_LOG.md at the repo root. Edit there (it rides in commits with code fixes); this view is auto-rebuilt on every page load via GET /api/admin/bugs-log. Newest entries are at the top of the file.
📬 Contact Messages
Public contact form submissions categorized by type (general, press, advertising, partnership, legal, bug, other). Click a card to view full message, update status, and add notes.
📝 Blog Articles
Write and publish articles at /blog. Articles can be college-specific or general guides. HTML body is supported.
New Article
📝 Rich text editor — bold/italic/links/images/colors below. No HTML knowledge needed.
👁 PreviewUnsaved changes — this is how the article will look once published
🧪 Feature Testing
Try new UX ideas before they go live. These features use real data and can be tested end-to-end.
⚡ Max's Quick Add Room
Simplify the room-addition UX by replacing the 4-button Quick Capture FAB with a single prominent "Add My Room" button. Opens the room wizard directly with photo capture included.
📱 Phone-size preview: Single "Add My Room" button with immediate wizard flow
Google Maps-style micro-survey: one multiple-choice question at a time, auto-advancing after selection, save-as-you-go with localStorage, points tally at top. Users can stop anytime without losing progress.
Checks on the shipped site that need a human rather than a runner.
Open this tab on a phone to run the device battery.
📱 Real-device diagnostic
Runs in real mobile Safari the things headless Chromium cannot check —
position:sticky in a scroll container, dvh, and safe-area insets —
plus a hit-test sweep of every modal.
Off by default; the write endpoint 404s when disabled.
🖼 Visual review
Mobile screenshots at 402×714 (iPhone). Say what looks wrong in your own words —
"the heading is cut off", "this button is way too small" — and mark it as an issue.
Anything you mark gets picked up and fixed.
Loading…
📄 Site Pages
Edit the content of /about, /faq, /privacy, and /terms. Changes push live immediately — no redeploy required. HTML is supported.
📝 Rich text editor — bold/italic/links/images/colors below. No HTML knowledge needed.
👁 PreviewUnsaved changes — this is how the page will look once saved
📋 Condition Report Photos
Private photos students uploaded via the Room Condition Report Wizard. Only promote photos that are clearly educational — typical room features, layout, furniture. Damage photos go anonymous on promote regardless.
When in doubt, leave private.
0 selectedDamage photos in the selection are forced anonymous on promote.
📋 Condition Reports
Every finalized Room Condition Report session. Their photos already flowed through the normal photo pipeline above; this table is for the PDF.
🤖 Auto-Authored Highlights
Highlights and watch-outs authored by DormScouter (bulk-curated, not student-submitted). Edit text, change status, or delete any entry.
For pending student submissions, use the Moderation Queue → ✨ Highlights tab instead.
🏘 Pod/Suite Groups
Group rooms that share a suite, pod, apartment, or wing. Photos tagged
suite_common_room
on any member room appear on every sibling room. Approve user suggestions below, or create new groups manually.
🕐 Pending Suggestions 0
Select a college and dorm to view its groups.
New Pod/Suite Group
Edit Group
➕ Create Suggestion
Enter suggestion details. This creates the suggestion record without sending an email.
Up to 5 files, 10MB each. Screenshots help us understand what you saw.
Loading…
Preview
🔒
What does Lock do?
Lock = approve AND mark as canonical. Locked items get is_featured=1 on the underlying review/photo/comment row, which has two effects:
Pinned — locked items are surfaced more prominently on the public site (featured badge, sorted to the top).
Protected — automated seed scripts and batch imports check the locked flag before overwriting. Use this for verified content you don't want a future deploy to silently revert (e.g. an admin-confirmed photo, an authoritative review, a corrected field).
Regular ✓ Approve doesn't set the featured flag — future processes may still overwrite or supersede the row. Use plain Approve for routine submissions; reach for Lock only when you've verified something is authoritative.
Loading…
Suggestion
← →
📎 Attachments
✓
Status
💬 Conversation
✍️ Change Credit
Search for a registered user, or enter any name.
Message #
From:
Category:
IP:
Received:
Message
✅ Reply sent —
Subject:
✉️ Reply to sender
⚠️ No email address on this message — cannot send a reply.