logo

Bienvenido(a)

Panel de Control de Tengo Hambre

{{ loginError }}

¿Aún no tienes cuenta? Registrate

A

Dashboard Global

Visión general del estado de la plataforma SaaS y ganancias

Comisiones Hoy

${{ saas.dashboardStats.value.kpis?.todayProfits || 0 }}

Ingreso plataforma hoy

Pedidos Hoy

{{ saas.dashboardStats.value.kpis?.todayOrders || 0 }}

Volumen plataforma

Visitas Hoy

{{ saas.dashboardStats.value.kpis?.todayVisits || 0 }}

Tráfico usuarios hoy

Deuda Total Pendiente

${{ saas.dashboardStats.value.kpis?.totalDebt || 0 }}

Por cobrar a negocios

Base de Negocios

{{ saas.dashboardStats.value.kpis?.totalBusinesses || 0 }} Registrados

Estatus Operativo

{{ saas.dashboardStats.value.kpis?.activeBusinesses || 0 }} Negocios Activos

Visitas Generales por Día

Ganancias por Comisiones (MXN)

Gestión de Negocios

Administra clientes, planes y comisiones SaaS

Total Negocios

{{ businesses.length }}

Activos

{{ businesses.filter(b => b.active).length }}

Deuda Total Pendiente

${{ businesses.reduce((s,b) => s + (b.commissionDebt || 0), 0).toFixed(2) }}

Negocio URL Slug Plan Estado Deuda Comisión Acciones
{{ biz.name }}
{{ biz.ownerEmail }}
/menu/{{ biz.slug }} {{ biz.plan }} ${{ (biz.commissionDebt || 0).toFixed(2) }}

Catálogo de Municipios

Gestiona las zonas de cobertura disponibles para los negocios.

Nombre C.P. Ciudad Zona Costo Envío Estado Acciones
Cargando...
No hay municipios registrados.
{{ mun.name }} {{ mun.zipCode }} {{ mun.city }} {{ mun.zone || 'General' }} Gratis / Sin zonas Activa Inactiva

Categorías Globales (Marketplace)

Gestiona las categorías de comida disponibles para todos los negocios.

Categoría Estado Acciones
{{ cat.emoji }}

{{ cat.name }}

{{ cat._id }}

No se encontraron categorías

Intenta con otro término o crea una nueva.

Panel de Control

{{ kpi.value }}

{{ kpi.label }}

Ventas Última Semana

Más Vendidos

Aún no hay ventas

  • {{ prod.name }}

    {{ prod.salesCount }} vendidos

    ${{ prod.price }}

{{ prod.name }}

{{ prod.barcode || 'Sin código' }}

${{ prod.price }}
{{ prod.stock || '∞' }}

No se encontraron productos

{{ tab.name }}
{{ pos.activeTab.value.customer.name[0] }}
{{ pos.activeTab.value.customer ? pos.activeTab.value.customer.name : 'Mostrador' }} {{ pos.activeTab.value.customer.points }} Pts

Escanea productos

{{ item.name }}

${{ item.price }}/u

+{{ opt.name }} +{{ item.selectedOptions.length - 1 }}
${{ (item.price * item.qty).toFixed(2) }}
{{ item.qty }}
Subtotal ${{ pos.currentTotals.value.subtotal.toFixed(2) }}
Descuento -${{ pos.currentTotals.value.discountAmount.toFixed(2) }}
Comisión ({{ settings.commissionPosAmount }}{{ settings.commissionPosType === 'percent' ? '%' : '$' }}) +${{ pos.currentTotals.value.commissionAmount.toFixed(2) }}
IVA ({{ settings.iva }}%) ${{ pos.currentTotals.value.tax.toFixed(2) }}
Total ${{ pos.currentTotals.value.total.toFixed(2) }}

Programa de Lealtad

Configuración

Activar Programa

Escanear

Productos

Gestión de platillos y existencias

ImagenNombreStockOrdenPrecioCategoríasEstadoAcciones

Biblioteca de Medios

Gestiona imágenes y videos

No se encontraron archivos.

Categorías

Organiza tu menú en secciones

{{ cat.name }}

{{ cat.description || 'Sin descripción' }}

{{ cat.active ? 'Visible' : 'Oculta' }}

Complementos y Extras

Grupos de opciones

{{ addon.name }}

{{ addon.required ? 'Obligatorio' : 'Opcional' }}Max: {{ addon.maxOptions }}

Opciones ({{ addon.options.length }})

  • {{ opt.name }}+${{ opt.priceExtra }}Gratis

Publicidad y Banners

Promociones visibles en el menú

{{ banner.active ? 'ACTIVO' : 'INACTIVO' }}

{{ banner.title }}

{{ banner.description }}

Historial de Ventas

Registro de todas las transacciones POS y Web

Folio Fecha Cliente Canal Método Total Estado Acción

Cargando detalles del pedido...

Orden #{{ orders.selectedOrder.value._id.slice(-6).toUpperCase() }} {{ orders.selectedOrder.value.status }}

{{ new Date(orders.selectedOrder.value.createdAt).toLocaleString() }}

Productos Adquiridos

Producto Cant. Precio U. Total

{{ item.name }}

+ {{ opt.name }} (${{ opt.price }})

{{ item.note }}

{{ item.quantity }} ${{ item.price.toFixed(2) }} ${{ ((item.price + (item.selectedOptions ? item.selectedOptions.reduce((a,b)=>a+(b.price||0),0) : 0)) * item.quantity).toFixed(2) }}

Información de Venta

Cliente

{{ orders.selectedOrder.value.customerName ? orders.selectedOrder.value.customerName : 'Venta Mostrador' }}

Telefono

{{ orders.selectedOrder.value.customerPhone ? orders.selectedOrder.value.customerPhone : 'S/N' }}

Calle y Numero

{{ orders.selectedOrder.value.customerStreet ? orders.selectedOrder.value.customerStreet : 'S/N' }} {{ orders.selectedOrder.value.customerNumber ? orders.selectedOrder.value.customerNumber : '' }}

Referencia

{{ orders.selectedOrder.value.customerReference ? orders.selectedOrder.value.customerReference : 'S/N' }}

Paga Con:

{{ orders.selectedOrder.value.customerHowToPay ? orders.selectedOrder.value.customerHowToPay : 'S/N' }}

Atendido por

{{ orders.selectedOrder.value.createdBy ? orders.selectedOrder.value.createdBy.username : 'Sistema' }}

Canal

{{ orders.selectedOrder.value.source }}

Pago

{{ orders.selectedOrder.value.paymentMethod }}

Resumen Financiero

Subtotal ${{ orders.selectedOrder.value.subtotal?.toFixed(2) || '0.00' }}
Descuentos -${{ orders.selectedOrder.value.discount?.toFixed(2) }}
Comisión ({{ orders.selectedOrder.value.commission.type === 'percent' ? '%' : '$' }}) ${{ orders.selectedOrder.value.commission.type === 'percent' ? orders.selectedOrder.value.subtotal?.toFixed(2) * orders.selectedOrder.value.commission.amount / 100 : orders.selectedOrder.value.commission.amount?.toFixed(2) }}
Costo de Envío {{ orders.selectedOrder.value.deliveryZone }} +${{ orders.selectedOrder.value.deliveryCost?.toFixed(2) }}
IVA (16%) ${{ orders.selectedOrder.value.tax?.toFixed(2) || '0.00' }}
Total ${{ orders.selectedOrder.value.total.toFixed(2) }}

Cotizaciones

Folio Cliente Validez Total Status Acciones

{{ quotes.isEditing.value ? 'Editar' : 'Nueva' }} Cotización

{{ prod.name }}

${{ prod.price.toFixed(2) }}

No se encontraron productos
  • {{ user.name }}

    {{ user.phone }}

Producto Cant. Precio Total
{{ item.name }}
{{ item.qty }}
${{ item.price.toFixed(2) }} ${{ (item.price * item.qty).toFixed(2) }}
La cotización está vacía
Subtotal ${{ quotes.totals.value.subtotal.toFixed(2) }}
IVA ({{ settings.iva }}%) ${{ quotes.totals.value.tax.toFixed(2) }}
Desc. {{ quotes.form.discount.title ? `(${quotes.form.discount.title})` : '' }} -${{ quotes.totals.value.discount.toFixed(2) }}
Total ${{ quotes.totals.value.total.toFixed(2) }}

Control de Caja

Gestión de flujo de efectivo y cortes

La caja está cerrada

Debes realizar la apertura de caja para comenzar a registrar ventas y movimientos.

Efectivo en Caja

${{ finance.currentData.value.currentCashInDrawer.toFixed(2) }}

Incluye fondo inicial y movimientos

Tarjetas Crédito

${{ finance.currentData.value.salesSummary.credit_card.toFixed(2) }}

Tarjetas Dédito

${{ finance.currentData.value.salesSummary.debit_card.toFixed(2) }}

Ventas Totales

${{ finance.currentData.value.salesSummary.total.toFixed(2) }}

Movimientos de Caja

Info del Turno

  • Apertura: {{ new Date(finance.currentData.value.shift.startTime).toLocaleString() }}
  • Fondo Inicial: ${{ finance.currentData.value.shift.initialCash.toFixed(2) }}
  • Responsable: Admin

Bitácora de Movimientos

Tipo Monto Motivo Hora
Sin movimientos manuales registrados
{{ mov.type === 'in' ? 'Ingreso' : 'Retiro' }} ${{ mov.amount.toFixed(2) }} {{ mov.reason }} {{ new Date(mov.date).toLocaleTimeString() }}

Historial de Cortes

Fecha Cierre Responsable Ventas Totales Efectivo Esperado Efectivo Real Diferencia Acción
{{ new Date(h.endTime).toLocaleString() }} {{ h.closedBy ? h.closedBy.username : 'Admin' }} - ${{ h.finalCashExpected.toFixed(2) }} ${{ h.finalCashActual.toFixed(2) }} {{ h.difference >= 0 ? '+' : '' }}{{ h.difference.toFixed(2) }}

Base de Usuarios

Clientes registrados en lealtad

Cliente Teléfono Puntos Visitas Última Visita Acciones

{{ users.selectedUser.value?.name }} Activo

ID: {{ users.selectedUser.value?._id }}

Compras

{{ users.selectedUserStats.value?.totalOrders || 0 }}

Visitas App

{{ users.selectedUserStats.value?.totalVisits || 0 }}

Gasto Total

${{ (users.selectedUserStats.value?.totalSpent || 0).toFixed(2) }}

Últimas Compras

Este usuario aún no ha realizado compras.

Orden #{{ order._id.slice(-6).toUpperCase() }}

{{ new Date(order.createdAt).toLocaleDateString() }} • {{ new Date(order.createdAt).toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'}) }}

${{ order.total.toFixed(2) }}

{{ order.status }}

Datos Básicos

{{ users.selectedUser.value?.name[0] }}

{{ users.selectedUser.value?.name }}

Cliente Lealtad

{{ users.selectedUser.value?.phone }}

{{ users.selectedUser.value?.points }} pts

Facturación

PRÓXIMAMENTE

Aquí podrás gestionar los datos fiscales del cliente para facturación automática.

Notas Internas

Configuración del Negocio

Administra tu perfil, categorías y zonas de entrega.

Información

GPS fijado

Escribe y selecciona una sugerencia para fijar las coordenadas.

Tipos de Servicio

Puedes activar ambas opciones. Los cambios se guardan al presionar "Guardar Cambios".

Requiere tener la app QZ Tray abierta en tu computadora.

Impresora de Tickets

Si utilizas el Punto de Venta desde una PC (Windows/Mac), necesitas descargar e instalar QZ Tray. Esta aplicación permite al navegador comunicarse con tu impresora térmica local.

Descargar QZ Tray (Gratis)

Asegúrate de tener la app abierta en tu PC antes de imprimir. Las tablets Android con cable OTG no requieren esta app.

Tiempos y Entrega

Configura los Tiempos y costos de entrega.

Ej: 30-45 min

Horarios de Atención

Gestiona tu hora de apertura y cierre por día de la semana.

{{ day.day }}
-

Cobertura (Municipio)

{{settings.municipioId ? '1 Municipio' : 'Sin cobertura'}}

Selecciona tu Municipio para configurar las colonias de entrega.

{{ municipio.name }}

CP: {{ municipio.zipCode }}

No se encontraron Municipios

Categorías

{{settings.categories.length}} seleccionadas

Selecciona todas las categorías que describan tu menú. Esto ayuda a que te encuentren en el buscador.

{{ avilcts.emoji }} {{ avilcts.name }}

Debes seleccionar al menos una.

Logo / Portada

Subir Logo

Acceso

Cocina (KDS)

Pendientes: {{ kds.pendingOrders.value.length }} Prep: {{ kds.preparingOrders.value.length }}
Pendientes
#{{ order._id.slice(-6).toUpperCase()}} {{ kds.getTimeElapsed(order.createdAt) }}
{{ order.customerId ? order.customerId.name : 'Mostrador' }}
{{ item.quantity }} {{ item.name }}
{{ opt.name }}
Nota: {{ item.note }}

Sin pedidos

En Preparación
#{{ order._id.slice(-4) }} Preparando...
{{ item.quantity }} {{ item.name }}
{{ opt.name }}
Nota: {{ item.note }}
Nota: {{ item.notes }}
Listos para Entrega
#{{ order._id.slice(-4) }} LISTO
{{ order.customerId ? order.customerId.name : 'Mostrador' }}

Blog de Noticias

Gestiona los artículos de tu blog.

Aún no tienes artículos

Crea tu primera publicación en el blog. Comparte noticias, promociones o información sobre tu negocio.

{{ post.active ? 'Activo' : 'Oculto' }}

{{ post.title }}

{{ post.content }}

{{ new Date(post.createdAt).toLocaleDateString() }}

Historial de Ventas — SuperAdmin

{{ saas.bizOrdersBusiness.value?.name }} /{{ saas.bizOrdersBusiness.value?.slug }}

Total Pedidos

{{ saas.bizOrdersKpis.value.totalOrders }}

Ingresos Totales

${{ saas.bizOrdersKpis.value.totalRevenue?.toFixed(2) }}

Pedidos Delivery

{{ saas.bizOrdersKpis.value.totalDelivery }}

Cargando ventas...

Este negocio no tiene ventas registradas

Folio Fecha Cliente Canal Método Pago Total Estado
#{{ ord._id.slice(-6).toUpperCase() }}
{{ new Date(ord.createdAt).toLocaleDateString() }}
{{ new Date(ord.createdAt).toLocaleTimeString([], {hour:'2-digit',minute:'2-digit'}) }}
{{ ord.customerId ? ord.customerId.name : (ord.customerName || 'Mostrador') }}
{{ ord.customerPhone }}
{{ ord.source === 'pos' ? 'POS' : 'Web' }} 🏍 {{ ord.paymentMethod }} ${{ ord.total.toFixed(2) }}
+${{ ord.deliveryCost.toFixed(2) }} envío
{{ ord.status }}
Mostrando página {{ saas.bizOrdersPagination.value.page }} de {{ saas.bizOrdersPagination.value.pages }} ({{ saas.bizOrdersPagination.value.total }} ventas totales)

Gestión de Comisiones

{{ selectedBizStats?.businessName }}

Total Ganado

${{ selectedBizStats?.totalEarned?.toFixed(2) }}

WebApp

${{ selectedBizStats?.totalWebEarned?.toFixed(2) }}

POS

${{ selectedBizStats?.totalPosEarned?.toFixed(2) }}

Ya Pagado

${{ selectedBizStats?.totalPaid?.toFixed(2) }}

Deuda Pendiente

${{ selectedBizStats?.currentDebt?.toFixed(2) }}

✓ Sin deuda pendiente

Registrar Abono

Historial de Pagos {{ selectedBizStats?.totalOrders }} ventas registradas

Sin pagos registrados aún

{{ pay.type }}

{{ pay.note || '—' }}

${{ pay.amount.toFixed(2) }}

{{ new Date(pay.createdAt).toLocaleDateString() }}

{{ blog.blogForm.value._id ? 'Editar Artículo' : 'Nuevo Artículo' }}

Completa los datos de tu publicación

Haz clic para subir imagen

Recomendado: 1200x630px

Subiendo imagen...
Cambiar Imagen

Estado de la Publicación

Si está inactivo, no será visible en el menú público.

{{ currentMunicipio ? currentMunicipio.name : 'Colonias' }}

Selecciona zonas y asigna su costo de envío

{{ colonia.name }}
{{ colonia.zone }}
$
Gratis

No hay colonias registradas en este municipio.

{{ settings.deliveryZones.length }} zonas seleccionadas

{{ categoriesStore.editingCategory.value ? 'Editar Categoría' : 'Nueva Categoría Global' }}

Pega un emoji o usa (Win + .) / (Cmd + Ctrl + Espacio)

Puedes buscar ejemplos en: https://emojidb.org/trend-emojis

Apunta al código QR del cliente

Escanear Producto

{{ editingBusiness ? saasForm.businessName : 'Nuevo Cliente SaaS' }}

{{ saasForm.plan === 'pro' ? 'Plan PRO' : 'Plan FREE' }} {{ saasForm.active ? 'Activo' : 'Bloqueado' }} 🔥 Trending

{{ saasForm._stats.deliveryZonesCount }}

Zonas

{{ saasForm._stats.categoriesCount }}

Categorías

${{ saasForm._stats.deliveryCost }}

Delivery

{{ saasForm._stats.time || '—' }}

Tiempo (min)

Información del Negocio

/
Ubicación fijada

Escribe para buscar y selecciona una sugerencia para fijar las coordenadas GPS.

Tipos de Servicio

Plan y Estado

Comisión WebApp

Ventas realizadas desde el marketplace

{{ saasForm.commissionWebType === 'percent' ? '%' : '$' }}
Se cobra {{ saasForm.commissionWebType === 'percent' ? saasForm.commissionWebAmount + '%' : '$' + saasForm.commissionWebAmount }} por venta Sin comisión configurada

Comisión POS Interno

Ventas desde el punto de venta. 0 = Inactivo

{{ saasForm.commissionPosType === 'percent' ? '%' : '$' }}
Se cobra {{ saasForm.commissionPosType === 'percent' ? saasForm.commissionPosAmount + '%' : '$' + saasForm.commissionPosAmount }} por venta POS Comisión POS inactiva (valor = 0)

Visibilidad en Marketplace

Credenciales de Acceso

Las credenciales son únicamente para el primer acceso. El dueño podrá cambiarlas desde su panel.

Nota de Seguridad

Las credenciales de acceso (usuario y contraseña) no se modifican desde aquí por seguridad. Para resetear contraseñas usa el módulo de Usuarios dentro del panel del negocio.

Ver menú público

{{ isEditing ? 'Editar Municipio' : 'Registrar Nuevo Municipio' }}

Colonias / Zonas ({{ municipioForm.colonias?.length || 0 }})

#{{ index + 1 }}

No hay colonias registradas

Método de Pago

${{ pos.currentTotals.value.total.toFixed(2) }}

Total a Pagar

Cambio ${{ pos.paymentForm.change.toFixed(2) }}

Procesar cobro externo

Confirma que la transacción fue exitosa en la terminal.

Separar Cuentas

Distribuye los productos de la mesa en cuentas individuales.

Mesa / Original {{ pos.splitState.originalItems.length }} ítems

Todo asignado

{{ item.qty }}
{{ item.name }}
{{ item.selectedAddons.map(a => a.name).join(', ') }}
${{ (item.price * item.qty).toFixed(2) }}
Restante en mesa: ${{ pos.getCheckTotal(pos.splitState.originalItems).toFixed(2) }}
#{{ check.id }}
${{ pos.getCheckTotal(check.items).toFixed(2) }}

Asigna productos aquí

{{ item.qty }} {{ item.name }}
${{ (item.price * item.qty).toFixed(2) }}

Seleccionar Cliente

No se encontraron clientes

{{ cust.name[0] }}

{{ cust.name }}

{{ cust.phone }}

{{ cust.points }} pts Visitas: {{ cust.visits }}

¿Cliente nuevo? Regístralo en la App de Lealtad

Aplicar Descuento

Total Original ${{ pos.discountPreview.value.original.toFixed(2) }}
Descuento -${{ pos.discountPreview.value.saving.toFixed(2) }}
Nuevo Total ${{ pos.discountPreview.value.newTotal.toFixed(2) }}

Aplicar Descuento

Configura el tipo y monto del descuento.

{{ editingProduct ? 'Editar' : 'Nuevo' }} Producto

Mantén presionado Ctrl (Windows) o Cmd (Mac) para seleccionar varias.

{{ selectedCartItem.name }}

{{ selectedCartItem.barcode || 'Sin código' }}

Precio Final Unitario

${{ selectedItemUnitPrice.toFixed(2) }}

Subtotal Línea

${{ (selectedItemUnitPrice * selectedCartItem.qty).toFixed(2) }}

{{ group.name }}

{{ group.maxOptions > 1 ? `Elige hasta ${group.maxOptions}` : 'Elige 1' }}
{{ opt.name }}
+${{ opt.priceExtra }}
Sin complementos disponibles para este producto.
{{ selectedCartItem.qty }}

{{ editingCategory ? 'Editar' : 'Nueva' }} Categoría

{{ editingAddon ? 'Editar' : 'Nuevo' }} Grupo de Opciones

$
Agrega opciones para que el cliente elija.

{{ editingBanner ? 'Editar' : 'Nuevo' }} Banner

Sin imagen

Apertura de Caja

Ingresa el monto de efectivo con el que inicias el turno (Fondo).

$

{{ finance.movementForm.type === 'in' ? 'Ingreso de Efectivo' : 'Retiro de Efectivo' }}

$

Corte de Caja

Registra los recuentos de cada método de pago e ingresa el total real contado.

Efectivo en Sistema: ${{ finance.currentData.value.currentCashInDrawer.toFixed(2) }}
Ventas Totales del Turno: ${{ finance.currentData.value.salesSummary.total.toFixed(2) }}

Recuento Manual por Método de Pago

Efectivo

Dinero físico contado

$
${{ finance.currentData.value.currentCashInDrawer.toFixed(2) }}
- Sobrante: ${{ ((finance.closeAmount.value || 0) - finance.currentData.value.currentCashInDrawer).toFixed(2) }} Faltante: ${{ (finance.currentData.value.currentCashInDrawer - (finance.closeAmount.value || 0)).toFixed(2) }}

Tarjeta Débito

Débito contado

$
${{ (finance.currentData.value.salesSummary?.debit_card || 0).toFixed(2) }}
- Sobrante: ${{ ((finance.closeRecounts.debit || 0) - (finance.currentData.value.salesSummary?.debit_card || 0)).toFixed(2) }} Faltante: ${{ ((finance.currentData.value.salesSummary?.debit_card || 0) - (finance.closeRecounts.debit || 0)).toFixed(2) }}

Tarjeta Crédito

Crédito contado

$
${{ (finance.currentData.value.salesSummary?.credit_card || 0).toFixed(2) }}
- Sobrante: ${{ ((finance.closeRecounts.credit || 0) - (finance.currentData.value.salesSummary?.credit_card || 0)).toFixed(2) }} Faltante: ${{ ((finance.currentData.value.salesSummary?.credit_card || 0) - (finance.closeRecounts.credit || 0)).toFixed(2) }}

Monto Total Real (Sumado)

$ {{ ( (finance.closeAmount.value || 0) + (finance.closeRecounts.debit || 0) + (finance.closeRecounts.credit || 0) + (finance.closeRecounts.transfer || 0) ).toFixed(2) }}

Enviar {{ shareContext === 'quote' ? 'Cotización' : 'Ticket' }}

Selecciona el país e ingresa el WhatsApp.

Vista Previa Ticket

{{ settings.appName }}

{{ settings.address }}

Tel: {{ settings.phone }}

{{ new Date().toLocaleString() }}

Folio: #{{ ticketData?.folio }}
Cliente: {{ ticketData?.customer }}
Tel: {{ ticketData.customerPhone }}
Cant. Prod. Total
{{ item.qty }} x {{ item.name }} ${{ (item.price * item.qty).toFixed(2) }}
+ {{ opt.name }}
SubTotal ${{ (ticketData?.subtotal || 0).toFixed(2) }}
Envío ({{ ticketData.deliveryZone }}) +${{ (ticketData.deliveryCost || 0).toFixed(2) }}
Descuento -${{ (ticketData.discount.amount || 0).toFixed(2) }}
TOTAL ${{ (ticketData?.total || 0).toFixed(2) }}

Método: {{ ticketData?.method }}

Paga con: ${{ ticketData.customerHowToPay }}

¡Gracias por su compra!

Software: Tengo Hambre