README

Cierro Logo

Cierro - Propuestas Comerciales Inteligentes

SaaS para crear propuestas comerciales profesionales con asistencia de IA

CaracterísticasStackArquitecturaBase de DatosEdge FunctionsInstalación

React
TypeScript
Vite
Tailwind
Supabase

📋 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

Tecnología
Uso

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

Tecnología
Uso

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

Tecnología
Uso

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.

Campo
Tipo
Descripció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.

Campo
Tipo
Descripción

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.

Campo
Tipo
Descripción

id

UUID

Identificador único

profile_id

UUID

Usuario

company_id

UUID

Empresa

role

ENUM

Rol: admin, manager, member, viewer

Budgets (Presupuestos)

Propuestas comerciales.

Campo
Tipo
Descripción

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.

Campo
Tipo
Descripción

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.

Campo
Tipo
Descripción

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.

Campo
Tipo
Descripción

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.

Campo
Tipo
Descripción

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

Función
Endpoint
Descripción

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

Template
Trigger
Descripción

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

  1. Usuario inicia sesión con Clerk

  2. Clerk emite JWT con clerk_user_id

  3. Supabase valida JWT y extrae clerk_user_id

  4. RLS policies verifican permisos usando funciones helper

Funciones Helper de Auth

Roles y Permisos

Rol
Descripción
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

Acción
Admin
Manager
Member
Viewer

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

Ruta
Componente
Descripción

/

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)

Ruta
Componente
Descripción

/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

Ruta
Componente
Descripción

/checkout/success

CheckoutSuccess

Pago exitoso

/checkout/failure

CheckoutFailure

Pago fallido

Páginas de Admin

Ruta
Componente
Descripción

/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)

Secret
Descripción
Requerido

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:


Despliegue

Despliegue con Lovable

  1. Ir a Lovable

  2. Abrir el proyecto

  3. Click en Share → Publish

Self-Hosting

Vercel

Netlify

Docker


Contribución

Guía de Contribución

  1. Fork el repositorio

  2. Crear rama: git checkout -b feature/nueva-caracteristica

  3. Commit: git commit -m 'Agregar nueva característica'

  4. Push: git push origin feature/nueva-caracteristica

  5. Crear Pull Request

Estándares de Código

  • Usar TypeScript estricto

  • Seguir convenciones de ESLint

  • Componentes en PascalCase

  • Hooks con prefijo use

  • Archivos de componente en PascalCase.tsx

Estructura de Commits


Licencia

Este proyecto es propietario. Todos los derechos reservados.

© 2024 Cierro - Desarrollado por NLACE


Contacto


Built with ❤️ using Lovable

Última actualización