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:
- Cliente navega catálogo o menú
- Agrega productos/platos al carrito
- Toca “Enviar pedido”
- Se genera mensaje formateado con orden completa
- 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.