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:
- Emits a
brand.updatedevent on The One Bus - Each connected product receives the event and fetches the latest brand data from the Brand API
- Products update their cached brand values (colors, logo URLs, CSS variables)
- 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
- Open a brand in the Brand Library
- Click Propagate to Stack
- In the propagation dialog, select which products to update:
- All Products — Update every connected product
- Select Products — Check individual products to target
- Click Propagate
- 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
| Product | What Updates |
|---|---|
| PSA | Invoice header logo, email footer, portal color scheme |
| CRM | Contact email signature headers, branded email templates |
| Books | Invoice PDF header and footer, statement branding |
| Portal | Client portal theme (primary color, logo, favicon) |
| Relay | Email header HTML, email footer HTML |
| Security (Defend) | Branded alert emails |
| RMM | Branded client reports |
| Voice | Voicemail greeting page branding |
| AI Studio | UI color scheme for white-labeled AI interfaces |
| Projects | Branded project summary reports |
| Collective | Community page branding (if white-labeled) |
| Legal | Contract headers and footers |
| People | HR communication email headers |
| AMS | Branded account statements |
| Mission | Organization page theme |
Propagation Status
After triggering propagation, view the status panel:
| Status | Meaning |
|---|---|
| Pending | Event emitted; product has not yet responded |
| Success | Product updated successfully |
| Failed | Product returned an error — expand for details |
| Skipped | Product not connected or not entitlement-active |
To view historical propagation records:
- Open a brand → click the History tab
- 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
- Check the propagation status panel — confirm the product shows "Success" not "Pending" or "Failed"
- If "Failed", look at the error detail and check that the product's integration key is valid
- Hard refresh the product's page (Ctrl+Shift+R) — the browser may be caching the old values
- 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_URLandINTEGRATION_KEYconfigured 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