Troubleshooting Guide
Solutions for common issues and error messages.
Troubleshooting Guide
Solutions for common issues and error messages.
Table of Contents
- Photos Not Syncing
- Listings Not Appearing in Search
- Magic Links Not Working
- Sync Stuck in Running
- Rate Limit Errors from Bridge
- Error Code Reference
- Contact Form Not Working
- Map Not Loading
- Slow Performance
- Mobile Display Issues
Photos Not Syncing
Symptoms
- Listings show but photos are missing
photo_countis 0 in databaseMediaURLis null in raw data
Root Cause
Using $expand=Media in Bridge API queries causes MediaURL to return null. This was confirmed by Bridge Interactive support in January 2026.
Solution
DO NOT use $expand=Media in Bridge queries. Media is already embedded in the Property response.
Wrong (causes null MediaURL):
/Property?$expand=Media&$top=200Correct (MediaURL populated):
/Property?$top=200Verification
Check if listings have media:
SELECT l.id, l.mls_number, l.photo_count,
jsonb_array_length(l.raw->'Media') as raw_media_count
FROM listings l
WHERE workspace_id = 'your-workspace-id'
LIMIT 10;Check media URLs in raw data:
SELECT l.raw->'Media'->0->>'MediaURL' as first_photo_url
FROM listings l
WHERE workspace_id = 'your-workspace-id'
AND l.raw->'Media' IS NOT NULL
LIMIT 5;Fix Existing Data
Re-run full sync to repopulate photos:
- Admin App → Workspace → Import Task → Run (Full Sync)
- Wait for completion
- Verify photos appear
Listings Not Appearing in Search
Symptoms
- Listings exist in Postgres but search returns nothing
- Filters show 0 results
- Facet counts are empty
Diagnosis
Check if listings exist in Postgres:
SELECT COUNT(*) FROM listings WHERE workspace_id = 'your-workspace-id';Check Typesense collection:
curl "https://your-typesense-host:8108/collections/workspace_slug" \
-H "X-TYPESENSE-API-KEY: your-key"Solutions
1. Typesense collection doesn't exist
Create collection and reindex:
# The sync process should auto-create, but if needed:
# Check packages/typesense for collection schemaThen run full sync to reindex all listings.
2. Typesense indexing failed during sync
Check sync run for errors:
SELECT * FROM sync_runs
WHERE workspace_id = 'your-workspace-id'
ORDER BY started_at DESC
LIMIT 5;Reindex by running full sync:
- Admin App → Import Task → Run (Full Sync)
3. Schema mismatch
If fields were added/changed:
- Export existing documents (if needed)
- Delete collection
- Run full sync to recreate with new schema
4. Workspace slug mismatch
Typesense collections are named by workspace slug. Verify:
SELECT id, slug FROM workspaces WHERE id = 'your-workspace-id';Magic Links Not Working
Symptom: Link redirects to wrong domain
Cause: Domain not in Supabase Redirect URLs
Solution:
- Go to Supabase Dashboard → Authentication → URL Configuration
- Add
https://your-domain.com/**to Redirect URLs - Save and test with new magic link
Symptom: Link goes to correct domain but user not authenticated
Cause: Callback route issue or missing code exchange
Diagnosis:
- Check browser console for errors
- Check Supabase Auth logs
Solution:
- Verify
/auth/callback/route.tsexists and handles code exchange - Check middleware allows
/auth/callbackroute - Ensure
exchangeCodeForSession()is called
Symptom: "Invalid or expired link" error
Cause: Magic link expired (default 1 hour) or already used
Solution:
- Request new magic link
- Check email delivery time (delays can cause expiration)
- Ensure link is only clicked once
Symptom: Email never arrives
Causes:
- Spam folder
- Email delivery issues
- Invalid email address
Diagnosis: Check Supabase Auth logs for send attempts.
Solution:
- Check spam/junk folder
- Try alternate email
- Verify email in Supabase dashboard
Sync Stuck in Running
Symptoms
- Sync shows "running" for >30 minutes
- New syncs won't start
started_atis old, noended_at
Diagnosis
SELECT id, started_at, ended_at, status, records_fetched
FROM sync_runs
WHERE workspace_id = 'your-workspace-id'
AND status = 'running';Solutions
1. Cancel via Admin UI
Admin App → Workspace → Sync Runs → Cancel button
2. Cancel via SQL
UPDATE sync_runs
SET status = 'error',
error = 'Manually cancelled - stuck sync',
ended_at = NOW()
WHERE id = 'stuck-sync-run-id'
AND status = 'running';3. Prevent future issues
- Check for network timeouts in logs
- Ensure worker has sufficient timeout (300s for Vercel)
- Monitor memory usage during large syncs
Rate Limit Errors from Bridge
Symptoms
- HTTP 429 errors in sync logs
- Sync fails partway through
- "Too Many Requests" error message
Understanding Rate Limits
Bridge Interactive typically allows:
- 1-2 requests per second for bulk operations
- Higher limits for simple queries
Our sync worker includes 100ms delays between pages.
Solutions
1. Backoff and retry
The sync worker has built-in retry with exponential backoff. Usually waiting 5-10 minutes and retrying resolves the issue.
2. Reduce sync frequency
Change import task cadence:
- Admin App → Import Task → Edit → Cadence
- Switch from
hourlyto6hordaily
3. Optimize filters
More specific filters = fewer pages to fetch:
# More specific (fewer results)
City eq 'Miami Beach' and StandardStatus eq 'Active' and ListPrice ge 1000000
# Less specific (more results, more pages)
StandardStatus eq 'Active'4. Contact Bridge support
If persistent, contact support@bridgeinteractive.com about:
- Your rate limit tier
- Potential limit increases
- Best practices for bulk operations
Error Code Reference
HTTP Status Codes
| Code | Meaning | Action |
|---|---|---|
| 400 | Bad Request | Check request payload, filter syntax |
| 401 | Unauthorized | Check/refresh Bridge token |
| 403 | Forbidden | Check user permissions, workspace membership |
| 404 | Not Found | Check resource ID, dataset ID |
| 409 | Conflict | Resource already exists, check for duplicates |
| 429 | Rate Limited | Wait and retry with backoff |
| 500 | Server Error | Retry, check service status |
Bridge API Error Codes
| Error | Meaning | Action |
|---|---|---|
InvalidFilterExpression | OData syntax error | Check filter syntax |
InvalidFieldName | Field doesn't exist | Check RESO field names |
Unauthorized | Token invalid/expired | Update token in MLS settings |
QuotaExceeded | Rate limit hit | Wait and retry |
Supabase Error Codes
| Code | Meaning | Action |
|---|---|---|
PGRST301 | Row-level security violation | Check user permissions |
23505 | Unique constraint violation | Record already exists |
42501 | Permission denied | Check RLS policies |
42703 | Column doesn't exist | Check schema, run migrations |
Application Error Messages
| Message | Meaning | Action |
|---|---|---|
Workspace not found | Invalid workspace ID | Check ID in URL |
MLS connection not configured | No Bridge credentials | Set up MLS connection |
Field mapping not found | No active mapping | Create field mapping |
Import task disabled | Task not enabled | Enable import task |
Sync already running | Duplicate sync attempt | Wait for current sync |
Contact Form Not Working
Symptoms
- Form submits but no email received
- Form shows error on submit
- Rate limit errors
Diagnosis
- Check browser console for errors
- Check API response from
/api/contact - Check rate limiting (5 req/min for auth tier)
Solutions
Rate limited
Wait 1 minute, or if testing, temporarily increase limit.
Email not sending
- Check email configuration in environment variables
- Verify recipient email is valid
- Check spam folder
Validation errors
- Ensure all required fields filled
- Check email format
- Verify message length within limits
Map Not Loading
Symptoms
- Map container shows but no map tiles
- "Map unavailable" error
- Console shows API errors
Diagnosis
- Check browser console for errors
- Verify map API key in environment variables
- Check if listings have coordinates
Solutions
Missing API key
Add map provider API key to environment variables.
Missing coordinates
SELECT COUNT(*) FROM listings
WHERE workspace_id = 'your-workspace-id'
AND (latitude IS NULL OR longitude IS NULL);If many listings lack coordinates, check field mapping for latitude and longitude.
API quota exceeded
Check map provider dashboard for usage limits.
Slow Performance
Symptoms
- Pages take >3 seconds to load
- Search is sluggish
- Timeouts on large workspaces
Diagnosis Areas
- Database: Check query performance
- Typesense: Check search latency
- Network: Check asset loading
- Client: Check browser performance
Solutions
Slow database queries
-- Check for slow queries
SELECT * FROM pg_stat_statements
ORDER BY mean_time DESC
LIMIT 10;Add indexes for common query patterns:
CREATE INDEX IF NOT EXISTS idx_listings_workspace_status
ON listings(workspace_id, standard_status);Slow search
- Check Typesense server resources
- Optimize search queries (limit facets, use filters)
- Consider caching common searches
Large images
- Use optimized image formats (WebP)
- Implement lazy loading
- Use CloudFront/CDN caching
Mobile Display Issues
Symptoms
- Layout broken on mobile
- Touch targets too small
- Content overflowing
Solutions
Layout issues
- Check Tailwind responsive classes
- Test with browser dev tools mobile view
- Verify viewport meta tag
Touch targets
Ensure buttons/links are at least 44x44px on mobile.
Overflow
Check for fixed widths that don't scale:
/* Bad */
width: 400px;
/* Good */
width: 100%;
max-width: 400px;Quick Diagnostic Commands
Check system health
curl https://your-domain.com/api/healthCheck recent sync runs
SELECT started_at, status, records_fetched, error
FROM sync_runs
WHERE workspace_id = 'xxx'
ORDER BY started_at DESC
LIMIT 10;Check listing counts
SELECT standard_status, COUNT(*)
FROM listings
WHERE workspace_id = 'xxx'
GROUP BY standard_status;Check for missing photos
SELECT COUNT(*) FROM listings
WHERE workspace_id = 'xxx'
AND photo_count = 0;Check MLS connection status
SELECT status, last_synced_at, error
FROM mls_connections
WHERE workspace_id = 'xxx';Getting Help
- Check this guide for common issues
- Check Runbook for operational procedures
- Check Sentry for error details at your configured Sentry dashboard
- Check service status pages for dependencies
- Contact support with:
- Workspace ID
- Steps to reproduce
- Error messages
- Screenshots/logs