Skip to main content

Brand Propagation

Brand Propagation pushes your brand identity (colors, logo URLs, typography) to every connected One Stack product so they render with your branding automatically. When you update a brand and propagate, PSA invoices, CRM emails, Portal themes, and Relay email headers all update in sync.

How Propagation Works

When you trigger propagation, Brand:

  1. Emits a brand.updated event on The One Bus
  2. Each connected product receives the event and fetches the latest brand data from the Brand API
  3. Products update their cached brand values (colors, logo URLs, CSS variables)
  4. The propagation record is updated with per-product success/failure status

Propagation runs asynchronously — most products update within 30 seconds. The status panel shows real-time progress.

Triggering Propagation

Manual Propagation

  1. Open a brand in the Brand Library
  2. Click Propagate to Stack
  3. In the propagation dialog, select which products to update:
    • All Products — Update every connected product
    • Select Products — Check individual products to target
  4. Click Propagate
  5. The status panel opens automatically and shows progress per product

Automatic Propagation

Propagation is triggered automatically when:

  • You finalize a brand in the AI Wizard (propagates to all products)
  • The Propagate Changes banner is shown after editing brand settings and you click it
  • A Mission organization is created (their brand is auto-provisioned and propagated)

Products That Receive Brand Data

ProductWhat Updates
PSAInvoice header logo, email footer, portal color scheme
CRMContact email signature headers, branded email templates
BooksInvoice PDF header and footer, statement branding
PortalClient portal theme (primary color, logo, favicon)
RelayEmail header HTML, email footer HTML
Security (Defend)Branded alert emails
RMMBranded client reports
VoiceVoicemail greeting page branding
AI StudioUI color scheme for white-labeled AI interfaces
ProjectsBranded project summary reports
CollectiveCommunity page branding (if white-labeled)
LegalContract headers and footers
PeopleHR communication email headers
AMSBranded account statements
MissionOrganization page theme

Propagation Status

After triggering propagation, view the status panel:

StatusMeaning
PendingEvent emitted; product has not yet responded
SuccessProduct updated successfully
FailedProduct returned an error — expand for details
SkippedProduct not connected or not entitlement-active

To view historical propagation records:

  1. Open a brand → click the History tab
  2. Each propagation event shows timestamp, triggered-by, target products, and per-product status

What Brand Data Is Propagated

When a product receives the brand event, it fetches these values from the Brand API:

{
"brand_id": "...",
"name": "Acme IT Services",
"tagline": "Technology that works for you",
"colors": {
"primary": "#0F4C81",
"secondary": "#1A6DB5",
"accent": "#F59E0B",
"background": "#FFFFFF",
"text": "#111827"
},
"typography": {
"heading_font": "Inter",
"body_font": "DM Sans"
},
"assets": {
"logo_primary": "https://brand.theonefamily.io/assets/...",
"logo_monochrome": "https://brand.theonefamily.io/assets/...",
"logo_reversed": "https://brand.theonefamily.io/assets/...",
"logo_icon": "https://brand.theonefamily.io/assets/...",
"favicon": "https://brand.theonefamily.io/assets/..."
},
"css_variables": "--brand-primary: #0F4C81; --brand-secondary: ..."
}

CSS Variables

Products can consume brand colors as CSS custom properties. The CSS variables endpoint returns a ready-to-use string:

--brand-primary: #0F4C81;
--brand-secondary: #1A6DB5;
--brand-accent: #F59E0B;
--brand-background: #FFFFFF;
--brand-text: #111827;

This string is injected into the <head> of branded pages so all UI components reference var(--brand-primary) instead of hard-coded values.

Client Brand Propagation

Client brands propagate only to client-specific contexts, not to your entire organization:

  • Portal: The client's branded Portal uses their client brand (colors, logo, favicon)
  • PSA: Client invoices use the client brand's logo and colors
  • CRM: Client contact emails use the client brand's email header

If no client brand is set, products fall back to your primary (own) brand.

Service-to-Service Brand API

Other products fetch brand data on-demand via the Brand propagation API:

GET /api/brand/active?tenant_id={id}
Authorization: X-Integration-Key: {key}

Products cache the response using ETag-based conditional requests — only fetching the full brand data when it has changed. This keeps brand data fresh without constant polling.

Troubleshooting Propagation

A product still shows the old brand after propagation

  1. Check the propagation status panel — confirm the product shows "Success" not "Pending" or "Failed"
  2. If "Failed", look at the error detail and check that the product's integration key is valid
  3. Hard refresh the product's page (Ctrl+Shift+R) — the browser may be caching the old values
  4. If the product is not listed in the status panel, the integration may not be configured — check the product's settings for a Brand integration toggle

The Portal still shows the default blue after propagation

  • Portal caches the brand CSS for up to 5 minutes — wait and refresh
  • Check that the Portal product has a valid BRAND_API_URL and INTEGRATION_KEY configured in its settings

Propagation succeeded but emails still show the old logo

  • Email clients cache images aggressively. New emails will use the new logo; old emails in recipients' inboxes will not update
  • If Relay templates have a hard-coded logo URL, update them in the Relay Templates section