Guide • Marketing Profile
Marketing profiles help first-time users generate a contract from a landing surface without starting from a blank schema, and help continuing users keep that surface coherent as it evolves.
Canonical contract source: contracts/surfaces.web.contract.json • This guide explains the user experience first and shows the current field names only where needed.
A marketing profile is a reusable starter pattern for landing surfaces. It gives the platform a known surface family to seed and validate against, so the first contract is more concrete than a blank JSON file.
It is optional, it starts warn-first, and it is meant to reduce ambiguity and drift. It is not a brand template, not a design-system replacement, and not a punitive style rule.
Product-wise, the profile exists to give users a familiar starting shape and a shared review language. Platform-wise, it gives the contract a reusable surface pattern the validator can understand.
{
"marketingProfiles": {
"layout": [
{ "id": "marketing-open-flow-text-compact" }
],
"typography": [
{ "id": "marketing-mono" }
]
},
"surfaces": [
{
"id": "example-web",
"layout": {
"landingPattern": {
"marketingLayoutProfile": "marketing-open-flow-text-compact",
"marketingLayoutPolicy": "warn"
}
},
"marketingTypographyProfile": "marketing-mono",
"marketingTypographyPolicy": "warn"
}
]
}The user-facing concept is the profile. The current schema still carries separate severity switches, so the contract can say both which profile fits this surface and how strongly to enforce drift against it.
Today that means fields such as marketingLayoutProfile, marketingTypographyProfile, and warn-first settings like marketingLayoutPolicy or marketingTypographyPolicy. Those field names are implementation detail; the user experience should still read as “this surface uses a marketing profile.”
First-time user
Expect a guided start, fewer blank-page decisions, and profile findings that explain what the platform is inferring from the surface.
Continuing user
Expect better consistency, lower review overhead, and clearer decisions about when to change implementation versus when to change the declared surface family.
surfaces.dev docs • guides