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