Skip to content

ImagLend — Enrutamiento y URLs de la Console Publica

Proposito

Define como se resuelven las URLs publicas de la console publica (imagy-console-public) considerando tenants, organizaciones, productos y dominios custom. El enrutamiento determina que landing page mostrar, que producto ofrecer y a que organizacion asociar las solicitudes.

Estructura de URLs

Patron Base

{org}.{tenant}.reimaginetech.io/{path}

URLs por Nivel

NivelURLResolucion
Tenant sin orgfintech-abc.reimaginetech.io/credito/microcredito-30dTenant: fintech-abc, Org: ninguna, Producto: microcredito-30d
Tenant con orgdigital.fintech-abc.reimaginetech.io/credito/microcredito-30dTenant: fintech-abc, Org: digital, Producto: microcredito-30d
Dominio customcredito.miempresa.com/microcredito-30dResuelve tenant + org desde tabla tenant_domains
Dominio custom con orgcanal-digital.miempresa.com/microcredito-30dResuelve tenant + org desde tabla tenant_domains

Rutas Internas de la App

RutaComponenteDescripcion
/LandingHomePagina principal del tenant/org (lista de productos o landing default)
/credito/{product_code}ProductLandingLanding page del producto con simulador
/solicitud/{access_token}WizardAppWizard de originacion (6 pasos)
/solicitud/{access_token}/paso/{step}WizardStepPaso especifico del wizard
/validar/{flow_token}FlowExecutionEjecucion de flujo ImagFlow
/firmar/{signing_token}SigningPagePagina de firma ImagSign

Resolucion de Contexto

Flujo de Resolucion

Implementacion en Frontend (TenantResolver)

typescript
interface PublicContext {
  tenantCode: string;
  tenantId: string;
  organizationCode: string | null;
  organizationId: string | null;
  theme: ThemeConfig;
  availableProducts: ProductSummary[];
}

function resolvePublicContext(): PublicContext {
  const hostname = window.location.hostname;

  // 1. Dominio custom: resolver via API
  if (!hostname.endsWith('.reimaginetech.io')) {
    return fetchContextFromDomain(hostname);
  }

  // 2. Parsear patron: {org}.{tenant}.reimaginetech.io
  const parts = hostname.replace('.reimaginetech.io', '').split('.');

  if (parts.length === 2) {
    // org.tenant
    return { tenantCode: parts[1], organizationCode: parts[0] };
  }

  if (parts.length === 1) {
    // solo tenant
    return { tenantCode: parts[0], organizationCode: null };
  }

  throw new Error('URL format not recognized');
}

API de Resolucion de Contexto

GET /api/v1/public/context?hostname={hostname}

Retorna:

json
{
  "data": {
    "tenant_id": "uuid",
    "tenant_code": "fintech-abc",
    "tenant_name": "Fintech ABC",
    "organization_id": "uuid",
    "organization_code": "digital",
    "organization_name": "Canal Digital",
    "theme": {
      "logo_url": "https://cdn.reimaginetech.io/tenants/uuid/logo.svg",
      "primary_color": "#7C3AED",
      "secondary_color": "#F59E0B",
      "font_family": "Inter"
    },
    "available_products": [
      { "code": "microcredito-30d", "name": "Microcredito 30 dias", "has_landing": true },
      { "code": "consumo-180d", "name": "Credito Consumo", "has_landing": true }
    ],
    "locale": "es",
    "features": {
      "multi_product_landing": true,
      "app_store_links": false
    }
  }
}

Organizaciones y Productos

Asignacion de Productos por Organizacion

Un producto puede estar asignado a:

  • Todo el tenant (disponible para todas las organizaciones)
  • Una organizacion especifica (solo visible en esa org)

Impacto en la Landing

EscenarioProductos visiblesLanding
URL sin orgTodos los productos del tenantLanding general del tenant
URL con orgProductos del tenant + productos exclusivos de la orgLanding de la org (si existe) o del tenant
Org sin landing propiaHereda landing del tenant con filtro de productosMisma landing, productos filtrados
Org con landing propiaSolo productos asignados a la orgLanding personalizada de la org

Branding por Organizacion

Las organizaciones pueden tener su propio sub-tema que override el tema del tenant:

json
{
  "organization_theme_override": {
    "logo_url": "https://cdn.reimaginetech.io/tenants/uuid/orgs/digital/logo.svg",
    "primary_color": "#2563EB",
    "tagline": "Tu credito digital al instante"
  }
}

Prioridad de resolucion del tema:

  1. Override de la organizacion (si existe)
  2. Tema del tenant (ThemeConfiguration activo)
  3. Tema default de la plataforma (fallback)

Solicitudes y Trazabilidad

Cuando un usuario crea una solicitud desde una URL con organizacion:

json
{
  "credit_application": {
    "tenant_id": "uuid-fintech-abc",
    "organization_id": "uuid-canal-digital",
    "origin": {
      "type": "flow",
      "channel": "digital",
      "organization_code": "digital",
      "landing_url": "digital.fintech-abc.reimaginetech.io/credito/microcredito-30d",
      "referrer": "https://google.com"
    }
  }
}

Esto permite:

  • Saber de que organizacion vino cada solicitud
  • Reportes por organizacion (conversion, volumen)
  • Comisiones por canal (si aplica reventa)
  • Filtrar solicitudes por organizacion en el panel admin

Dominios Custom por Organizacion

Cada organizacion puede tener su propio dominio custom:

OrganizacionDominio customResolucion
Canal Digitalcredito-digital.fintech-abc.comtenant: fintech-abc, org: digital
Aliado Comercialprestamos.aliado.comtenant: fintech-abc, org: aliado-comercial
Sin orgcredito.fintech-abc.comtenant: fintech-abc, org: null

La tabla tenant_domains soporta esto con un campo organization_id opcional:

sql
ALTER TABLE tenant_domains ADD COLUMN organization_id UUID REFERENCES organizations(id);

Caso de Uso: Reventa

Un tenant (empresa financiera) tiene aliados comerciales que revenden sus productos de credito. Cada aliado es una organizacion con:

  • Su propio dominio (prestamos.aliado.com)
  • Su propio branding (logo y colores del aliado)
  • Productos especificos asignados (con condiciones diferentes)
  • Comisiones por solicitud originada

El usuario final ve la marca del aliado, no la del tenant ni la de Imagy. La trazabilidad permite al tenant saber cuantas solicitudes origino cada aliado.

Reglas

  • Si la URL tiene organizacion, la solicitud se asocia a esa organizacion
  • Si la URL no tiene organizacion, la solicitud se asocia solo al tenant
  • Los productos filtrados dependen de la organizacion resuelta
  • El tema se resuelve con prioridad: org override > tenant theme > platform default
  • Los dominios custom pueden apuntar a tenant o a tenant+org
  • El cache de resolucion tiene TTL de 5 minutos
  • Si el hostname no se puede resolver, se muestra pagina 404 generica

Reimagine Tech LLC — Documentacion Interna