Skip to main content

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)

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:

  1. Anonymizes name, email, and phone in reservations (keeps the row for audit/accounting).
  2. Anonymizes email_logs, email_queue, marketing_campaign_sends.
  3. Deletes every identity (customer_identities).
  4. Deletes the customer.
  5. Logs the deletion in activity_log for legal audit.

The customer shows as "Deleted" on past reservations.

Receiving GDPR requests

If a customer writes asking "delete my data":

  1. Verify it's really them (matching email).
  2. Open their card in /app/clientes.
  3. Delete (GDPR) action.
  4. Confirm - it's irreversible.
  5. Reply by email saying it's been processed.

Legal response window: 30 days.

ESENCA