Page: Contact Us
Code: CONT Route:
/contact Access: Public Priority: P1 Test Script: scripts/page-tests/test-CONT.sh Components: src/components/marketing/index.ts Purpose
Provide a way for visitors to contact Peerloop for support, partnerships, press inquiries, and general questions. Reduce friction for potential users with questions.
Connections
Incoming (users arrive from)
| Source | Trigger | Notes |
|---|---|---|
| HOME | Footer 'Contact' link | Primary entry |
| FAQP | "Contact Us" CTA | Fallback from FAQ |
| Footer | "Contact" link | Global footer link |
Outgoing (users navigate to)
Data Requirements
| Entity | Fields Used | Purpose |
|---|---|---|
| contact_submissions | name, email, subject, category, message, created_at | Store contact form submissions |
Sections
Hero
- • Headline: "Get in Touch"
- • Subheadline: "We're here to help. Reach out and we'll respond within 24 hours."
Contact Form
- • Name (required, min 2 chars)
- • Email (required, valid format)
- • Category dropdown (7 options)
- • Subject (required, min 5 chars)
- • Message (required, min 20 chars)
- • Submit button: "Send Message"
FAQ Redirect Card
- • "Looking for Quick Answers?"
- • "Visit FAQ" button → /faq
Alternative Contact Methods
- • support@peerloop.com
- • partnerships@peerloop.com
- • press@peerloop.com
Social Links
- • Twitter/X
Office Info
- • Address display
- • Remote-first note
User Stories Fulfilled
- • US-G020
- • US-G021
States & Variations
| State | Description |
|---|---|
| Default (idle) | Empty form ready for input |
| Submitting | Spinner on button, fields disabled |
| Success | Thank you message with CTAs |
| Error | Error banner shown, form remains |
| Validation Error | Inline field errors shown |
Mobile Considerations
- • Form fields full-width
- • Category dropdown native on mobile
- • Submit button prominent and thumb-accessible
- • Sidebar stacks below form
Error Handling
| Error | Display |
|---|---|
| Form submission fails | Show error message with retry option |
| Invalid email format | Inline validation error |
| Field too short | Inline validation with min length message |
Analytics Events
| Event | Trigger | Data |
|---|---|---|
page_view | Page load | source, referrer |
form_start | First field interaction | field_name |
form_submit | Form submitted | category, success |
Notes
- • Form submission stores to D1 contact_submissions table
- • Email notification via Resend planned for Block 9
- • Rate limiting not yet implemented
- • Has dev mode toggle (PageSpecView + real content)
- • Responsive: form full-width on mobile, sidebar stacks below
Features
Contact Form
- ✓ Hero with headline and subheadline [US-G020]
- ✓ Contact form with 5 fields (name, email, category, subject, message) [US-G020]
- ✓ Category dropdown (7 options) [US-G020]
- ✓ Client-side validation with inline errors [US-G020]
- ✓ Form states: idle, submitting (spinner), success, error [US-G020]
- ✓ Success message with "Return to Home" + "Send Another" options [US-G020]
Sidebar Info
- ✓ FAQ redirect card [US-G020]
- ✓ Alternative contact emails (3) [US-G021]
- ✓ Social links (Twitter/X, LinkedIn, Instagram) [US-G020]
- ✓ Office address info [US-G020]
Backend
- ✓ Form submission to POST /api/contact [US-G020]
- ✓ Submissions stored in D1 contact_submissions table [US-G020]
- ○ Email notification via Resend [US-G020] Planned for Block 9
Interactive Elements
Buttons: 2/2 active
Links: 8/8 active
Buttons
| Element | Component | Action | Status |
|---|---|---|---|
| Send Message | ContactPage | Submits form, shows spinner | active |
| Send Another Message | SuccessMessage | Resets form to idle | active |
Links
FAQ Card
| Element | Target | Status |
|---|---|---|
| "Visit FAQ" | /faq | active |
Success State
| Element | Target | Status |
|---|---|---|
| "Return to Home" | / | active |
Contact Emails
| Element | Target | Status |
|---|---|---|
| support@peerloop.com | mailto: | active |
| partnerships@peerloop.com | mailto: | active |
| press@peerloop.com | mailto: | active |
Social Links
| Element | Target | Status |
|---|---|---|
| Twitter/X | External (twitter.com) | active |
External (linkedin.com) | active | |
External (instagram.com) | active |
Target Pages Status
| Target | Page Code | Status |
|---|---|---|
/faq | FAQP | Implemented |
/ | HOME | Implemented |
Verification Notes
Verified: 2026-01-08 Consolidated: 2026-01-08
Verified Components
- ✓
src/components/marketing/ContactPage.tsx
Screenshots
- 📷
CONT-2026-01-08-02-20-00.png- Full page with form
Notes
- • All interactive elements are functional
- • Form validation works client-side
- • Form submits successfully to /api/contact
- • All email links use mailto: protocol
- • Social links open in new tab with proper rel attributes
- • Analytics planned for Block 9
Test Coverage
Component ✓
Page ○
SSR ○
API 1/1
✓ Ready
Script:
scripts/page-tests/test-CONT.sh Page Test:
tests/pages/contact.test.tsx ○ Component Test:
tests/components/marketing/ContactPage.test.tsx ✓ API Tests
| Endpoint | Test File | Status |
|---|---|---|
POST /api/contact | tests/api/contact.test.ts | ✓ tested |
Discrepancies (Spec vs Implementation)
As of 2026-01-08
Planned but Not Implemented
| Feature | Original Spec | Status | Priority |
|---|---|---|---|
| Email notification via Resend | Send email to support team on form submission | Planned for Block 9 | Medium |
| Analytics events | 3 events (page_view, form_start, form_submit) | Not implemented | Low |
| Map embed | Optional map showing office location | Not implemented | Low |
Get in Touch
Have a question? We'd love to hear from you. Send us a message and we'll respond within 24 hours.
Other Ways to Reach Us
support@peerloop.com
For general inquiries and support
partnerships@peerloop.com
For business and partnership opportunities
press@peerloop.com
For media and press inquiries
We typically respond within 24 hours on business days.
Our Office
123 Learning LaneSan Francisco, CA 94105
United States
We're a remote-first company, but our headquarters is in San Francisco.