ERP Dinámico No-Code

La flexibilidad de Excel, la potencia de un ERP

Construye el sistema de tu empresa como si fuera una hoja de cálculo, pero con base de datos real, auditoría, automatizaciones y millones de registros sin escribir código.

Sin código
PostgreSQL
API completa
ANTES
clientes_FINAL_v2_COPIA(3).xlsx ⚠️ No guardado
A B C D
1 Nombre Email Tfno Tipo
2 María G. maria@emp 612345678 premium
3 carlos lopez #REF! sin tfno PREMIUM
4 ??? email malo +34612 basico
Errores • Sin validación • Formatos inconsistentes
Con Dinaup
DESPUÉS
Nuevo Cliente #CLI-2024-0523
Validado
Premium
✨ PERSONALIZADO

Campo creado por ti · Auto-generado

Auditoría • API • Histórico
Desliza para descubrir más
Transformacion digital

De hojas de calculo a
formularios inteligentes

Dinaup convierte la flexibilidad caotica de Excel en aplicaciones estructuradas, validadas y listas para escalar tu negocio.

Excel tradicional

Hojas de calculo

Caotico
#
Nombre
Email
Telefono
Estado
1
Juan Perez
+34 600 000 001
Activo
2
Maria Garcia
+34 600 000 002
Activo
3
Carlos Lopez
+34 600 000 003
Pendiente
Evoluciona

Formulario Dinaup

Aplicacion estructurada

Validado
Nombre completo Requerido
Juan Perez
Campo obligatorio validado
Email corporativo Requerido
Formato validado
Telefono Requerido
+34 600 000 001
Internacional validado
Estado Selector
Activo
Lista predefinida
Fecha alta Auto
27/01/2026
Generado automatico
Soluciones Ready to Go

Empieza con aplicaciones
que ya funcionan

Empiezas con una base solida: ventas, tareas, personas, clientes. Todo conectado desde el primer dia.

TPV
Ready to Go

TPV listo para vender

Cobros, productos, cierres y tickets funcionando desde el primer dia.

Proyectos
Ready to Go

Tareas y Proyectos

Organiza el trabajo real del equipo, no una teoria.

RRHH
Ready to Go

Recursos Humanos

Fichajes, horarios y control desde una unica base.

CRM
Ready to Go

CRM

Oportunidades, estados y seguimiento sin rigidez.

TPV, CRM, RRHH o Proyectos.

Elige por donde empezar, no hasta donde llegar.

Secciones

Gestiona todo lo que imagines

Ready to Go incluye secciones listas para usar. Y cuando tu empresa necesita algo más, puedes crear secciones personalizadas sin romper nada de lo que ya funciona.

Clientes
Ready to Go
Productos
Ready to Go
Ventas
Ready to Go
Facturas
Ready to Go
Mis Proyectos
Personalizada
Control de Calidad
Personalizada
icon
Unicornios
Personalizada

¿Qué es Ready to Go?

Son módulos ya diseñados y optimizados para cubrir las necesidades habituales de cualquier empresa: clientes, productos, ventas, facturación y más. Se activan con un clic y están listos para trabajar sin configuración previa. Empiezas usando Dinaup desde el primer momento.

Secciones personalizadas

Cuando tu negocio no encaja en lo estándar, Dinaup no se queda corto. Puedes crear secciones propias para reflejar exactamente tus procesos: cómo trabajas, qué controlas y qué necesitas medir. Sin límites. Sin código. Sobre la misma base que ya está funcionando.

Campos

Añade los campos que necesites

Cada sección incluye campos Ready to Go para empezar rápido. Y si necesitas algo más, puedes añadir campos personalizados para capturar justo la información que tu empresa requiere.

Editor de campos

Sección: Productos
Personalizado
Personalizado

Validación automática

Cada campo puede validar los datos de forma inteligente: formatos correctos, rangos permitidos, campos obligatorios y reglas personalizadas. Menos errores. Datos siempre consistentes.

Campos personalizados sin límites

Crea campos con fórmulas automáticas, relaciones entre secciones, validaciones avanzadas, valores calculados y métricas KPIs. Todo desde la interfaz. Sin escribir código. Sin depender de desarrollos a medida.

Webhooks & API REST

Conecta Dinaup con cualquier sistema

Recibe notificaciones en tiempo real, consulta informes y automatiza procesos con herramientas como n8n, Make, Zapier o tu propio código

Notificaciones en tiempo real

Webhooks cuando cambian tus datos

LIVE

Recibe una notificación HTTP cada vez que se cree, modifique o elimine un registro en cualquier sección.

Nuevo pedido → Enviar email
Stock bajo → Notificar proveedor
Cliente actualizado → Sincronizar CRM

Compatible con:

n8n
n8n
M
Make
Z
Zapier

Consultar Informes vía API

Datos estructurados en JSON

REST API

Cualquier informe que crees está disponible como endpoint de API.

Petición cURL GET
curl -X POST "https://webhook.dinaup.com/api/reports?id=35461251-de05-41bf-a5c6-fe56fffe65a8" -H "Authorization: Bearer tu_token"
📄 Paginación

Controla resultados

🔍 Filtros

Por cualquier campo

response.json 200 OK
{
  "data": [
    {
      "Estado": "En curso",
      "Paciente": "Javi C.",
      "Medico": "Juan Rodriguez"
    }
  ],
  "totalResults": 59
}
n8n Ejemplo de flujo

Automatiza sin límites con n8n

Conecta Dinaup con cientos de aplicaciones y crea flujos de trabajo automatizados sin programar

n8n
Workflow: Nueva venta
ACTIVO
Webhook
📥 Trigger: Dinaup
Nueva venta creada
IF
🔀 Condición
Total > €500
Gmail
📧 Enviar email
Notificar cliente
Slack
💬 Mensaje
#ventas-importantes
Última ejecución: hace 2 min

Tiempo real

Los webhooks se disparan instantáneamente cuando cambian tus datos en Dinaup

Sin programar

Arrastra y conecta nodos visuales para crear flujos complejos sin código

+400 integraciones

Conecta con Gmail, Slack, Sheets, Notion, Airtable, y cientos más

Fuertemente tipado

SDK .NET

Modelos autogenerados con tu estructura.

var client = await DinaupClientC.ConnectAsync(
    endPoint: "https://api.dinaup.com/v2/tu-codigo",
    publicKey: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    secretKey: "tu-secret-key-aqui"
);

// ✓ Conectado. Ya puedes operar.
using Dinaup;

// Las únicas credenciales en variables de entorno
var vault = new VaultData(
    Environment.GetEnvironmentVariable("VAULT_URL"),
    Environment.GetEnvironmentVariable("VAULT_PASSWORD")
);
vault.Initialize();

// Todo lo demás viene del Vault
var client = await DinaupClientC.ConnectAsync(
    endPoint: vault.Read("dinaup.endpoint"),
    publicKey: vault.Read("dinaup.publickey"),
    secretKey: vault.Read("dinaup.secretkey")
);
// ✓ Credenciales seguras desde Vault
using Dinaup;

var builder = WebApplication.CreateBuilder(args);

// Cargar Vault
var vault = new VaultData(
    Environment.GetEnvironmentVariable("VAULT_URL"),
    Environment.GetEnvironmentVariable("VAULT_PASSWORD")
);
vault.Initialize();

// Conectar a Dinaup
var client = await DinaupClientC.ConnectAsync(
    endPoint: vault.Read("dinaup.endpoint"),
    publicKey: vault.Read("dinaup.publickey"),
    secretKey: vault.Read("dinaup.secretkey")
);

// Registrar como Singleton
builder.Services.AddSingleton(client);
var app = builder.Build();
var report = new APIVentasC();
await report.ExecuteQueryAsync(client);

foreach (var row in report.Rows)
{
    Console.WriteLine($"{row.Factura}: {row.Total}");
}
// Filtros y ordenación avanzada
var report = new APIVentasC();

report.AddFilterBetween(VentasES.Fecha, inicioMes, finMes);
report.AddFilter(VentasES.Estado, "=", EstadoE.Completada.INT());
report.AddOrder(VentasES.Total, descending: true);

await report.ExecuteQueryAsync(client);

foreach (var row in report.Rows)
{
    Console.WriteLine($"{row.Numero}: {row.Total}€");
}
// Página {report.CurrentPage} de {report.TotalPages}
// Recorrer todas las páginas de resultados
var report = new APIProductosC();
await report.ExecuteQueryAsync(client);

if (report.Rows.IsNotEmpty())
{
    do
    {
        foreach (var row in report.Rows)
        {
            // Procesar cada registro
        }
    } while (await report.ExecuteQuery_NextPageAsync());
}
// ✓ Todos los registros procesados
var producto = new WriteOperation(Guid.Empty, new()
{
    { ProductosES.Nombre, "iPhone 16 Pro" },
    { ProductosES.Precio, 1199.00m.STR() }
});

client.RunWriteOperation(ProductosES._SectionID, producto);
// ✓ Producto creado
// Importar productos en bloques
var externos = await http.GetFromJsonAsync<List<ProductoDTO>>(url);

var chunks = externos.Chunk(DinaupClientC.MaxItemsPerWriteOperation);

foreach (var chunk in chunks)
{
    var lote = chunk.Select(e => new WriteOperation(Guid.Empty, new()
    {
        { ProductosES.CodigoExterno, e.SKU },
        { ProductosES.Nombre, e.Nombre },
        { ProductosES.Precio, e.Precio.STR() }
    })).ToList();

    client.RunWriteOperation(ProductosES._SectionID, lote, false);
}
// ✓ Productos sincronizados por bloques
var cambios = new WriteOperation(productoId, new()
{
    { ProductosES.Precio, 999.00m.STR() }
});

client.RunWriteOperation(ProductosES._SectionID, cambios);
// ✓ Producto actualizado
// Actualizar precios masivamente
var cambios = productosIds.Select(id => new WriteOperation(id, new()
{
    { ProductosES.Precio, nuevoPrecio.STR() },
    { ProductosES.FechaActualizacion, DateTime.Now.STR() }
})).ToList();

client.RunWriteOperation(ProductosES._SectionID, cambios, false);
// ✓ 150 productos actualizados
// Factura con líneas en una llamada
var factura = new WriteOperation(Guid.Empty, new()
{
    { FacturasES.Numero, "F-2024-0042" },
    { FacturasES.ClienteID, clienteId.STR() },
    { FacturasES.Fecha, DateTime.Now.STR() }
});

var lineas = new List<WriteOperation>
{
    new(Guid.Empty, new() {
        { LineasES.Descripcion, "Consultoría" },
        { LineasES.Cantidad, 10.STR() },
        { LineasES.Precio, 80m.STR() }
    }),
    new(Guid.Empty, new() {
        { LineasES.Descripcion, "Desarrollo" },
        { LineasES.Cantidad, 25.STR() },
        { LineasES.Precio, 60m.STR() }
    })
};

client.RunWriteOperation(FacturasES._SectionID, factura, lineas);
// ✓ Factura + 2 líneas creadas
// Subir desde un array de bytes
var bytes = System.Text.Encoding.UTF8.GetBytes("contenido del archivo");

var upload = await client.File_UploadBytesAsync(bytes, "documento.txt");

Guid fileId = upload.FileId;
// ✓ Archivo subido
// Subir desde una URL externa
var upload = await client.File_UploadURLAsync(
    "https://ejemplo.com/imagen.png",
    "imagen.png"
);

Guid fileId = upload.FileId;
// ✓ Archivo importado desde URL
// Obtener URL firmada para lectura
var signed = await client.File_SignURLGetAsync(fileId);

var url = signed?.url_original;
// ✓ URL lista para usar
// Agregar un comentario (solo texto)
var params = new AnotationParameters(sectionId, rowId, AnnotationTypeE.Comments)
                            .WithText("¡Hola! Este es mi comentario.");

await client.Annotation_PutAsync(params);
// ✓ Comentario agregado
// Subir archivo primero
var upload = await client.File_UploadBytesAsync(bytes, "documento.pdf");

// Agregar comentario con archivo
var params = new AnotationParameters(sectionId, rowId, AnnotationTypeE.Comments)
                            .WithText("Adjunto el contrato firmado")
                            .WithFile(upload.FileId);

await client.Annotation_PutAsync(params);
// ✓ Comentario con archivo adjunto
// Leer anotaciones de un registro
var resultado = await client.Annotations_GetAsync(
                            sectionId,
                            rowId,
                            AnnotationTypeE.Comments
);

foreach (var anotacion in resultado.Annotations)
{
                            var texto = anotacion.Text;
                            var adjuntos = anotacion.AttachedFiles;
}
// Generar HTML de factura
var doc = new DynamicDocuments.PaginasInformesD.FacturaModernaC(ventaId);

var response = await doc.ExecuteAsync(client);

var html = response.Content;
// ✓ HTML de la factura generado
// Servicio con inyección de dependencias
public class ProductosService(DinaupClientC client)
{
                            public async Task<List<ProductoRow>> GetProductosAsync()
                            {
                            var report = new APIProductosC();
                            await report.ExecuteQueryAsync(client);
                            return report.Rows;
                            }

                            public void AddProducto(string nombre, decimal precio)
                            {
                            var op = new WriteOperation(Guid.Empty, new() {
                            { ProductosES.Nombre, nombre },
                            { ProductosES.Precio, precio.STR() }
                            });
                            client.RunWriteOperation(ProductosES._SectionID, op);
                            }
}
// Sincronizar productos desde API externa
public async Task SyncProductosAsync(List<ProductoExterno> externos)
{
                            var operaciones = externos.Select(e => new WriteOperation(
                            e.DinaupId ?? Guid.Empty,
                            new() {
                            { ProductosES.CodigoExterno, e.SKU },
                            { ProductosES.Nombre, e.Nombre },
                            { ProductosES.Precio, e.Precio.STR() }
                            })).ToList();

                            client.RunWriteOperation(ProductosES._SectionID, operaciones, false);
}
// ✓ Crea nuevos o actualiza existentes
// Worker para procesar tareas pendientes
public class TareasWorker : BackgroundService
{
                            protected override async Task ExecuteAsync(CancellationToken ct)
                            {
                            while (ct.IsCancellationRequested == false)
                            {
                            var pendientes = await GetPendientesAsync();
                            foreach (var tarea in pendientes)
                            await ProcesarAsync(tarea);

                            await Task.Delay(TimeSpan.FromMinutes(5), ct);
                            }
                            }
}
// Búsqueda de texto libre
report.QuerySearch = "iPhone Pro Max";

// Filtro IN (múltiples valores)
report.AddFilter(ProductosES.CategoriaId, new[] { categoria1Id, categoria2Id });

// OR implícito (mismo campo, múltiples llamadas)
report.AddFilter(PaisesES.Codigo, "=", "ES");
report.AddFilter(PaisesES.Codigo, "=", "IT");  // Devuelve ES e IT

// Filtro por relaciones encadenadas
var keyPath = $"{PedidosES._SectionID}.{PedidosES.ClienteId}.{ClientesD._SectionID}.{ClientesES.VIP}";
report.AddFilter(keyPath, "=", 1);

// Solapamiento de fechas
report.AddFilterDateRangeOverlapFilter(
                            EventosES.FechaInicio, EventosES.FechaFin,
                            rangeStart: new DateOnly(2024, 1, 1),
                            rangeEnd: new DateOnly(2024, 12, 31)
);

// Incluir eliminados
report.AddFilter(ProductosES.Eliminado, "<>", -1);  // Todos
// DynamicSelector - Buscar relación automáticamente
var op = new WriteOperation(Guid.Empty, new() {
                            { ProductosES.Nombre, "Mi producto" },
                            { ProductosES.UnidadMedidaID, $"[{UnidadesMedidaES.TextoPrincipal}=Litros]" }
});

// Editar por campo alternativo (ej: SKU)
client.RunWriteOperation(
                            ProductosD._SectionIDGUID, op,
                            runScripts: false,
                            identifierFieldKey: ProductosES.CodigoExterno
);

// Actualizar un solo campo (más legible)
await client.RunInlineWriteOperationAsync(
                            ProductosD._SectionIDGUID, productoId,
                            ProductosES.Precio, 1299.00m.STR()
);

// Limpiar relación (string vacío)
valores.Add(ProductosES.ClienteID, "");

// Verificar resultado
op.WriteOperationResult.RowID      // Guid del registro
op.WriteOperationResult.Confirmed  // bool
op.WriteOperationResult.AError     // string (si hay error)
// Obtener cabecera + líneas en una llamada
var factura = await FacturasD.GetRowByIdWithListAsync(client, facturaId);
Console.WriteLine($"Factura: {factura.MainRow.Numero}");
foreach (var linea in factura.ListRows) { }

// GetRowsAsync con labels de relaciones
var productos = await ProductosD.GetRowsAsync(client, params);
foreach (var p in productos)
{
                            Console.WriteLine($"{p.TextoPrincipal}: {p.ReferenciaCliente.Label}");
}

// Variables de informe
var report = new VentasPorClienteC();
report.AddVariable("ClienteId", clienteId.ToString());
report.AddVariable("FechaDesde", "2024-01-01");

// Propiedades del informe
report.Rows           // List<RowC>
report.RowsDic        // Dictionary<Guid, RowC>
report.TotalResults   // int
report.ExistNextPage  // bool
// Verificar conexión
if (client.IsConnected) { /* OK */ }

// Connect síncrono (alternativa a ConnectAsync)
var client = DinaupClientC.Connect(endpoint, publicKey, secretKey);

// Conversión de enums
{ FacturasES.Estado, EstadoFacturaE.Borrador.INT().STR() }

// Deduplicación con SHA1
string sha1 = Dinaup.extensions.ToSHA1(contenido);

// URL firmada con parámetros
var url = await client.File_SignURLGetAsync(fileId, cachear: false);

// Propiedades de archivo subido
upload.FileData.Id        // Guid
upload.FileData.CRC       // SHA1
upload.FileData.IsImage   // bool
upload.FileData.url_1080  // Redimensionado
// Ejecutar como usuario específico
// Afecta a: autor de alta, histórico, anotaciones, filtros de sesión

// Solo userId
using (DinaupContext.WithUser(userId))
{
                            client.RunWriteOperation(...);
}

// Con IP
using (DinaupContext.WithUser(userId, "192.168.1.1"))
{
                            client.RunWriteOperation(...);
}

// Con IP y UserAgent
using (DinaupContext.WithUser(userId, "192.168.1.1", "Mozilla/5.0..."))
{
                            client.RunWriteOperation(...);
}
El problema

Tus procesos viven en Excels
que ya no dan mas de si

Tu equipo ha construido durante anos logica critica en hojas de calculo: precios, comisiones, stock, impuestos, reporting...

No escala

No soporta millones de filas ni varios usuarios simultaneos sin bloquearse.

Sin trazabilidad

No hay control de cambios real ni auditoria de quien modifico que.

Errores ocultos

Una formula rota puede pasar desapercibida durante semanas.

Integracion imposible

Conectarlo con CRMs, ERPs o tiendas online es un parche constante.

"Dinaup nace para conservar esa libertad de modelar, pero dentro de un sistema robusto, auditable e integrable."

Un ERP enlatado nunca encaja del todo

  • - Proyectos largos y caros de personalizacion
  • - Dependencia total del proveedor
  • - Funcionalidades que no usas y las que necesitas, a medias

Dinaup invierte el enfoque: no te obliga a encajar en su modelo, te da un modelo abierto.

El desarrollo a medida: un pozo sin fondo

  • - Meses de analisis, desarrollo y pruebas
  • - Mantenimiento eterno de backend y base de datos
  • - Imposibilidad de cambiar rapido sin romper algo

Dinaup te da un framework ya resuelto: motor de datos, informes, documentos, API listos.

Para quién es

¿Para quién es Dinaup?

Para empresas y equipos tecnicos que necesitan flexibilidad sin renunciar a la robustez.

Para empresas que han crecido mas rapido que su sistema

Si tu gestion vive en Excels, ERPs parcheados y aplicaciones dispersas:

  • Centraliza todo en un modelo consistente
  • Conserva la flexibilidad de Excel
  • Gana trazabilidad y seguridad

Para equipos tecnicos que no quieren reinventar el backend

Si desarrollas aplicaciones de negocio:

  • Capa de datos configurable sin SQL
  • Motor de informes y documentos
  • API y SDK listos para usar

Tu te enfocas en experiencia de usuario y logica avanzada

Dinaup se encarga de la base de datos, los informes, los documentos y la API

"No adaptas tu empresa a un software: adaptas el software a tu empresa"

"Lo que antes eran 20 Excels sueltos, ahora es un sistema unico y auditado"

Tu negocio cambia. Tu sistema tambien deberia.

Empieza a construir tu ERP personalizado hoy mismo. Sin codigo, sin limites, sin compromisos.

Comenzar gratis Agendar demostracion
Prueba gratuita
Sin tarjeta de credito
Soporte incluido
Programa de Partners

Crece con Dinaup

Unete a nuestra red de partners y ofrece a tus clientes soluciones de gestion de datos de primer nivel

Nuevos ingresos

Ofrece servicios de mantenimiento, formacion, soporte tecnico, desarrollo de integraciones y mucho mas.

Acceso a repositorios

Acelera tus desarrollos con acceso a aplicaciones ya creadas y herramientas internas de Dinaup.

Formacion y soporte

Soporte prioritario y acceso a formaciones internas para dominar la plataforma.

Tres niveles de partner

Partner Support
Partner Developer
Partner Advanced
Ver listado de partners Contactar: [email protected]
WhatsApp