Skip to main content
SYNTIweb provides comprehensive branding capabilities through the TenantCustomization model, allowing tenants to personalize their site with logos, hero images, and custom content.

Logo Management

Logo Field

The tenant logo is stored in tenant_customization.logo_filename:
// TenantCustomization.php:24-26
protected $fillable = [
    'tenant_id',
    'logo_filename',
    // ...
];

Logo Storage

Field: logo_filename
Type: string|null
Storage: File storage system (local or cloud)
Usage: Site header, footer, and meta tags

Logo Best Practices

  • Width: 200-400px
  • Height: 60-120px
  • File size: Under 200KB
  • Aspect ratio: 2:1 to 4:1 (landscape orientation)
  • High contrast against both light and dark backgrounds
  • Readable at small sizes (mobile)
  • Optimized for web (compressed)

Hero Images

Hero Image System

SYNTIweb supports 3 hero images for different layouts and variations:
// TenantCustomization.php:27-30
protected $fillable = [
    // ...
    'hero_main_filename',
    'hero_secondary_filename',
    'hero_tertiary_filename',
    'hero_layout',
    // ...
];

Main Hero

Field: hero_main_filename
Usage: Primary hero background or featured image

Secondary Hero

Field: hero_secondary_filename
Usage: Split layouts, galleries, or alternate views

Tertiary Hero

Field: hero_tertiary_filename
Usage: Multi-image carousels or triple-split layouts

Hero Layout Options

// TenantCustomization.php:134 (default config)
'hero' => ['variant' => 'fullscreen', 'visible' => true]
The hero_layout field stores the selected layout variant. Common variants include:
Full-height hero with background image and centered text overlay
<section class="hero-fullscreen">
  <img src="{{ hero_main_filename }}" />
  <div class="overlay">{{ hero_title }}</div>
</section>

Hero Image Specifications

Performance Critical: Hero images are above-the-fold content. Optimization is essential for fast page loads.
  • Fullscreen: 1920x1080px (16:9)
  • Split layout: 1200x800px (3:2)
  • Mobile: 800x600px (4:3)
  • Use responsive images with multiple sizes
  • WebP (modern browsers) - Best compression
  • JPEG (fallback) - Quality 80-85%
  • PNG only if transparency needed
  • Max file size: 500KB (compressed)
  • Use lazy loading for secondary/tertiary
  • Implement srcset for responsive delivery
  • Consider CDN for faster delivery

Business Information

Tenant Model Fields

Core business information is stored in the Tenant model:
// Tenant.php:22-54
protected $fillable = [
    // Identity
    'business_name',
    'business_segment',
    'slogan',
    'description',
    
    // Contact
    'phone',
    'whatsapp_sales',
    'whatsapp_support',
    'email',
    
    // Location
    'address',
    'city',
    'country',
    
    // Operations
    'business_hours',
    'is_open',
    
    // SEO
    'meta_title',
    'meta_description',
    'meta_keywords',
    
    // Settings
    'currency_display',
    'whatsapp_active',
];

Business Name

Field: business_name
Type: string
Used in: Site title, header, footer, SEO

Slogan

Field: slogan
Type: string|null
Used in: Hero subtitle, meta description fallback

Description

Field: description
Type: text|null
Used in: About section, hero subtitle, meta tags

Business Segment

Field: business_segment
Type: string
Used in: Blueprint selection, categorization

Business Hours Schema

// Tenant.php:65 (casts)
'business_hours' => 'array',
'is_open' => 'boolean',
Stored as JSON with this structure:
{
  "monday": {"open": "09:00", "close": "18:00", "closed": false},
  "tuesday": {"open": "09:00", "close": "18:00", "closed": false},
  "wednesday": {"open": "09:00", "close": "18:00", "closed": false},
  "thursday": {"open": "09:00", "close": "18:00", "closed": false},
  "friday": {"open": "09:00", "close": "18:00", "closed": false},
  "saturday": {"open": "10:00", "close": "14:00", "closed": false},
  "sunday": {"open": null, "close": null, "closed": true}
}
The is_open boolean acts as a manual override (e.g., for holidays or temporary closures).

Content Blocks

Content Blocks System

Custom content is stored in tenant_customization.content_blocks as JSON:
// TenantCustomization.php:40, 58
protected $fillable = [
    // ...
    'content_blocks',
];

protected function casts(): array
{
    return [
        'content_blocks' => 'array',
        // ...
    ];
}

Content Block Structure

{
  "hero": {
    "title": "Bienvenido a Mi Negocio",
    "subtitle": "Servicios de calidad desde 2010"
  },
  "about": {
    "title": "Nuestra Historia",
    "text": "Somos una empresa familiar..."
  },
  "products": {
    "title": "Nuestros Productos",
    "subtitle": "La mejor selección del mercado"
  },
  "contact": {
    "title": "Contáctanos",
    "subtitle": "Estamos aquí para ayudarte"
  }
}

Content Helper Methods

// TenantCustomization.php:257-309

// Generic content block getter
public function getContentBlock(string $section, string $key, mixed $default = null): mixed
{
    return data_get($this->content_blocks, "{$section}.{$key}", $default);
}

// Hero title: content_blocks > tenant slogan
public function getHeroTitle(): ?string
{
    return $this->getContentBlock('hero', 'title')
        ?? $this->tenant->slogan
        ?? null;
}

// Hero subtitle / description
public function getHeroSubtitle(): ?string
{
    $subtitle = $this->getContentBlock('hero', 'subtitle');
    return ($subtitle !== null && $subtitle !== '') ? $subtitle : null;
}

// About section text: about_text column > content_blocks
public function getAboutText(): ?string
{
    return $this->about_text
        ?? $this->getContentBlock('about', 'text')
        ?? null;
}

// Section heading with fallback
public function getSectionTitle(string $section, string $default): string
{
    return $this->getContentBlock($section, 'title') ?: $default;
}

// Section subtitle (nullable)
public function getSectionSubtitle(string $section): ?string
{
    $v = $this->getContentBlock($section, 'subtitle');
    return ($v !== null && $v !== '') ? $v : null;
}
Content blocks follow a fallback hierarchy:
  1. Custom content_blocks value
  2. Direct field (e.g., about_text)
  3. Tenant field (e.g., tenant->slogan)
  4. Default value or null

About Section

About-Specific Fields

// TenantCustomization.php:41-42
protected $fillable = [
    // ...
    'about_text',
    'about_image_filename',
    // ...
];

About Text

Field: about_text
Type: text|null
Usage: Rich text content for About section
Falls back to content_blocks.about.text

About Image

Field: about_image_filename
Type: string|null
Usage: Image for About section (team photo, office, etc.)

About Section Configuration

// TenantCustomization.php:138 (default config)
'about' => [
    'variant' => 'split',    // split, centered, stacked
    'visible' => true,
    'border' => 'rounded',
    'effect' => 'none',
    'spacing' => 'normal'
]
The About section requires Plan 2 (CRECIMIENTO) or higher. See Sections for plan requirements.

Header Message

Announcement Bar

// TenantCustomization.php:43
protected $fillable = [
    // ...
    'header_message',
];

Header Message

Field: header_message
Type: string|null
Usage: Site-wide announcement bar above navigation
Examples:
  • “Envío gratis en compras mayores a $50”
  • “Nueva sucursal abierta en el centro”
  • “Black Friday: 40% de descuento”
Keep header messages short (under 100 characters) to avoid truncation on mobile devices.

Social Networks & Payment Methods

Social Networks

// TenantCustomization.php:32
protected $fillable = [
    // ...
    'social_networks',
];

// Casts to array
'social_networks' => 'array',
Stored as JSON array:
{
  "facebook": "https://facebook.com/mybusiness",
  "instagram": "@mybusiness",
  "twitter": "@mybusiness",
  "linkedin": "https://linkedin.com/company/mybusiness",
  "youtube": "https://youtube.com/@mybusiness",
  "tiktok": "@mybusiness"
}

Payment Methods

// TenantCustomization.php:33
'payment_methods' => 'array',
Stored as array of enabled payment methods:
[
  "cash",
  "credit_card",
  "debit_card",
  "bank_transfer",
  "paypal",
  "mercadopago",
  "stripe"
]
Payment methods are displayed in the Payment Methods section (Plan 1+). Icons are automatically matched to each method.

WhatsApp Integration

WhatsApp Configuration

// Tenant.php:33-35, 53
protected $fillable = [
    // ...
    'whatsapp_sales',
    'whatsapp_support',
    'whatsapp_active',  // 'sales' or 'support'
];

// Helper method
public function getActiveWhatsapp(): ?string
{
    return $this->whatsapp_active === 'support'
        ? $this->whatsapp_support
        : $this->whatsapp_sales;
}

Sales WhatsApp

Field: whatsapp_sales
Format: +1234567890
Usage: Product inquiries, orders

Support WhatsApp

Field: whatsapp_support
Format: +1234567890
Usage: Customer service, assistance
The whatsapp_active field determines which number is displayed in the floating WhatsApp button and contact sections.

Call-to-Action (CTA) Section

CTA Configuration

// TenantCustomization.php:35-38
protected $fillable = [
    // ...
    'cta_title',
    'cta_subtitle',
    'cta_button_text',
    'cta_button_link',
];
1

CTA Title

Main heading text (e.g., “Ready to Get Started?”)
'cta_title' => 'Agenda tu cita hoy'
2

CTA Subtitle

Supporting text (e.g., “Join thousands of happy customers”)
'cta_subtitle' => 'Primera consulta gratuita'
3

Button Text

Action text (e.g., “Sign Up Now”, “Contact Us”)
'cta_button_text' => 'Reservar Ahora'
4

Button Link

Target URL or WhatsApp link
'cta_button_link' => 'https://wa.me/1234567890?text=Hola'

CTA Default Configuration

// TenantCustomization.php:144
'cta' => [
    'variant' => 'centered',
    'visible' => true,
    'border' => 'rounded',
    'effect' => 'gradient',  // Visual gradient background
    'spacing' => 'airy'      // Extra padding
]
The CTA section is available in all plans (Plan 1+) and is often used as a conversion-focused element.

FAQ Items

FAQ Configuration

// TenantCustomization.php:34
protected $fillable = [
    // ...
    'faq_items',
];

'faq_items' => 'array',
Stored as JSON array of question-answer pairs:
[
  {
    "question": "¿Cuál es el horario de atención?",
    "answer": "Atendemos de lunes a viernes de 9:00 a 18:00 y sábados de 10:00 a 14:00."
  },
  {
    "question": "¿Hacen envíos a todo el país?",
    "answer": "Sí, realizamos envíos a nivel nacional con tiempo de entrega de 3-5 días hábiles."
  },
  {
    "question": "¿Aceptan devoluciones?",
    "answer": "Aceptamos devoluciones dentro de los 30 días posteriores a la compra con el producto en su empaque original."
  }
]
FAQ section requires Plan 3 (VISIÓN). It won’t display for lower-tier plans even if faq_items is populated.

Visual Effects

Visual Effects Configuration

// TenantCustomization.php:39, 57
protected $fillable = [
    // ...
    'visual_effects',
];

'visual_effects' => 'array',
Stores comprehensive visual settings:
{
  "sections_order": [
    {"name": "products", "visible": true, "order": 0}
  ],
  "sections_config": {
    "hero": {"variant": "fullscreen", "visible": true},
    "products": {"variant": "grid3", "border": "rounded", "effect": "none"}
  }
}
Visual effects are managed through the TenantCustomization model methods. See Sections for detailed configuration options.

Domain & SEO

Domain Configuration

// Tenant.php:25-28, 45-47
protected $fillable = [
    // ...
    'subdomain',
    'base_domain',
    'custom_domain',
    'domain_verified',
    
    'meta_title',
    'meta_description',
    'meta_keywords',
];

Subdomain

Field: subdomain
Format: mybusiness
Result: mybusiness.syntiweb.com

Custom Domain

Field: custom_domain
Format: www.mybusiness.com
Requires: Domain verification (domain_verified)

Meta Title

Field: meta_title
Length: 50-60 characters
Usage: <title> tag, search results

Meta Description

Field: meta_description
Length: 150-160 characters
Usage: Search result snippets
Custom domains require DNS verification. The domain_verified boolean tracks verification status.

Currency Display

// Tenant.php:43
'currency_display' => 'string',  // e.g., '$', 'USD', 'S/.', '€'
Used for formatting prices across the site:
{{ $tenant->currency_display }}{{ $product->price }}
// Output: $29.99

Complete Branding Checklist

1

Upload Logo

PNG with transparency, 200-400px wide, under 200KB
2

Configure Hero Images

1-3 images depending on layout, 1920x1080px, WebP format
3

Set Business Information

Name, slogan, description, contact details, hours
4

Customize Content Blocks

Hero title/subtitle, section headings, about text
5

Add Social Networks

Facebook, Instagram, Twitter, etc.
6

Configure Payment Methods

Enable accepted payment options
7

Set Up WhatsApp

Sales and support numbers with active selection
8

Create CTA Section

Title, subtitle, button text and link
9

Optimize SEO

Meta title, description, keywords

Verify Domain

Custom domain setup and DNS verification

Themes & Palettes

Color schemes and FlyonUI themes

Sections

Section ordering and configuration

Tenant Model

app/Models/Tenant.php

TenantCustomization Model

app/Models/TenantCustomization.php

Build docs developers (and LLMs) love