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.
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Nombre | Tfno | Tipo | |
| 2 | María G. | maria@emp | 612345678 | premium |
| 3 | carlos lopez | #REF! | sin tfno | PREMIUM |
| 4 | ??? | email malo | +34612 | basico |
Campo creado por ti · Auto-generado
Dinaup convierte la flexibilidad caotica de Excel en aplicaciones estructuradas, validadas y listas para escalar tu negocio.
Hojas de calculo
Aplicacion estructurada
Empiezas con una base solida: ventas, tareas, personas, clientes. Todo conectado desde el primer dia.
TPV, CRM, RRHH o Proyectos.
Elige por donde empezar, no hasta donde llegar.
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.
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.
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.
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.
Cada campo puede validar los datos de forma inteligente: formatos correctos, rangos permitidos, campos obligatorios y reglas personalizadas. Menos errores. Datos siempre consistentes.
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.
Recibe notificaciones en tiempo real, consulta informes y automatiza procesos con herramientas como n8n, Make, Zapier o tu propio código
Webhooks cuando cambian tus datos
Recibe una notificación HTTP cada vez que se cree, modifique o elimine un registro en cualquier sección.
Compatible con:
Datos estructurados en JSON
Cualquier informe que crees está disponible como endpoint de API.
curl -X POST "https://webhook.dinaup.com/api/reports?id=35461251-de05-41bf-a5c6-fe56fffe65a8" -H "Authorization: Bearer tu_token"
Controla resultados
Por cualquier campo
{
"data": [
{
"Estado": "En curso",
"Paciente": "Javi C.",
"Medico": "Juan Rodriguez"
}
],
"totalResults": 59
}
Conecta Dinaup con cientos de aplicaciones y crea flujos de trabajo automatizados sin programar
Los webhooks se disparan instantáneamente cuando cambian tus datos en Dinaup
Arrastra y conecta nodos visuales para crear flujos complejos sin código
Conecta con Gmail, Slack, Sheets, Notion, Airtable, y cientos más
Fuertemente tipado
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(...); }
Tu equipo ha construido durante anos logica critica en hojas de calculo: precios, comisiones, stock, impuestos, reporting...
No soporta millones de filas ni varios usuarios simultaneos sin bloquearse.
No hay control de cambios real ni auditoria de quien modifico que.
Una formula rota puede pasar desapercibida durante semanas.
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."
Dinaup invierte el enfoque: no te obliga a encajar en su modelo, te da un modelo abierto.
Dinaup te da un framework ya resuelto: motor de datos, informes, documentos, API listos.
Para empresas y equipos tecnicos que necesitan flexibilidad sin renunciar a la robustez.
Si tu gestion vive en Excels, ERPs parcheados y aplicaciones dispersas:
Si desarrollas aplicaciones de negocio:
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"
Empieza a construir tu ERP personalizado hoy mismo. Sin codigo, sin limites, sin compromisos.
Unete a nuestra red de partners y ofrece a tus clientes soluciones de gestion de datos de primer nivel
Ofrece servicios de mantenimiento, formacion, soporte tecnico, desarrollo de integraciones y mucho mas.
Acelera tus desarrollos con acceso a aplicaciones ya creadas y herramientas internas de Dinaup.
Soporte prioritario y acceso a formaciones internas para dominar la plataforma.