# CD-System Airtable Base — Schema Specification

**Version:** 2.2
**Date:** 2026-03-01
**Purpose:** Engineering spec for the restructured Airtable base used to manage CD-System's product catalog, project deployments, and client relationships.

---

## Overview

This base models the full lifecycle of a multitenant CMS agency:

```
Industries
    |
    +-- Products (Industry x Module Bundle x Template)
    |       |
    |       +-- Product Copy (marketing layer, separate table)
    |       |
    |       +-- Shop Products (niche SKUs, commercial layer)
    |       |       |
    |       |       +-- Shop Product Copy (AI-generated per SKU)
    |       |
    |       +-- Projects (client deployments)
    |               |
    |               +-- Subscriptions (billing per project)
    |               |
    |               +-- Contacts (people linked to project)
    |               |
    |               +-- Resellers (who sold the project)
    |
    +-- Templates (visual themes)
    |
Module Bundles
    |
    +-- Modules (atomic building blocks)
    |
    +-- Module Guides (help docs per module)
```

---

## Tables

### 05. Clients

**File:** `05-clients.csv`
**Purpose:** Companies and individuals that are clients or prospects. Unified CRM entity that links to Projects. Covers both active clients (have a deployed site) and prospects (in pipeline).

| Field | Type | Notes |
|-------|------|-------|
| Name | Single line text | Company or person name. Primary key. |
| Slug | Single line text | URL-safe identifier |
| Type | Single select | Company, Individual, NGO, Internal |
| Status | Single select | Active, Prospect, Inactive |
| Industry | Single line text | Primary industry vertical (informational, mirrors product industry) |
| Country | Single line text | Country of operation |
| Reseller | Linked record | -> Resellers (who manages this client relationship) |
| Website | URL | Client's current or target website |
| Notes | Long text | Internal notes, context, deal history |

**Valid Type values:** Company, Individual, NGO, Internal
**Valid Status values:** Active, Prospect, Inactive

**Relationships:**
- 1 Client -> N Projects (linked from Projects.Client)
- N Clients -> 1 Reseller (via Reseller field)

---

### 01. Industries

**File:** `01-industries.csv`
**Purpose:** Top-level market verticals. Every product belongs to one industry.

| Field | Type | Notes |
|-------|------|-------|
| Name | Single line text | Primary key (human-readable). E.g. "Law & Corporate" |
| Slug | Single line text | URL-safe identifier. E.g. "law-corporate" |
| Status | Single select | Active, Coming Soon |
| Priority | Number | Display order in catalog (1 = highest) |
| Description | Long text | Short description of businesses in this vertical |
| ICP_Summary | Long text | Ideal Customer Profile summary |

**Valid Status values:** Active, Coming Soon

**Relationships:**
- 1 Industry -> N Products (linked from Products.Industry)
- 1 Industry -> N Templates as primary industry (informational, not enforced)

---

### 02. Modules

**File:** `02-modules.csv`
**Purpose:** Atomic functional building blocks. Each module maps to a Laravel module in `app/Modules/`.

| Field | Type | Notes |
|-------|------|-------|
| Name | Single line text | Human name. E.g. "Services" |
| Slug | Single line text | Maps to Laravel module slug. E.g. "services" |
| Commercial_Name | Single line text | Marketing-facing name. E.g. "Catalogo de Soluciones" |
| Value_Pitch | Single line text | One-line value proposition |
| Description | Long text | Full description for internal and client use |
| Category | Single select | Listing, Content, Showcase, Integration, Core |
| Type | Single select | Standard, Premium, Third-Party Integration, Core |
| Psychological_Trigger | Single line text | Conversion psychology label |
| Atomic_Concept | Single line text | What the module renders (UI primitive description) |
| Status | Single select | Active, In Development, Deprecated |
| Demo_URL | URL | Link to live demo (if available) |

**Valid Category values:** Listing, Content, Showcase, Integration, Core
**Valid Type values:** Standard, Premium, Third-Party Integration, Core
**Valid Status values:** Active, In Development, Deprecated

**Relationships:**
- N Modules <-> N Module Bundles (modules listed in Modules field of bundles)
- 1 Module -> N Module Guides (linked from Module_Guides.Module_Slug)

---

### 03. Module Bundles

**File:** `03-module-bundles.csv`
**Purpose:** Curated, pre-defined sets of modules grouped by tier and use case. A product references one bundle plus optional overrides.

| Field | Type | Notes |
|-------|------|-------|
| Name | Single line text | E.g. "Pro", "E-commerce Lite" |
| Slug | Single line text | E.g. "pro", "ecommerce-lite" |
| Tier | Single select | Starter, Standard, Pro, Premium |
| Modules | Long text | Comma-separated module slugs included in bundle |
| Module_Count | Number | Total module count (informational) |
| Description | Long text | What this bundle is and who it is for |
| Recommended_For | Single line text | Target customer type |
| Base_Price_USD | Currency | Base monthly price in USD |

**Valid Tier values:** Starter, Standard, Pro, Premium

**Relationships:**
- 1 Module Bundle -> N Products (linked from Products.Module_Bundle)

---

### 04. Templates

**File:** `04-templates.csv`
**Purpose:** Visual demo themes. Each template maps to a `demo-{slug}` Laravel view set in `resources/views/layout/front/` and a CSS file in `public/template/css/demos/`.

| Field | Type | Notes |
|-------|------|-------|
| Name | Single line text | Full template name including "demo-" prefix |
| Slug | Single line text | Same as Name (slug IS the demo identifier used in code) |
| Status | Single select | Active, Available, Deprecated |
| Design_Style | Single line text | Short style description. E.g. "Corporate / Formal" |
| Primary_Industry | Single select | Linked to Industries.Name (primary fit) |
| Color_Description | Single line text | Color palette summary |
| Preview_URL | URL | Live preview URL |
| Notes | Long text | References, usage notes, known constraints |

**Valid Status values:** Active, Available, Deprecated
**Active** = has a deployed product. **Available** = built but no product assigned yet.

**Relationships:**
- 1 Template -> N Products (linked from Products.Template)
- 1 Template -> N Projects (linked from Projects.Template)

---

### 06. Products

**File:** `06-products.csv`
**Purpose:** Sellable website solutions. A product is the combination of Industry + Module Bundle + Template. This table contains ONLY operational/configuration data. Marketing copy is in Product_Copy (07).

| Field | Type | Notes |
|-------|------|-------|
| Name | Single line text | Commercial product name. E.g. "Law Firm Digital" |
| Slug | Single line text | URL-safe identifier. E.g. "law-firm-digital" |
| Industry | Linked record | -> Industries |
| Module_Bundle | Linked record | -> Module Bundles |
| Modules_Override | Long text | Comma-separated slugs if product differs from bundle default |
| Template | Linked record | -> Templates |
| Tier | Single select | Starter, Standard, Pro, Premium (mirrors bundle tier) |
| Price_USD | Currency | Monthly price in USD |
| Catalog_Status | Single select | Published, Review, Draft |
| Dev_Status | Single select | Ready, In Progress, Needs Update, Not Started |
| Env_Status | Single select | Active, In Progress, Not Started |
| Demo_URL | URL | Product demo URL |
| Demo_Password | Single line text | Password if demo is protected |
| Repository | URL | GitHub repository for the product boilerplate |
| Cpanel_User | Single line text | cPanel account where demo lives |
| Reference_Project | Linked record | -> Projects (the canonical reference deployment) |

**Valid Catalog_Status values:** Published, Review, Draft
**Valid Dev_Status values:** Ready, In Progress, Needs Update, Not Started
**Valid Env_Status values:** Active, In Progress, Not Started

**Design notes:**
- `Modules_Override` is only populated when the deployed module set differs from the bundle definition. Most products will have this field populated since they fine-tune the bundle for the specific vertical.
- `Reference_Project` links to the most mature real client deployment for this product.

**Relationships:**
- 1 Product -> N Projects (linked from Projects.Product)
- 1 Product -> 1 Product_Copy (linked from Product_Copy.Product_Slug)
- N Products <- 1 Industry
- N Products <- 1 Module_Bundle
- N Products <- 1 Template

---

### 07. Product Copy

**File:** `07-product-copy.csv`
**Purpose:** Marketing and sales copy per product. Kept separate from product config to allow copywriters to work independently and to version copy without touching operational data.

| Field | Type | Notes |
|-------|------|-------|
| Product_Slug | Single line text | Foreign key -> Products.Slug |
| Tagline | Single line text | Short punchy tagline. 4-8 words |
| Headline | Single line text | Main headline for product page |
| Target_Persona | Long text | Description of ideal buyer |
| Pain_Points | Long text | Problems this product solves. Pipe-separated or paragraph |
| Value_Props | Long text | Key value propositions. Pipe-separated or paragraph |
| CTA_Primary | Single line text | Primary call-to-action button text |
| CTA_Secondary | Single line text | Secondary call-to-action button text |
| Copy_Status | Single select | Draft, Review, Approved |

**Valid Copy_Status values:** Draft, Review, Approved

**Relationships:**
- 1 Product_Copy record -> 1 Product (via Product_Slug)

---

### 08. Projects

**File:** `08-projects.csv`
**Purpose:** Client deployments. Each row is one live (or in-progress) website instance. Contains operational data only — no PHP code, no provisioning scripts.

| Field | Type | Notes |
|-------|------|-------|
| Name | Single line text | Client/project name. E.g. "Constructora Gama S.A" |
| Domain | Single line text | Primary domain. E.g. "constructoragama.com.ar" |
| Pipeline_Status | Single select | Full sales + delivery funnel |
| Env_Status | Single select | Active, In Progress, Paused, Not Started |
| Product | Linked record | -> Products |
| Template | Linked record | -> Templates (may differ from product default) |
| Cpanel_User | Single line text | cPanel username for this deployment |
| Repository | URL | GitHub repository URL for this project |
| GA_Tracking_ID | Single line text | Google Analytics 4 measurement ID. E.g. "G-XXXXXXXX" |
| Database_Name | Single line text | MySQL database name. Convention: bp-{slug} |
| Server | Single line text | Hosting server identifier (leave blank if shared/default) |
| Contacts | Linked records | -> Contacts (all people associated with this project) |
| Reseller | Linked record | -> Resellers (who sourced/sold this project) |
| Notes | Long text | Internal notes, special config, known issues |
| Created | Date | Project creation date |
| Launched | Date | Go-live date |

**Valid Pipeline_Status values:** Opportunity, Approval, On Development, On Presentation, Active, Paused, Archived, Rejected
**Valid Env_Status values:** Active, In Progress, Paused, Not Started

**Pipeline stages:**
- **Opportunity** → Lead captured, not yet qualified
- **Approval** → Client agreed, project approved, payment pending
- **On Development** → In active development
- **On Presentation** → Built, awaiting client review/approval
- **Active** → Live and paying
- **Paused** → Temporarily halted
- **Archived** → Completed and decommissioned
- **Rejected** → Did not proceed

**Notes:**
- Database naming convention: `bp-{descriptive-slug}` (e.g. `bp-constructoragama`)
- A project may use a different template than the product default (template was customized for this client)
- The `Contacts` field links to multiple people (owner, contact, agency contacts)

**Relationships:**
- N Projects -> 1 Product
- N Projects -> 1 Template
- 1 Project -> 1 Subscription
- N Projects <-> N Contacts

---

### 09. Subscriptions

**File:** `09-subscriptions.csv`
**Purpose:** Billing records. One subscription per active project. Tracks plan, amount, payment method, and renewal status.

| Field | Type | Notes |
|-------|------|-------|
| Project | Linked record | -> Projects (1:1 for active projects) |
| Plan | Single select | Monthly, Annual |
| Amount_USD | Currency | Billed amount in USD |
| Currency | Single select | USD, ARS |
| Billing_Start | Date | Date first payment was collected |
| Last_Payment_Date | Date | Most recent successful payment |
| Next_Billing_Date | Date | When next payment is due |
| Auto_Renew | Checkbox | Whether subscription auto-renews |
| Status | Single select | Active, Paused, Cancelled, Pending |
| Payment_Method | Single select | Mercadopago, Stripe, Transferencia, Efectivo |
| Notes | Long text | Payment notes, exceptions |

**Valid Plan values:** Monthly, Annual
**Valid Status values:** Active, Paused, Cancelled, Pending
**Valid Payment_Method values:** Mercadopago, Stripe, Transferencia, Efectivo

**Relationships:**
- 1 Subscription -> 1 Project

---

### 10. Contacts

**File:** `10-contacts.csv`
**Purpose:** People — both internal agency staff and client contacts. Replaces the old Users table with a unified contacts model.

| Field | Type | Notes |
|-------|------|-------|
| Name | Single line text | Full name |
| Email | Email | Primary email address |
| Phone | Phone | Primary phone/WhatsApp |
| Role | Single line text | Job title or relationship. E.g. "Client Owner", "Founder / PM" |
| Is_Internal | Checkbox | True if this person is an agency employee |
| Client_Company | Single line text | Company name (informal, for filtering) |
| Projects | Linked records | -> Projects this person is associated with |
| Notes | Long text | Internal notes |

**Relationships:**
- N Contacts <-> N Projects

---

### 11. Module Guides

**File:** `11-module-guides.csv`
**Purpose:** Help documentation for clients, organized by module. Replaces the old Manual Content table with explicit module linking.

| Field | Type | Notes |
|-------|------|-------|
| ID | Single line text | Unique slug identifier. E.g. "modulo-services" |
| Module_Slug | Single line text | Foreign key -> Modules.Slug |
| Type | Single select | core, modulo, analytics, soporte |
| Visible_Name | Single line text | Display name shown to clients |
| Description | Long text | What this guide covers |
| Steps | Long text | Numbered steps. Newline-separated |
| Tip | Long text | Optional pro tip for this module |
| Video_URL | URL | Loom or YouTube tutorial video (optional) |

**Valid Type values:** core, modulo, analytics, soporte

**Relationships:**
- N Module Guides -> 1 Module (via Module_Slug)

---

---

### 12. Resellers

**File:** `12-resellers.csv`
**Purpose:** Entities (agencies or individuals) that sell BewPro products under their own brand. Supports white-label model. Compania Digital is the first and currently only reseller.

| Field | Type | Notes |
|-------|------|-------|
| Name | Single line text | Reseller company name |
| Slug | Single line text | URL-safe identifier |
| Type | Single select | Agency, Freelancer, Distributor |
| Status | Single select | Active, Inactive, Prospect |
| Country | Single line text | Primary country of operation |
| Market_Focus | Long text | Pipe-separated industries this reseller targets |
| White_Label | Checkbox | True if operating under their own brand |
| Primary_Contact | Single line text | Main contact person's name |
| Website | URL | Reseller's own website |
| Notes | Long text | Context, history, deal terms |

**Valid Type values:** Agency, Freelancer, Distributor
**Valid Status values:** Active, Inactive, Prospect

**Relationships:**
- 1 Reseller -> N Projects (linked from Projects.Reseller)

---

### 13. Shop Products

**File:** `13-shop-products.csv`
**Purpose:** Commercial SKUs — niche-specific presentations of core products. A Yoga Instructor website and a Personal Trainer website are both backed by the same core product but sold as distinct SKUs with tailored copy and landing pages.

| Field | Type | Notes |
|-------|------|-------|
| Name | Single line text | Niche-specific product name. E.g. "Yoga Instructor" |
| Slug | Single line text | URL-safe. E.g. "yoga-instructor" |
| Category | Single select | Niche grouping: Art, Design, Health and Wellness, E-Commerce, Personal, Corporate, Professional, Events, Home & Deco, Services, Crafts, Standard Web App, Petite Website |
| Resume | Long text | Short description targeting the specific niche |
| Core_Product | Single line text | Foreign key -> Products.Slug (which product powers this SKU) |
| Price_USD | Currency | Monthly price in USD. Denormalized from Core_Product for display without joins |
| Landing_Slug | Single line text | URL path for the public landing page. E.g. /sitios-web/yoga-instructor |
| Status | Single select | Draft, Published, Archived |

**Valid Status values:** Draft, Published, Archived

**Relationships:**
- N Shop Products -> 1 Product (via Core_Product -> Products.Slug)
- 1 Shop Product -> 1 Shop Product Copy (via Slug)

---

### 14. Shop Product Copy

**File:** `14-shop-product-copy.csv`
**Purpose:** AI-generated sales copy for each of the 118 shop product SKUs. Separate from Shop Products for the same reason Product Copy is separate from Products: marketing and config are different concerns.

| Field | Type | Notes |
|-------|------|-------|
| Slug | Single line text | Foreign key -> Shop_Products.Slug |
| Name | Single line text | Denormalized for readability |
| Category | Single select | Denormalized for filtering |
| Core_Product | Single line text | Denormalized FK -> Products.Slug |
| Headline | Single line text | Max 12 words, value proposition |
| Subheadline | Long text | Max 28 words, expanding on headline |
| Target_Persona | Long text | Who this product is for |
| Pain_Points | Long text | 3 problems, pipe-separated with \| |
| Value_Props | Long text | 3 benefits, pipe-separated with \| |
| CTA_Primary | Single line text | Button text, max 5 words |
| Keywords | Long text | 5 SEO terms, pipe-separated with \| |

**Note:** Landing_Slug was moved to Shop_Products table (it is operational data, not copy).

**Relationships:**
- 1 Shop Product Copy -> 1 Shop Product (via Slug)

---

## Relationship Map

```
Industries (9 rows)
  |
  +--[1:N]--> Products (29 rows)
                |
                +--[1:1]--> Product_Copy (8 rows, grows to 29)
                |
                +--[1:N]--> Shop Products (118 rows)
                |               |
                |               +--[1:1]--> Shop Product Copy (118 rows, AI-generated)
                |
                +--[1:N]--> Projects (97 rows)
                              |
                              +--[1:1]--> Subscriptions (18 rows for active)
                              |
                              +--[N:N]--> Contacts (10 rows)
                              |
                              +--[N:1]--> Resellers (1 row, grows)

Module Bundles (10 rows)
  |
  +--[1:N]--> Products

Templates (16 rows)
  |
  +--[1:N]--> Products
  +--[1:N]--> Projects

Modules (12 rows)
  |
  +--[1:N]--> Module_Guides (15 rows)
  +--[referenced in]--> Module_Bundles.Modules (text field)
  +--[referenced in]--> Products.Modules_Override (text field)
```

---

## Airtable Import Notes

### Field Types to Set Manually After Import

Airtable will import all fields as Single line text. After importing CSVs, change these fields:

| Table | Field | Airtable Type |
|-------|-------|---------------|
| Industries | Priority | Number |
| Industries | Status | Single select |
| Modules | Category | Single select |
| Modules | Type | Single select |
| Modules | Status | Single select |
| Module Bundles | Tier | Single select |
| Module Bundles | Module_Count | Number |
| Module Bundles | Base_Price_USD | Currency |
| Templates | Status | Single select |
| Products | Tier | Single select |
| Products | Price_USD | Currency |
| Products | Catalog_Status | Single select |
| Products | Dev_Status | Single select |
| Products | Env_Status | Single select |
| Product Copy | Copy_Status | Single select |
| Projects | Status | Single select |
| Projects | Env_Status | Single select |
| Projects | Created | Date |
| Projects | Launched | Date |
| Subscriptions | Plan | Single select |
| Subscriptions | Amount_USD | Currency |
| Subscriptions | Currency | Single select |
| Subscriptions | Billing_Start | Date |
| Subscriptions | Last_Payment_Date | Date |
| Subscriptions | Next_Billing_Date | Date |
| Subscriptions | Auto_Renew | Checkbox |
| Subscriptions | Status | Single select |
| Subscriptions | Payment_Method | Single select |
| Contacts | Is_Internal | Checkbox |
| Contacts | Email | Email |
| Contacts | Phone | Phone |
| Module Guides | Type | Single select |
| Projects | Pipeline_Status | Single select |
| Resellers | White_Label | Checkbox |
| Resellers | Type | Single select |
| Resellers | Status | Single select |
| Shop Products | Category | Single select |
| Shop Products | Status | Single select |

### Linked Record Fields to Set After Import

After all tables are imported, create linked record fields for:

| Table | Field | Links To |
|-------|-------|----------|
| Products | Industry | Industries |
| Products | Module_Bundle | Module Bundles |
| Products | Template | Templates |
| Products | Reference_Project | Projects |
| Projects | Product | Products |
| Projects | Template | Templates |
| Projects | Contacts | Contacts |
| Projects | Reseller | Resellers |
| Subscriptions | Project | Projects |

### Import Order

Import tables in this order to avoid broken links (though Airtable creates links after the fact):

1. Industries
2. Modules
3. Module Bundles
4. Templates
5. Resellers
6. Clients
7. Products
8. Product Copy
9. Shop Products
10. Shop Product Copy
11. Projects
12. Subscriptions
13. Contacts
14. Module Guides

---

## File Index

| File | Table | Rows | Status |
|------|-------|------|--------|
| 01-industries.csv | Industries | 9 | Ready |
| 02-modules.csv | Modules | 12 | Ready |
| 03-module-bundles.csv | Module Bundles | 10 | Ready |
| 04-templates.csv | Templates | 16 | Ready |
| 05-clients.csv | Clients | 94 | Ready |
| 06-products.csv | Products | 29 | Ready |
| 07-product-copy.csv | Product Copy | 8 | Ready (partial, 8/29) |
| 08-projects.csv | Projects | 97 | Ready |
| 09-subscriptions.csv | Subscriptions | 18 | Ready |
| 10-contacts.csv | Contacts | 10 | Ready |
| 11-module-guides.csv | Module Guides | 15 | Ready |
| 12-resellers.csv | Resellers | 1 | Ready |
| 13-shop-products.csv | Shop Products | 118 | Ready |
| 14-shop-product-copy.csv | Shop Product Copy | 118 | Ready |

**Note:** File 05 (Module Aliases) is reserved for a future table that maps module names to industry-specific terminology (e.g., Blog -> "Guia del Inversor" in Real Estate). Not included in this release.

**Note on 06-products.csv:** The `Implementation_Time` column exists in the CSV but is not listed in the schema above — it's informational and does not need a linked record or special Airtable type.

---

---

## Post-Import Setup Guide (Airtable)

Después de importar todos los CSVs como tablas separadas en Airtable, seguí este proceso en orden. Airtable importa todo como texto — estas configuraciones activan la inteligencia real del schema.

### Paso 1 — Cambiar tipos de campo

Airtable importa todo como "Single line text". Cambiá manualmente en cada tabla:

**Campos numéricos y moneda:**
- Module Bundles → `Base_Price_USD` = Currency (USD)
- Module Bundles → `Module_Count` = Number
- Products → `Price_USD` = Currency (USD)
- Shop Products → `Price_USD` = Currency (USD)
- Subscriptions → `Amount_USD` = Currency (USD)
- Industries → `Priority` = Number

**Single Select** (usar exactamente los valores de las notas del schema):
- Industries → `Status` (Active, Coming Soon)
- Modules → `Category`, `Type`, `Status`
- Module Bundles → `Tier`
- Templates → `Status`
- Products → `Tier`, `Catalog_Status`, `Dev_Status`, `Env_Status`
- Product Copy → `Copy_Status`
- Shop Products → `Category`, `Status`
- Projects → `Pipeline_Status`, `Env_Status`
- Clients → `Type`, `Status`
- Resellers → `Type`, `Status`
- Subscriptions → `Plan`, `Status`, `Payment_Method`, `Currency`
- Module Guides → `Type`

**Checkbox:**
- Resellers → `White_Label`
- Contacts → `Is_Internal`
- Subscriptions → `Auto_Renew`

**Date:**
- Projects → `Launched`
- Subscriptions → `Billing_Start`, `Last_Payment_Date`, `Next_Billing_Date`

**Email / Phone / URL:**
- Contacts → `Email` (Email), `Phone` (Phone)
- Products → `Demo_URL`, `Repository` (URL)
- Shop Products → `Landing_Slug` puede quedar como text (es un path, no URL completa)

---

### Paso 2 — Crear Linked Record fields

Este paso conecta las tablas entre sí. Hacé esto en el orden indicado:

| Tabla origen | Campo | Tabla destino | Notas |
|---|---|---|---|
| Products | Industry | Industries | Matchear por nombre |
| Products | Module_Bundle | Module Bundles | Matchear por slug |
| Products | Template | Templates | Matchear por slug |
| Shop Products | Core_Product | Products | Matchear por slug |
| Projects | Product | Products | Matchear por slug |
| Projects | Template | Templates | Matchear por slug |
| Projects | Client | Clients | Matchear por nombre |
| Projects | Reseller | Resellers | Matchear por nombre |
| Clients | Reseller | Resellers | Matchear por nombre |
| Subscriptions | Project | Projects | Matchear por nombre |
| Contacts | Projects | Projects | Matchear por nombre |
| Module Guides | Module_Slug | Modules | Matchear por slug |

> En Airtable: campo → "Linked record" → elegir tabla → usar "Match field" para que asigne automáticamente.

---

### Paso 3 — Agregar Lookup fields (los que muestran datos de tablas relacionadas)

Una vez que los Linked Records están configurados, podés agregar Lookup fields para ver datos sin salir de la tabla:

| Tabla | Lookup field | Desde | Trae |
|---|---|---|---|
| Shop Products | Industry | Core_Product → Products | Industry de la Industry |
| Shop Products | Core_Product_Name | Core_Product → Products | Name del producto base |
| Projects | Industry | Product → Products | Industry del producto |
| Projects | Price_USD | Product → Products | Precio mensual |
| Projects | Module_Bundle | Product → Products | Bundle del producto |
| Clients | Project_Count | Projects | Fórmula: COUNT(Projects) |
| Subscriptions | Pipeline_Status | Project → Projects | Estado del proyecto |

---

### Paso 4 — Configurar Vistas clave

Estas son las vistas que vas a usar a diario. Crear una vez, usar siempre:

**En Projects:**
- `Pipeline Board` → Kanban agrupado por `Pipeline_Status`
- `Activos` → Filtro: Pipeline_Status = Active
- `En Desarrollo` → Filtro: Pipeline_Status = On Development OR Approval
- `Por Reseller` → Agrupado por Reseller

**En Shop Products:**
- `Por Categoría` → Agrupado por Category
- `Por Precio` → Ordenado por Price_USD
- `Published` → Filtro: Status = Published

**En Clients:**
- `CRM Board` → Kanban agrupado por Status
- `Prospects` → Filtro: Status = Prospect
- `Por Industry` → Agrupado por Industry

**En Products:**
- `Catalog` → Filtro: Catalog_Status = Published
- `En Desarrollo` → Filtro: Dev_Status = In Progress

---

### Paso 5 — Configurar vistas para Compania Digital (reseller view)

La Compañía Digital necesita ver SUS proyectos y clientes. Crear estas vistas con filtro permanente:

- Projects → `CD View` → Filtro: Reseller = "Compania Digital"
- Clients → `CD Clients` → Filtro: Reseller = "Compania Digital"
- Subscriptions → `CD Subs` → Filtro: Project.Reseller = "Compania Digital"

Cuando se agreguen más resellers, duplicar estas vistas y cambiar el filtro.

---

## Design Decisions

### Why Products and Product_Copy are separate tables

Products holds operational config: which modules, which template, which bundle, pricing, dev status, URLs. This data changes when a developer provisions a new server or updates a template.

Product_Copy holds marketing content: taglines, personas, pain points. This changes when a copywriter refines messaging or A/B tests headlines. Keeping them separate allows each function (dev vs. marketing) to own their data without stepping on each other.

### Why Modules_Override exists in Products

Module Bundles define ideal combinations. Products customize them per industry. Rather than creating a new bundle for every edge case, `Modules_Override` records the actual deployed set. The bundle remains the billing/pricing reference; the override is the technical truth.

### Why Template is in both Products and Projects

Products define the default template for that solution. Projects may legitimately use a different template if a client requested a visual change without a full product switch. Both references are kept for traceability.

### Subscriptions as a separate table

Subscriptions are not 1:1 with projects over time. A project may have had multiple billing cycles, plan changes, or payment method switches. Keeping subscriptions separate allows future expansion to billing history without modifying the Projects table.
