Skip to content

06 — Content Modeling (Umbraco)

PRD Document · Savoy Signature Hotels — Multi-Site Headless Platform
Version: 1.0 · Date: 2026-03-04
Related docs: 03_MultiSite_and_Domains.md, 07_Modules_and_Templates.md, A02_API_Contracts.md


This document defines the content type structure in Umbraco 17 for the Savoy Signature multi-site platform. It covers Document Types, Element Types (for modules), compositions, property editors, and the content tree hierarchy for all 8 sites.


Compositions (Mixins)

Document Types (Pages)

Element Types (Modules)

heroSlider

bookingBar

featuredCards

richTextBlock

imageGallery

formModule

...

siteRoot

homePage

contentPage

roomsListPage

roomDetailPage

diningListPage

diningDetailPage

wellnessPage

experiencesPage

experienceDetailPage

galleryPage

eventsPage

celebrationsPage

contactPage

newsListPage

newsDetailPage

faqPage

specialOffersPage

seoComposition

openGraphComposition

modulesComposition

navigationComposition

CategoryPurposeExample
Document TypesRepresent pages in the content tree; define URL structurehomePage, roomDetailPage
Element TypesRepresent reusable content blocks (modules) within pages; NOT pages themselvesheroSlider, bookingBar, richText
CompositionsShared property groups mixed into multiple Document/Element TypesseoComposition, openGraphComposition

The root node for each of the 8 sites. Stores site-wide configuration:

PropertyAliasTypeRequiredDescription
Site NamesiteNameTextstringDisplay name of the site
Site KeysiteKeyTextstringUnique key (savoy-palace, royal-savoy, etc.)
ThemethemeTextstringCSS theme identifier
LogologoMedia PickerSVG logo for header
Logo Alt (light)logoAltMedia PickerLight version for dark backgrounds
FaviconfaviconMedia PickerSite favicon
Default Meta TitledefaultMetaTitleTextstringFallback <title>
Default Meta DescriptiondefaultMetaDescriptionTextareaFallback meta description
Default OG ImagedefaultOgImageMedia PickerFallback Open Graph image
Synxis Hotel IDsynxisHotelIdTextstringFor booking redirect
Synxis Chain IDsynxisChainIdTextstringChain identifier
Navarino Hotel CodenavarinoHotelCodeTextstringCalendar widget config
Navarino API TokennavarinoApiTokenTextstringCalendar widget auth
GTM Container IDgtmContainerIdTextstringGoogle Tag Manager
Header NavigationheaderNavigationContent Picker (Multiple)Main menu items
Footer ConfigurationfooterConfigBlock ListFooter columns and links
Social Media LinkssocialLinksBlock ListSocial media URLs
Cookie Policy PagecookiePolicyPageContent PickerLink to cookie policy
Privacy Policy PageprivacyPolicyPageContent PickerLink to privacy policy

Allowed children: homePage

PropertyAliasTypeRequiredDescription
(inherits seoComposition)
(inherits openGraphComposition)
ModulesmodulesBlock ListPage content composed from Element Types

Allowed children: contentPage, roomsListPage, diningListPage, wellnessPage, experiencesPage, galleryPage, eventsPage, celebrationsPage, contactPage, newsListPage, specialOffersPage, faqPage

Generic content page with modular composition. Used for: About, Concept, Awards, Facilities, Destination, Services, Sustainability, Corporate pages, etc.

PropertyAliasTypeRequiredDescription
(inherits seoComposition)
(inherits openGraphComposition)
(inherits navigationComposition)
ModulesmodulesBlock ListPage content from modules

Allowed children: contentPage (allows nesting)

PropertyAliasTypeRequiredDescription
(inherits seoComposition)
TitletitleTextstringPage heading
IntroductionintroductionRich TextIntro text
Filter by CategoryfilterByCategoryToggleEnable category filtering

Allowed children: roomDetailPage

PropertyAliasTypeRequiredDescription
(inherits seoComposition)
(inherits openGraphComposition)
(inherits responsiveImageComposition)Featured image (desktop + mobile)
Room NameroomNameTextstringName of the room/suite
CategoryroomCategoryDropdownRoom, Suite, Villa, etc.
Short DescriptionshortDescriptionTextareaCard description
Full DescriptionfullDescriptionRich TextDetailed description
GallerygalleryBlock List (responsiveImageItem)Room photos (each with desktop + mobile)
Size (sqm)sizeNumericRoom area
Max GuestsmaxGuestsNumericMaximum occupancy
ViewviewTextstringSea view, garden view, etc.
AmenitiesamenitiesBlock ListList of amenity items
Floor PlanfloorPlanMedia PickerFloor plan image
Booking CTAbookingCtaToggleShow booking button (default: true)
ModulesmodulesBlock ListAdditional modules below main content
PropertyAliasTypeRequired
(inherits seoComposition)
TitletitleTextstring
IntroductionintroductionRich Text

Allowed children: diningDetailPage

PropertyAliasTypeRequiredDescription
(inherits seoComposition)
(inherits openGraphComposition)
Restaurant NamerestaurantNameTextstring
Cuisine TypecuisineTypeTextstringe.g., “Mediterranean”, “Asian Fusion”
Short DescriptionshortDescriptionTextareaCard description
Full DescriptionfullDescriptionRich Text
GallerygalleryBlock List (responsiveImageItem)Each item has desktop + mobile image
Menu PDFmenuPdfMedia PickerDownloadable menu
Opening HoursopeningHoursBlock ListDay/time blocks
Dress CodedressCodeTextstring
Reservations RequiredreservationsRequiredToggle
Location/FloorlocationTextstringe.g., “16th Floor”
ModulesmodulesBlock List

For SPA & Wellness sections. Inherits seoComposition, modulesComposition. Contains: title, introduction, gallery, treatments list (Block List), opening hours.

For experiences and activities. List page with filtering; detail page with description, gallery, duration, pricing, booking info.

Full-screen photo gallery. Properties: title, gallery albums (Block List of albums, each with title + media picker multiple).

Events listing. Properties: title, introduction, and child event items with dates, venue, description.

Weddings & Celebrations, Meetings & Incentives. Properties: title, introduction, modules, venue options (Block List).

Contact form + map. Properties: title, introduction, address, phone, email, map coordinates, form configuration, modules.

News/blog section. List with pagination; detail with title, date, author, body (Rich Text), featured image, tags.

Promotional offers. Properties: title, introduction, child offer items with validity dates, description, conditions, CTA.

FAQ section. Properties: title, FAQ items (Block List of question/answer pairs).


Applied to all pages that need custom SEO settings:

PropertyAliasTypeRequiredDescription
Meta TitlemetaTitleTextstringOverrides page title in <title>
Meta DescriptionmetaDescriptionTextarea<meta name="description">
Meta KeywordsmetaKeywordsTagsFor reference only (not used by search engines)
No IndexnoIndexToggleAdd <meta name="robots" content="noindex">
No FollownoFollowToggleAdd nofollow to robots meta
Canonical URLcanonicalUrlTextstringOverride canonical URL

4.2 Open Graph Composition (openGraphComposition)

Section titled “4.2 Open Graph Composition (openGraphComposition)”
PropertyAliasTypeRequired
OG TitleogTitleTextstring
OG DescriptionogDescriptionTextarea
OG ImageogImageMedia Picker
OG TypeogTypeDropdown
Twitter Card TypetwitterCardTypeDropdown

4.3 Navigation Composition (navigationComposition)

Section titled “4.3 Navigation Composition (navigationComposition)”
PropertyAliasTypeRequiredDescription
Hide in NavigationhideInNavToggleHide from menus
Navigation TitlenavTitleTextstringOverride title in menus
Navigation OrdernavOrderNumericCustom sort order

4.4 Modules Composition (modulesComposition)

Section titled “4.4 Modules Composition (modulesComposition)”
PropertyAliasTypeRequired
ModulesmodulesBlock List

Note: The Block List editor will be configured with all available Element Types (modules). See section 5.

4.5 Responsive Image Composition (responsiveImageComposition)

Section titled “4.5 Responsive Image Composition (responsiveImageComposition)”

Applied to all Document Types and Element Types that feature a primary/featured image. All image uploads require both a desktop and a mobile version.

PropertyAliasTypeRequiredDescription
Image DesktopimageDesktopMedia PickerPrimary image for desktop viewports (≥1024px). Recommended: 1920×1080 or wider
Image MobileimageMobileMedia PickerOptimized image for mobile viewports (<1024px). Recommended: 750×1000 or taller

[!IMPORTANT] Every image field across all Document Types and Element Types must follow the desktop + mobile pattern. This includes heroes, galleries, room photos, restaurant photos, etc. The frontend uses &lt;picture&gt; with &lt;source&gt; elements to serve the correct image based on viewport width.

Used in galleries and any Block List that contains multiple images:

PropertyAliasTypeRequiredDescription
Image DesktopimageDesktopMedia PickerDesktop version
Image MobileimageMobileMedia PickerMobile version
Alt TextaltTextTextstringAccessibility description
CaptioncaptionTextstringOptional caption

Element Types are the building blocks of page content. They are rendered by the Module Renderer (see 04_Frontend_Architecture.md). Each Element Type corresponds to a React component in packages/modules/.

IDElement Type AliasDisplay NameDescriptionUsed By
M01headerModuleHeaderSite header with navigationAll (via layout)
M02footerModuleFooterSite footer with linksAll (via layout)
M03bookingBarBooking BarDate picker + booking CTA (Navarino)Hotel sites
M04pageHeroPage HeroHero banner with title, subtitle, CTAAll
M05heroSliderHero SliderFull-width image carouselAll
M06richTextBlockRich Text BlockWYSIWYG content areaAll
M07imageTextBlockImage + TextSide-by-side image and textAll
M08cardGridCard GridGrid of cards (rooms, restaurants, etc.)All
M09featuredCardsFeatured CardsHighlighted content cards with CTAAll
M10testimonialsTestimonialsGuest review carouselHotel sites
M11imageGalleryImage GalleryLightbox-enabled photo galleryAll
M12videoBlockVideo BlockEmbedded video (YouTube/Vimeo or self-hosted)All
M13accordionAccordionExpandable FAQ/info sectionsAll
M14tabsBlockTabsTabbed content sectionsAll
M15ctaBannerCTA BannerFull-width call-to-action bannerAll
M16mapBlockMapGoogle Maps embed with markersAll
M17formModuleFormDynamic form (contact, newsletter, etc.)All
M18hotelListBlockHotel ListGrid/list of hotel cards (group site)Group site
M19offersCarouselOffers CarouselSpecial offer cards carouselAll
M20statsBlockStats/NumbersKey figures with animationsAll
M21timelineBlockTimelineChronological event displayAll
M22teamBlockTeamStaff/board member cardsGroup site
M23newsletterSignupNewsletter SignupEmail subscription formAll
M24socialFeedSocial FeedInstagram/social media embedAll
M25downloadsBlockDownloadsFile download list (menus, brochures)All

Full module specifications in 07_Modules_and_Templates.md and A04_Module_Catalog.md

Used for ALL title, subtitle, and label/eyebrow fields across modules. Provides editor control over both the visible text (with bold formatting via Tiptap RTE) and the semantic HTML tag.

PropertyAliasTypeRequiredDescription
TexttextRich Text (Tiptap, bold-only)Heading text — supports &lt;strong&gt; inline formatting
HTML TaghtmlDropdownSemantic tag: h1, h2, h3, h4, h5, h6, span, p

Configuration: Used as a single-block Block List (useSingleBlockMode: true, validationLimit.max = 1) on title/subtitle/label properties. The text property varies by culture; the html tag is invariant.

[!IMPORTANT] Every title, subtitle, and label/eyebrow field across ALL modules MUST use htmlHeading via Block List. Never use a plain Textstring for heading fields. This ensures editors can control both the text content (with bold) and the semantic HTML tag for accessibility and SEO.

PropertyAliasTypeRequiredDescription
TitletitleBlock List (htmlHeading, single-block)Main heading
SubtitlesubtitleBlock List (htmlHeading, single-block)Secondary text
SlidesslidesBlock List (heroSlide)Carousel slides
AutoplayautoplayToggleAuto-advance slides (default: true)
Interval (ms)intervalNumericSlide interval (default: 5000)
PropertyAliasTypeRequired
Image DesktopimageDesktopMedia Picker
Image MobileimageMobileMedia Picker
CaptioncaptionTextstring
CTA LabelctaLabelTextstring
CTA LinkctaLinkURL Picker

Note: Title and Subtitle use the reusable htmlHeading Element Type (see section 5.2). This allows editors to control both the visible text (with bold formatting) and the semantic HTML tag.

PropertyAliasTypeRequiredDescription
Style VariantstyleVariantDropdowninline, overlay, sticky
Show Room Type FiltershowRoomFilterToggleShow room type dropdown
Custom Promo CodepromoCodeTextstringPre-filled promo code

Note: The booking bar reads Synxis/Navarino configuration from the siteRoot node.


The Umbraco Content Delivery API v2 returns content in the following structure:

{
"name": "Savoy Palace - Homepage",
"route": {
"path": "/pt/",
"startItem": {
"id": "...",
"path": "savoy-palace"
}
},
"contentType": "homePage",
"cultures": {
"pt": { "path": "/pt/", "startItem": { "path": "savoy-palace" } },
"en": { "path": "/en/", "startItem": { "path": "savoy-palace" } }
},
"properties": {
"metaTitle": "Savoy Palace - Luxury Hotel in Funchal, Madeira",
"metaDescription": "...",
"modules": {
"items": [
{
"contentType": "heroSlider",
"properties": {
"title": {
"items": [{
"content": {
"contentType": "htmlHeading",
"properties": {
"text": "Welcome to <strong>Savoy Palace</strong>",
"html": "h1"
}
}
}]
},
"subtitle": {
"items": [{
"content": {
"contentType": "htmlHeading",
"properties": {
"text": "Luxury redefined in Madeira",
"html": "p"
}
}
}]
},
"slides": {
"items": [
{
"contentType": "heroSlide",
"properties": {
"imageDesktop": {
"url": "/media/hero-palace-pool-desktop.jpg",
"name": "Pool view desktop",
"width": 1920,
"height": 1080,
"mediaType": "Image"
},
"imageMobile": {
"url": "/media/hero-palace-pool-mobile.jpg",
"name": "Pool view mobile",
"width": 750,
"height": 1000,
"mediaType": "Image"
},
"caption": "Infinity pool with ocean views",
"ctaLabel": "Book Now",
"ctaLink": "/pt/accommodations"
}
}
]
},
"autoplay": true,
"interval": 5000
}
},
{
"contentType": "bookingBar",
"properties": {
"styleVariant": "overlay"
}
},
{
"contentType": "cardGrid",
"properties": {
"title": {
"items": [{
"content": {
"contentType": "htmlHeading",
"properties": { "text": "Accommodations", "html": "h2" }
}
}]
},
"cards": {
"items": [ /* ... */ ]
}
}
}
]
}
}
}
packages/cms-client/src/types.ts
export interface UmbracoContent {
name: string;
route: {
path: string;
startItem: { id: string; path: string };
};
contentType: string;
cultures: Record<string, { path: string; startItem: { path: string } }>;
properties: Record<string, any>;
}
export interface UmbracoElement {
contentType: string;
properties: Record<string, any>;
}
export interface UmbracoBlockList {
items: UmbracoElement[];
}
export interface UmbracoMedia {
url: string;
name: string;
width?: number;
height?: number;
mediaType: string;
bytes?: number;
}
export interface PageContent {
name: string;
contentType: string;
locale: string;
path: string;
siteKey: string;
seo: {
metaTitle?: string;
metaDescription?: string;
noIndex?: boolean;
canonicalUrl?: string;
ogTitle?: string;
ogDescription?: string;
ogImage?: UmbracoMedia;
};
modules: UmbracoElement[];
availableLocales: { locale: string; path: string }[];
}

Based on the information architecture:

🏨 Savoy Signature [siteRoot]
├── Home [homePage]
├── About Us [contentPage]
│ ├── Our Signature [contentPage]
│ ├── Destination [contentPage]
│ └── Awards [contentPage]
├── Our Hotels [contentPage]
│ └── (links to hotel sites — not child pages)
├── Sustainability [contentPage]
├── Discover [contentPage]
│ ├── Restaurants and Bars [contentPage]
│ ├── Experiences [contentPage]
│ ├── Events [contentPage]
│ ├── SPA & Wellness [contentPage]
│ └── Special Offers [specialOffersPage]
├── Careers [contentPage]
├── Contact [contactPage]
├── Corporate [contentPage]
│ ├── Our Board [contentPage]
│ ├── Awards and Certifications [contentPage]
│ └── Sustainability [contentPage]
├── Privacy Policy [contentPage]
├── Terms & Conditions [contentPage]
├── Complaint Book [contentPage]
└── FAQs [faqPage]

Based on the information architecture:

🏨 Savoy Palace [siteRoot]
├── Home [homePage]
├── The Hotel [contentPage]
│ ├── Concept [contentPage]
│ ├── Awards [contentPage]
│ ├── Facilities [contentPage]
│ ├── Family [contentPage]
│ ├── Destination [contentPage]
│ ├── Online Store [contentPage]
│ ├── Services [contentPage]
│ ├── Special Offers [specialOffersPage]
│ └── FAQs [faqPage]
├── Accommodations [roomsListPage]
│ ├── Rooms [roomDetailPage] (×N)
│ └── Suites [roomDetailPage] (×N)
├── Restaurants & Bars [diningListPage]
│ ├── Galáxia Skyfood [diningDetailPage]
│ ├── Orchidaceae Atelier [diningDetailPage]
│ ├── Hibiscus Restaurant [diningDetailPage]
│ ├── Alameda Restaurant [diningDetailPage]
│ ├── Terreiro [diningDetailPage]
│ ├── Pau de Lume [diningDetailPage]
│ ├── Galáxia Skybar [diningDetailPage]
│ ├── Lobby Lounge & Bar [diningDetailPage]
│ └── Vimes Entertainment Bar [diningDetailPage]
├── Wellness [wellnessPage]
│ ├── SPA [contentPage]
│ └── Gym [contentPage]
├── Experiences [experiencesPage]
│ └── (experience detail pages)
├── Celebrations & Meetings [celebrationsPage]
│ ├── Weddings & Celebrations [contentPage]
│ └── Meetings & Incentives [contentPage]
├── Events [eventsPage]
├── Gallery [galleryPage]
├── Contact [contactPage]
├── Careers [contentPage]
├── Privacy Policy [contentPage]
└── Terms & Conditions [contentPage]

Content trees for all 8 sites follow similar patterns. See section 10 of 03_MultiSite_and_Domains.md for the visual sitemaps.


📁 Shared Content [sharedContentRoot]
├── Footer Links [contentPage]
│ ├── Corporate [contentPage]
│ ├── Guests [contentPage]
│ └── Professionals [contentPage]
├── Social Media Links [contentPage]
├── Legal Pages [contentPage]
│ ├── Privacy Policy [contentPage]
│ ├── Terms & Conditions [contentPage]
│ └── Complaint Book [contentPage]
├── Group-wide Promotions [contentPage]
└── Common Labels [contentPage]
└── (dictionary-style key/value pairs)

[!IMPORTANT] The Media Library folder structure must be pre-organized by WYcreative before handing over the backoffice to the client editorial team. This includes creating all folders, sub-folders, and uploading placeholder/example content to guide editors.

Media
├── 📁 _Shared (Common)
│ ├── 📁 Icons
│ ├── 📁 Backgrounds & Patterns
│ ├── 📁 Documents (PDFs, Brochures)
│ ├── 📁 Logos (all hotel logos, SVG + PNG)
│ └── 📁 Legal (certificates, badges)
├── 📁 Savoy Signature (Group)
│ ├── 📁 Logo & Favicon
│ ├── 📁 Homepage
│ ├── 📁 About
│ ├── 📁 Sustainability
│ ├── 📁 Discover
│ └── 📁 General
├── 📁 Savoy Palace
│ ├── 📁 Logo & Favicon
│ ├── 📁 Homepage
│ ├── 📁 Rooms
│ │ ├── 📁 Desktop
│ │ └── 📁 Mobile
│ ├── 📁 Restaurants
│ │ ├── 📁 Desktop
│ │ └── 📁 Mobile
│ ├── 📁 Wellness
│ ├── 📁 Experiences
│ ├── 📁 Events & Celebrations
│ ├── 📁 Gallery
│ └── 📁 General
├── 📁 Royal Savoy
│ ├── 📁 Logo & Favicon
│ ├── 📁 Homepage
│ ├── 📁 Rooms
│ ├── 📁 Restaurants
│ ├── 📁 Gallery
│ └── 📁 General
├── 📁 Saccharum
│ └── (same structure as hotel sites)
├── 📁 The Reserve
│ └── ...
├── 📁 Calheta Beach
│ └── ...
├── 📁 Gardens
│ └── ...
└── 📁 Hotel Next
└── ...
RuleDescription
Pre-created by WYcreativeAll folders must exist before client access. Include example/placeholder images where helpful
Desktop + Mobile separationFor sections with multiple images (rooms, restaurants), use Desktop/Mobile sub-folders
Naming conventionFiles named descriptively: savoy-palace-room-deluxe-ocean-desktop.jpg
Shared firstCommon assets (icons, logos, legal docs) go in _Shared folder, prefixed with underscore to sort first
Per-hotel isolationEach hotel has its own top-level folder — editors should NOT cross-reference between hotel folders

Media management details in 13_Media_and_Image_Pipeline.md


AspectApproach
LanguagesPortuguese (pt) and English (en) for all sites
Defaultpt is the default (mandatory) language
VariantsUmbraco language variants — each content node has pt and en versions
FallbackIf en variant is not published, the page returns 404 in English (no fallback to PT)
Media — DefaultPortuguese (pt) images serve as the default for both PT and EN
Media — OverridesIf an image contains text, labels, or locale-specific visual elements, an EN variant can be uploaded. When an EN media variant exists, it is used for the EN locale; otherwise, the PT version is served
DictionaryUmbraco Dictionary for fixed UI labels (e.g., “Read More”, “Book Now”)

locale = PT

locale = EN

Yes

No

Request image for locale

EN variant exists?

Serve PT image

Serve EN image

Serve PT image (fallback)

[!NOTE] Most images (photos, landscapes, architecture) are language-agnostic and only need the PT version. The EN override should only be used when the image contains visible text (infographics, certificates, signage with labels, etc.).

Full i18n strategy in 10_MultiLanguage_and_i18n.md


  • All Document Types are created in Umbraco with correct property groups and compositions
  • Element Types (modules) registered in Block List configuration
  • siteRoot nodes created for all 8 sites with theme and booking configuration
  • Content tree structure matches information architecture sitemaps
  • Shared Content node is accessible from all sites
  • Content Delivery API returns correct JSON structure for all content types
  • Multi-language variants work correctly (PT as mandatory, EN as optional)
  • Media Library organized per-site with clear folder structure
  • All properties have correct validation (required fields, length limits, etc.)
  • Block List editors are configured with the correct allowed Element Types per page type

Next document: 07_Modules_and_Templates.md