Skip to main content
Hiro CRM is designed for hospitality groups managing multiple restaurant locations across Spain. This guide explains how to set up and manage your multi-location infrastructure.

Understanding Locations

In Hiro CRM, a Location represents a physical restaurant or venue. Each location can have:
  • Unique settings and configurations
  • Its own reservation system
  • Separate staff and capacity
  • Integration credentials (Cover Manager, Revo TPV)
  • Custom branding (when grouped under brands)
Locations are the foundation of Hiro CRM’s multi-tenant architecture. All data like reservations, customers, and analytics can be filtered by location.

Creating Your First Location

1

Navigate to Settings

Go to Settings > Restaurantes in the main navigation.
2

Click 'Nuevo Restaurante'

Click the + Nuevo Restaurante button in the top-right corner.
3

Fill in Basic Information

Required fields:
  • Name: The restaurant name (e.g., “La Tasca Claudio Coello”)
  • City: Location city
Optional but recommended:
  • Marca: Associate with a brand if managing multiple concepts
  • Address: Full street address
  • Código Postal: Postal code
  • Phone and Email: Contact information
4

Configure Settings

Set operational parameters:
  • Capacidad Total: Total seating capacity
  • Zona Horaria: Timezone (default: Europe/Madrid)
  • Moneda: Currency (default: EUR)
  • CoverManager Slug: Your Cover Manager location identifier
5

Activate the Location

Check Restaurante activo to make the location operational.Click Crear to save.

Location Data Structure

Each location in Hiro stores the following information:
interface Location {
  id: string;
  brand_id?: string;           // Optional brand association
  name: string;                // Restaurant name
  slug: string;                // URL-friendly identifier
  address?: string;            // Street address
  city?: string;               // City
  postal_code?: string;        // Postal code
  country?: string;            // Country code (default: ES)
  phone?: string;              // Contact phone
  email?: string;              // Contact email
  timezone?: string;           // Timezone (default: Europe/Madrid)
  currency?: string;           // Currency (default: EUR)
  total_capacity?: number;     // Seating capacity
  covermanager_slug?: string;  // Cover Manager integration
  revo_tenant?: string;        // Revo TPV integration
  is_active?: boolean;         // Active status
}
See frontend/app/actions/locations.ts:11-35 for the complete type definition.

Managing Multiple Locations

Viewing All Locations

The Restaurantes settings page displays all your locations in a grid:
  • Active locations are marked with a green “Activo” badge
  • Each card shows the location name, city, and brand
  • Use the search bar to filter locations by name, city, or brand

Editing Locations

1

Click 'Editar' on a Location Card

Find the location you want to edit and click the Editar button.
2

Update Information

Modify any field in the form. All changes are tracked and timestamped.
3

Save Changes

Click Actualizar to save your changes.
Changing a location’s slug will affect URLs and API integrations. Only modify slugs if necessary.

Deactivating Locations

To temporarily disable a location without deleting it:
  1. Edit the location
  2. Uncheck Restaurante activo
  3. Save changes
Inactive locations won’t appear in reservation systems or analytics but maintain their data.

Deleting Locations

Hiro uses soft deletes to protect your data:
  1. Click the trash icon on a location card
  2. Confirm the deletion
You cannot delete a location that has associated reservations. Deactivate it instead.

Location-Based Features

Location Filtering

Most views in Hiro support location filtering: Dashboard: Select a location from the dropdown to view location-specific stats
// Example: Dashboard location selector
<select value={selectedLocation} onChange={(e) => setSelectedLocation(e.target.value)}>
  <option value="all">Todos los locales</option>
  {locations.map((loc) => (
    <option key={loc.id} value={loc.id}>{loc.name}</option>
  ))}
</select>
See frontend/components/dashboard/CustomizableDashboard.tsx:439-447 Analytics: Filter reports by location for insights Reservations: View and manage reservations per location

Location-Specific Integrations

Each location can have unique integration credentials: Cover Manager:
  • Set covermanager_slug to sync reservations
  • Configured in Location Settings
Revo TPV:
  • Set revo_tenant for POS integration
  • Syncs orders and revenue data
See frontend/lib/inngest/functions.ts:15-91 for sync workflows.

Brands and Multi-Concept Management

What are Brands?

Brands allow you to group locations under different restaurant concepts:
  • La Tasca (tapas concept) - multiple locations
  • Manero Steakhouse (fine dining) - multiple locations
  • Claudio Coello (flagship location)
Each location can belong to one brand, or operate independently.

Creating Brands

  1. Navigate to Settings > Marcas
  2. Click + Nueva Marca
  3. Configure brand identity:
    • Name and slug
    • Brand colors and logo
    • Default settings for locations

Assigning Locations to Brands

When creating or editing a location:
  1. Select a brand from the Marca dropdown
  2. The location inherits brand styling and settings
  3. Brand appears on location cards and reports

Multi-Location Workflows

Daily Operations Across Locations

Dashboard View: See aggregated stats from all locations
// All locations stats
const stats = {
  totalReservations: 145,  // Sum across all locations
  totalPax: 380,           // Total diners
  vipCount: 12,            // VIPs across locations
  expectedRevenue: 15420   // Combined revenue
}

Syncing Multi-Location Data

Hiro automatically syncs data from all active locations:
1

Automatic Sync

Background jobs sync each location’s data:
  • Cover Manager: Every 30 minutes
  • Revo TPV: Every 15 minutes
  • Loyalty calculations: Daily at 2 AM
2

Manual Sync

Use the Sincronizar button on the Dashboard to force a sync:
const handleSync = async () => {
  const result = await syncTodayAction(selectedLocation);
  if (result.success) {
    toast.success(`${result.count} reservas sincronizadas`);
  }
};
See frontend/components/dashboard/CustomizableDashboard.tsx:367-383
3

Monitor Sync Status

Check sync logs in Settings > Integraciones for each location.

Best Practices

Consistent Naming

Use clear, consistent location names:
  • ✅ “La Tasca - Claudio Coello”
  • ✅ “Manero Steakhouse - Recoletos”
  • ❌ “Location 1”
  • ❌ “Test Restaurant”

Keep Slugs Stable

Don’t change slugs after initial setup. They’re used in:
  • URLs and deep links
  • API integrations
  • External systems (Cover Manager, etc.)

Set Accurate Capacity

Configure realistic total_capacity for each location:
  • Affects reservation availability
  • Used in demand predictions
  • Impacts staff recommendations

Use Brands for Reporting

Group locations by brand to get:
  • Brand-level analytics
  • Cross-location insights
  • Consolidated reporting

Troubleshooting

Check that the location is active:
  1. Go to Settings > Restaurantes
  2. Find the location
  3. Ensure it has an “Activo” badge
  4. If not, edit and check Restaurante activo
Verify integration credentials:
  1. Edit the location
  2. Check covermanager_slug is correct
  3. Verify API keys in Settings > Integraciones
  4. Check sync logs for errors
Locations with reservations cannot be deleted:
  1. Check if the location has associated reservations
  2. If yes, deactivate instead of deleting
  3. Soft delete preserves historical data
See frontend/app/actions/locations.ts:336-344 for deletion logic.
Each location can have its own timezone:
  1. Edit the location
  2. Set Zona Horaria (e.g., “Europe/Madrid”)
  3. This affects reservation times and reporting

Next Steps

Now that you’ve set up your locations:

Configure User Roles

Set up role-based access for your team across locations

Set Up Automations

Configure automated workflows for each location

View Analytics

Track performance across all your locations

API Overview

Access location data programmatically

Build docs developers (and LLMs) love