Your customer CRM
/app/clientes centralizes every customer in your workspace, with no duplicates, with behavioral metrics and timeline.
Consolidated list per workspace
The list shows every customer regardless of which venue in your workspace they reserved at. RestaPro consolidates automatically: if Juan reserved at Bar A and later at Bar B, he's still the same customer.
Each card shows:
- Name + primary email/phone
- Total reservations (across any venue)
- Last reservation
- "Review" indicator if there are identity conflicts
Default sort: by last activity descending.
Per-customer metrics
RestaPro automatically calculates:
- Total reservations
- Confirmed / completed / cancelled / no-shows
- Restaurants visited (count of distinct workspace venues)
- Last reservation (timestamp)
Flexible search
The search bar (Search customer) accepts name, email, or phone - even partial:
- "Juan" → finds Juan García, Juanita Martín...
- "gmail" → every Gmail email
- "600" → finds
+34 600 123 456,+34 600 987 654... - "34 600" → same set (RestaPro normalizes digits)
- "+34" → every Spanish number
The phone normalizer stores digits only. When you search, RestaPro extracts the digits from your query and substring-matches against the normalized field. Works with or without spaces, dashes, parentheses, or +.
Search runs with a 300 ms debounce - updates instantly.
Filter by restaurant
"All venues" dropdown to filter the list to one only. Combinable with search.
Multiple identities per customer
A customer can have several phones and emails:
- Juan García:
juan@gmail.com,juan@company.com,+34 600...,+34 91 234...
When a reservation comes in with a new identity, RestaPro runs fuzzy matching: if it finds a likely match with an existing customer, it links automatically.
"Needs review" indicator
It appears when RestaPro is unsure: it detected similar but not identical identities. Your team reviews manually and confirms or splits.
Individual card
Click a customer → side panel with:
- Header: name, "Customer since [date]", linked emails and phones.
- Internal notes: private team textarea.
- Reservations: last 8 (counter if more). Each one with venue, date, time, party size, status, reference.
- Timeline: reservation events + marketing events (views, clicks, campaigns).
Timeline
Combines two sources:
- Reservation events: status changes (confirmed, arrived, completed, cancelled).
- Marketing events: views to
/c/:slug, campaign clicks, UTM parameters.
Chronological descending order. Lets you see the full customer journey: first contact → first reservation → second visit → email click → third reservation.
GDPR: delete a customer
Admins only. The customer-gdpr edge function runs the gdpr_delete_customer RPC:
- Anonymizes name, email, and phone in
reservations(keeps the row for audit/accounting). - Anonymizes
email_logs,email_queue,marketing_campaign_sends. - Deletes every identity (
customer_identities). - Deletes the customer.
- Logs the deletion in
activity_logfor legal audit.
The customer shows as "Deleted" on past reservations.
Receiving GDPR requests
If a customer writes asking "delete my data":
- Verify it's really them (matching email).
- Open their card in
/app/clientes. - Delete (GDPR) action.
- Confirm - it's irreversible.
- Reply by email saying it's been processed.
Legal response window: 30 days.