Skip to main content

Cómo funciona

SYNTIweb NO tiene pasarela de pago integrada. En su lugar, los clientes hacen pedidos que se envían directamente a WhatsApp del negocio con un mensaje formateado. El flujo es:
  1. Cliente navega catálogo o menú
  2. Agrega productos/platos al carrito
  3. Toca “Enviar pedido”
  4. Se genera mensaje formateado con orden completa
  5. Se abre WhatsApp con el mensaje listo para enviar
El cliente SIEMPRE tiene control final — puede editar el mensaje antes de enviar. No se envía nada automáticamente.

Sistema de códigos únicos

Cada pedido genera un código único que identifica la orden:

SYNTIfood → Código SF-XXXXXX

// ComandaService.php:16-32
public function generateId(int $tenantId): string
{
    $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $year = date('Y');
    $month = date('m');

    do {
        $random = '';
        for ($i = 0; $i < 6; $i++) {
            $random .= $chars[random_int(0, strlen($chars) - 1)];
        }
        $id = 'SF-' . $random;
        $path = "tenants/{$tenantId}/comandas/{$year}/{$month}/{$id}.json";
    } while (Storage::disk('local')->exists($path));

    return $id;
}
SF = SyntiFOOD. Ejemplo: SF-A3K9Z1

SYNTIcat → Código SC-XXXXXX

// OrderService.php:16-32
public function generateId(int $tenantId): string
{
    $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    // ... misma lógica ...
    $id = 'SC-' . $random;
    $path = "tenants/{$tenantId}/orders/{$year}/{$month}/{$id}.json";
    // ...
}
SC = SyntiCAT. Ejemplo: SC-B7M2Q4

Estructura del mensaje (SYNTIfood)

Cuando el cliente confirma su pedido, el sistema construye un mensaje así:
🍕 *PEDIDO NUEVO*

Código: SF-A3K9Z1
Fecha: 8 Mar 2026, 2:45 PM
Cliente: Juan Pérez
Modalidad: Delivery

━━━━━━━━━━━━━━━━━
*ÍTEMS*
2× Pizza Margarita — 8.00 REF
1× Refresco Coca-Cola — 2.50 REF
━━━━━━━━━━━━━━━━━

*TOTAL: 18.50 REF*

Enviado desde syntiweb.com

Construcción del pedido

// ComandaService.php:43-66
public function generate(Tenant $tenant, string $customerName, string $modalidad, array $items): array
{
    $id = $this->generateId($tenant->id);
    $total = array_reduce($items, fn($carry, $item) => $carry + ($item['qty'] * $item['precio']), 0.0);

    $comanda = [
        'id' => $id,
        'tenant_id' => $tenant->id,
        'date' => now()->toIso8601String(),
        'customer_name' => $customerName,
        'modalidad' => $modalidad, // 'sitio' | 'llevar' | 'delivery'
        'items' => array_map(fn($item) => [
            'nombre' => $item['nombre'],
            'qty' => (int) $item['qty'],
            'precio' => (float) $item['precio']
        ], $items),
        'total' => round($total, 2),
        'channel' => 'whatsapp'
    ];

    $this->save($tenant->id, $comanda);
    return $comanda;
}

Estructura del mensaje (SYNTIcat)

Para catálogos con carrito:
🛍️ *PEDIDO NUEVO*

Código: SC-B7M2Q4
Cliente: María González
Ubicación: Centro, Caracas

━━━━━━━━━━━━━━━━━
*PRODUCTOS*
1× Camisa Azul (Talla M) — 25.00 REF
2× Jean Negro (Talla 32) — 60.00 REF
━━━━━━━━━━━━━━━━━

*SUBTOTAL: 85.00 REF*

Enviado desde syntiweb.com

Construcción de la orden

// OrderService.php:42-69
public function generate(Tenant $tenant, array $customer, array $items): array
{
    $id = $this->generateId($tenant->id);
    $subtotal = array_reduce($items, fn($carry, $item) => $carry + ($item['qty'] * $item['price']), 0.0);

    $order = [
        'id' => $id,
        'tenant_id' => $tenant->id,
        'date' => now()->toIso8601String(),
        'customer' => [
            'name' => $customer['name'],
            'location' => $customer['location'] ?? ''
        ],
        'items' => array_map(fn($item) => [
            'title' => $item['title'],
            'qty' => (int) $item['qty'],
            'price' => (float) $item['price'],
            'variant' => $item['variant'] ?? null
        ], $items),
        'subtotal' => round($subtotal, 2),
        'currency' => 'REF',
        'channel' => 'whatsapp'
    ];

    $this->save($tenant->id, $order);
    return $order;
}

Persistencia de pedidos

Todos los pedidos se guardan como archivos JSON en el storage del tenant:
// ComandaService.php:72-79
public function save(int $tenantId, array $comanda): void
{
    $year = date('Y', strtotime($comanda['date']));
    $month = date('m', strtotime($comanda['date']));
    $path = "tenants/{$tenantId}/comandas/{$year}/{$month}/{$comanda['id']}.json";

    Storage::disk('local')->put($path, json_encode($comanda, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
}
Estructura de directorios:
storage/app/tenants/{tenant_id}/
  ├─ comandas/
  │   └─ 2026/
  │       ├─ 03/
  │       │   ├─ SF-A3K9Z1.json
  │       │   └─ SF-B8L4P2.json
  │       └─ 04/
  └─ orders/
      └─ 2026/
          └─ 03/
              ├─ SC-K1M7N3.json
              └─ SC-P9Q2R5.json
Los pedidos se organizan por año/mes para facilitar búsquedas y reportes mensuales.

Frontend: abrir WhatsApp

Desde el navegador, el código JavaScript construye la URL wa.me con el mensaje:
// landing/templates/food.blade.php:636
function abrirWhatsApp(mensaje) {
    const waNumber = '{{ $waClean }}';
    window.open('https://wa.me/' + waNumber + '?text=' + encodeURIComponent(mensaje), '_blank');
}
// landing/templates/catalog.blade.php:623
window.open(`https://wa.me/${waNumber}?text=${encodeURIComponent(msg)}`, '_blank');
El sistema usa encodeURIComponent() para asegurar que emojis y caracteres especiales se envíen correctamente.

Doble WhatsApp (Plan Anual)

El Plan Anual de SYNTIfood y SYNTIcat permite configurar 2 números de WhatsApp:
  • whatsapp_sales → Ventas / pedidos
  • whatsapp_support → Soporte / consultas
El negocio puede elegir a cuál número se envía cada tipo de mensaje desde el dashboard.

Build docs developers (and LLMs) love