README
Cierro - Propuestas Comerciales Inteligentes
SaaS para crear propuestas comerciales profesionales con asistencia de IA
Características • Stack • Arquitectura • Base de Datos • Edge Functions • Instalación
📋 Tabla de Contenidos
Descripción
Cierro es una plataforma SaaS diseñada para agencias y equipos de ventas que necesitan crear propuestas comerciales profesionales de manera rápida y eficiente. Utiliza inteligencia artificial para generar contenido, ofrece colaboración en tiempo real y proporciona herramientas completas para la gestión del pipeline de ventas.
¿Para quién es Cierro?
🏢 Agencias de Marketing y Publicidad - Propuestas creativas con branding personalizado
💼 Equipos de Ventas B2B - Cotizaciones profesionales con seguimiento
🔧 Consultoras y Servicios Profesionales - Documentos estructurados con etapas y entregables
🚀 Startups y Freelancers - Propuestas rápidas con asistencia de IA
Características
📝 Editor de Propuestas Avanzado
Editor WYSIWYG basado en TipTap
Generación de contenido con IA (Gemini/OpenAI)
Bloques personalizables: texto, imágenes, tablas de precios, etapas
Exportación a PDF con diseño profesional
Plantillas predefinidas y personalizables
👥 Colaboración en Tiempo Real
Edición simultánea con Liveblocks + Yjs
Cursores y presencia de colaboradores
Historial de versiones con comparación
Chat integrado por propuesta
📊 Gestión de Ventas
Pipeline de propuestas (borrador, enviado, aprobado, rechazado)
Dashboard con métricas y KPIs
Metas de ventas por ejecutivo
Comisiones configurables
Reportes exportables
🎨 Personalización de Marca
Colores y tipografías personalizables
Logo de empresa
Encabezados configurables
Biblioteca de imágenes
🔗 Integraciones
HubSpot: Sincronización de contactos y deals
Pipedream: Conexión con +1000 apps
Reveniu: Procesamiento de pagos (Chile)
📧 Notificaciones
Emails transaccionales con Resend
Recordatorios de vencimiento
Alertas de aprobación
Stack Tecnológico
Frontend
React 18
Framework UI
TypeScript
Tipado estático
Vite
Build tool
Tailwind CSS
Estilos
shadcn/ui
Componentes UI
TipTap
Editor de texto
Liveblocks
Colaboración en tiempo real
Yjs
CRDT para sync
React Query
Estado del servidor
React Router
Navegación
Recharts
Gráficos
Framer Motion
Animaciones
Backend
Supabase
BaaS (Database, Auth, Storage, Edge Functions)
PostgreSQL
Base de datos
Clerk
Autenticación
Resend
Emails transaccionales
Google Gemini
IA para contenido
OpenAI GPT
IA alternativa
Reveniu
Pagos
Herramientas de Desarrollo
ESLint
Linting
Lovable
Plataforma de desarrollo
Git
Control de versiones
Arquitectura del Proyecto
Base de Datos
Cierro utiliza PostgreSQL a través de Supabase. A continuación se describe el esquema de base de datos.
Diagrama de Relaciones
Tablas Principales
Companies (Empresas)
Almacena la información de cada empresa/organización.
id
UUID
Identificador único
name
TEXT
Nombre de la empresa
logo_url
TEXT
URL del logo
primary_color
TEXT
Color primario de marca
secondary_color
TEXT
Color secundario
font_title
TEXT
Fuente para títulos
font_body
TEXT
Fuente para cuerpo
default_currency
TEXT
Moneda por defecto (USD)
default_language
TEXT
Idioma por defecto (es)
subscription_status
TEXT
Estado de suscripción
subscription_plan_id
UUID
Plan de suscripción
trial_ends_at
TIMESTAMP
Fin del período de prueba
Profiles (Usuarios)
Perfiles de usuario vinculados a Clerk.
id
UUID
Identificador único
clerk_user_id
TEXT
ID de Clerk
email
TEXT
Email del usuario
full_name
TEXT
Nombre completo
avatar_url
TEXT
URL del avatar
company_id
UUID
Empresa asociada
is_super_admin
BOOLEAN
Es super administrador
User Roles (Roles)
Roles de usuarios por empresa.
id
UUID
Identificador único
profile_id
UUID
Usuario
company_id
UUID
Empresa
role
ENUM
Rol: admin, manager, member, viewer
Budgets (Presupuestos)
Propuestas comerciales.
id
UUID
Identificador único
company_id
UUID
Empresa
created_by
UUID
Creador
title
TEXT
Título
client_name
TEXT
Nombre del cliente
client_company
TEXT
Empresa del cliente
client_email
TEXT
Email del cliente
status
TEXT
Estado: draft, sent, approved, rejected
total_amount
NUMERIC
Monto total
currency
TEXT
Moneda
validity_days
INTEGER
Días de validez
raw_html
TEXT
Contenido HTML
stages
JSONB
Etapas del proyecto
costs
JSONB
Costos detallados
sections
JSONB
Secciones del documento
Products (Productos)
Catálogo de productos/servicios.
id
UUID
Identificador único
company_id
UUID
Empresa
name
TEXT
Nombre
description
TEXT
Descripción
default_unit_price
NUMERIC
Precio unitario
cost_type
TEXT
Tipo: one-time, recurring
category
TEXT
Categoría
item_type
TEXT
Tipo: product, service
Sales Goals (Metas de Ventas)
Objetivos de ventas por período.
id
UUID
Identificador único
company_id
UUID
Empresa
profile_id
UUID
Ejecutivo
one_time_goal
NUMERIC
Meta one-time
recurring_goal
NUMERIC
Meta recurrente
period_start
DATE
Inicio del período
period_end
DATE
Fin del período
Commission Rules (Reglas de Comisión)
Configuración de comisiones.
id
UUID
Identificador único
company_id
UUID
Empresa
profile_id
UUID
Ejecutivo
rule_type
TEXT
Tipo de regla
commission_percentage
NUMERIC
Porcentaje de comisión
bonus_percentage
NUMERIC
Porcentaje de bonus
Subscription Plans (Planes)
Planes de suscripción disponibles.
id
UUID
Identificador único
name
TEXT
Nombre interno
display_name
TEXT
Nombre visible
price_monthly
NUMERIC
Precio mensual
limits
JSONB
Límites del plan
features
JSONB
Características
Políticas RLS
Todas las tablas tienen Row Level Security (RLS) habilitado. Las políticas principales:
Companies: Lectura pública, escritura restringida
Profiles: Usuarios pueden ver/editar su propio perfil
Budgets: Acceso basado en rol y empresa
Products: Acceso por empresa
Edge Functions
Cierro utiliza Supabase Edge Functions para lógica de backend. Todas las funciones están en TypeScript y se ejecutan en Deno.
Lista de Funciones
accept-invitation
POST
Acepta invitación de equipo, crea perfil y rol
admin-panel
POST
Panel de administración para super admins
cancel-subscription
POST
Cancela suscripción activa
chat-gemini
POST
Chat con IA para generación de contenido
check-trial-expiration
GET
Cron job para verificar trials y enviar recordatorios
crm-via-pipedream
POST
Ejecuta acciones CRM via Pipedream
exchange-rates
GET
Obtiene tasas de cambio actualizadas
hubspot-api
POST
Proxy para API de HubSpot
import-budget
POST
Importa presupuesto desde archivo
invite-team-member
POST
Envía invitación por email
liveblocks-auth
POST
Autenticación para Liveblocks
manage-team
POST
Gestión de miembros del equipo
parse-document
POST
Parsea documentos (PDF, DOCX)
pipedream-action
POST
Ejecuta acciones de Pipedream
pipedream-auth
POST
Autenticación OAuth para Pipedream
reactivate-subscription
POST
Reactiva suscripción cancelada
reveniu-webhook
POST
Webhook de pagos Reveniu
send-contact-form
POST
Envía formulario de contacto
send-notification-email
POST
Envía emails transaccionales
Documentación Detallada
Ver docs/api-reference.md para documentación completa de cada función.
Sistema de Emails
Cierro utiliza Resend para envío de emails transaccionales con templates React.
Templates Disponibles
welcome_trial
Registro
Bienvenida al período de prueba
trial_expiring
Cron (7, 3, 1 días)
Recordatorio de trial por vencer
trial_expired
Cron
Notificación de trial expirado
budget_expiring
Cron (7, 3, 1 días)
Presupuesto por vencer
budget_approved
Aprobación
Presupuesto aprobado por cliente
team_invitation
Invitación
Invitación a unirse al equipo
team_welcome
Aceptación
Bienvenida al nuevo miembro
subscription_activated
Pago
Suscripción activada
subscription_cancelled
Cancelación
Suscripción cancelada
subscription_reactivated
Reactivación
Suscripción reactivada
payment_failed
Fallo de pago
Error en el pago
Ubicación de Templates
Autenticación y Roles
Flujo de Autenticación
Usuario inicia sesión con Clerk
Clerk emite JWT con
clerk_user_idSupabase valida JWT y extrae
clerk_user_idRLS policies verifican permisos usando funciones helper
Funciones Helper de Auth
Roles y Permisos
admin
Administrador
Todo: configuración, equipo, reportes, presupuestos
manager
Gerente
Ver todos los presupuestos, reportes, metas
member
Miembro
CRUD sus propios presupuestos
viewer
Visualizador
Solo lectura de sus presupuestos
Matriz de Permisos
Ver dashboard
✅
✅
✅
✅
Crear presupuestos
✅
✅
✅
❌
Ver todos los presupuestos
✅
✅
❌
❌
Editar presupuestos propios
✅
✅
✅
❌
Editar presupuestos de otros
✅
✅
❌
❌
Configuración de empresa
✅
❌
❌
❌
Gestión de equipo
✅
✅
❌
❌
Ver reportes
✅
✅
✅
✅
Configurar comisiones
✅
✅
❌
❌
Páginas y Rutas
Páginas Públicas
/
Landing
Página principal
/features
Features
Características del producto
/pricing
Pricing
Planes y precios
/about
About
Sobre nosotros
/contact
Contact
Formulario de contacto
/terms
Terms
Términos y condiciones
/privacy
Privacy
Política de privacidad
/auth
Auth
Login/Registro
/accept-invite
AcceptInvite
Aceptar invitación
Páginas Privadas (Requieren Auth)
/dashboard
Dashboard
Panel principal
/budgets
Budgets
Lista de presupuestos
/budgets/new
BudgetNew
Crear presupuesto
/budgets/:id
BudgetDetail
Editar presupuesto
/catalog
Catalog
Catálogo de productos
/reports
Reports
Reportes y analytics
/team
Team
Gestión de equipo
/settings
Settings
Configuración
/onboarding
Onboarding
Configuración inicial
/integrations
Integrations
Integraciones
Páginas de Checkout
/checkout/success
CheckoutSuccess
Pago exitoso
/checkout/failure
CheckoutFailure
Pago fallido
Páginas de Admin
/admin
Admin
Panel de super admin
Instalación
Requisitos Previos
Node.js 18+
npm o yarn
Cuenta de Supabase (o usar Lovable Cloud)
Cuenta de Clerk
Instalación Local
Scripts Disponibles
Variables de Entorno
Variables de Cliente (.env)
Secrets de Edge Functions (Supabase)
CLERK_SECRET_KEY
API key de Clerk
✅
CLERK_PUBLISHABLE_KEY
Key pública de Clerk
✅
SUPABASE_URL
URL del proyecto Supabase
✅
SUPABASE_ANON_KEY
Anon key de Supabase
✅
SUPABASE_SERVICE_ROLE_KEY
Service role key
✅
RESEND_API_KEY
API key de Resend
✅
GEMINI_API_KEY
API key de Google Gemini
✅
OPENAI_API_KEY
API key de OpenAI
Opcional
LIVEBLOCKS_SECRET_KEY
Secret de Liveblocks
✅
REVENIU_SECRET_KEY
Secret de Reveniu
Para pagos
HUBSPOT_ACCESS_TOKEN
Token de HubSpot
Opcional
PIPEDREAM_CLIENT_ID
Client ID de Pipedream
Opcional
PIPEDREAM_CLIENT_SECRET
Client Secret
Opcional
PIPEDREAM_PROJECT_ID
Project ID
Opcional
Guías de Migración
Para self-hosting o migración a otra infraestructura, consulta:
01-schema-migration.sql - Schema SQL completo
02-data-export-queries.sql - Queries de exportación
03-migration-guide.md - Guía paso a paso
04-edge-functions-config.toml - Config de Edge Functions
05-self-hosting-guide.md - Guía de self-hosting
Despliegue
Despliegue con Lovable
Ir a Lovable
Abrir el proyecto
Click en Share → Publish
Self-Hosting
Vercel
Netlify
Docker
Contribución
Guía de Contribución
Fork el repositorio
Crear rama:
git checkout -b feature/nueva-caracteristicaCommit:
git commit -m 'Agregar nueva característica'Push:
git push origin feature/nueva-caracteristicaCrear Pull Request
Estándares de Código
Usar TypeScript estricto
Seguir convenciones de ESLint
Componentes en PascalCase
Hooks con prefijo
useArchivos de componente en PascalCase.tsx
Estructura de Commits
Licencia
Este proyecto es propietario. Todos los derechos reservados.
© 2024 Cierro - Desarrollado por NLACE
Contacto
Email: [email protected]
Website: cierro.app
Desarrollado por: NLACE
Built with ❤️ using Lovable
Última actualización