# Recognize Webflow's content modeling patterns

https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/recognize-content-modeling-patterns

Identify eight patterns in your Webflow collections that signal a better structure is possible in Sanity.

---

## Navigation

**Course:** [Migrating from Webflow to Sanity](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity) · [View as markdown](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity.md)

**Previous:** [Audit your Webflow content](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/audit-webflow-content) · **Next:** [Export from Webflow and connect the Data API](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/export-webflow-connect-api)

---

## Course Contents

1. [Introduction](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/introduction-to-webflow-migration)
2. [Audit your Webflow content](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/audit-webflow-content)
3. **Recognize Webflow's content modeling patterns** *(current)*
4. [Export from Webflow and connect the Data API](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/export-webflow-connect-api)
5. [Initialize Sanity and install the migration toolkit](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/initialize-sanity-migration-toolkit)
6. [Map collections to Sanity document types](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/map-collections-to-schemas)
7. [Build a page builder with a sections array](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/page-builder-sections-array)
8. [Model custom-template pages as singletons](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/custom-template-singletons)
9. [Model navigation in Sanity](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/model-navigation)
10. [Create a siteSettings singleton](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/site-settings-singleton)
11. [Handle internal links in Portable Text](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/internal-links-portable-text)
12. [Fetch your collection items from the API](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/fetch-collection-items-api)
13. [Run the asset pre-upload pass](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/asset-pre-upload)
14. [Resolve reference fields from API data](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/resolve-reference-fields)
15. [Convert rich text to Portable Text](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/convert-rich-text-portable-text)
16. [Extract static page content using the page DOM API](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/extract-static-page-content)
17. [Import content with the two-pass pattern](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/two-pass-import)
18. [Validate your import in Studio](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/validate-import-studio)
19. [Set up forms, redirects, and sitemap](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/forms-redirects-sitemap)
20. [Set up draft mode and visual preview](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/draft-mode-visual-preview)
21. [Validate your import without a frontend](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/validate-migration)
22. [Launch checklist and DNS transfer](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/launch-checklist-dns)
23. [AI prompt library and resources](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity/appendix-prompt-library-resources)

---

Webflow's CMS has structural constraints that shape how teams model content. Carrying those patterns directly into Sanity produces a schema that repeats the same limitations. Before designing your Sanity schema, check your collections against these eight patterns.



### The child collection



A collection with no standalone page that exists only to be referenced by another collection is almost always an inline array of objects in Sanity, not a document type.



Ask two questions for each collection:



1. Does this collection have its own page in the site?

2. Would any of its items ever appear standalone, without the parent?


If both answers are no, it belongs as an array field on the parent document.



**Example: **a FAQ Items collection that only appears on a FAQ Page becomes an inline array of FAQ objects on the page document.



### Numbered fields



`step_1_title`, `step_2_title`, `step_3_title` is an array with nowhere to go. In Sanity, that becomes a typed array field with one schema definition.



### Pipe-separated text



`feature_a | feature_b | feature_c` in a plain text field is also an array pattern. These become proper array fields in Sanity.



### Rich text as a catch-all



Content that should be structured (author bios, product specs, callout blocks) often ends up in Webflow rich text because there's no better place for it. In Sanity, Portable Text supports custom block types that hold fully structured, typed content alongside prose.



### Display variant fields



Webflow has no computed fields and no query-time transforms, so editors end up storing every display variant as its own field. A tag document might have name: `"td"`, `nameWithBrackets: "<td>"`, `actualName: "Table Data Cell"`, and `navText: "td"`: four fields where only one is actually source data. The others are formatting applied at the field level because Webflow's templates can't compute them.



In Sanity, ask for each field: can this be derived from another field I already have? If yes, don't store it, derive it:



```groq
"displayTitle": "<" + name + "> Tag"
```

The only variant worth storing is one that genuinely varies per document in ways the derivation formula can't capture — an editorial override, not a formatting rule.



### Boolean proliferation



Webflow has no conditional field logic, so teams create `isFeatured`, `isHidden`, `isNew`, `isPopular` as separate boolean fields where a single status string with an options list would cover it. The signal is multiple `is*` fields that are mutually exclusive or represent a single editorial decision. Collapse these into one field:



```typescript
defineField({
  name: 'status',
  type: 'string',
  options: { list: ['featured', 'new', 'hidden'] },
})
```

Keep a boolean only when the state is genuinely independent of everything else.



### Reference fields used for categorization



Webflow doesn't have enums or inline option lists, so teams create a Category collection with five items and reference it from everything — not because categories need their own pages, but because it was the only way to constrain the value to a fixed set. Check whether the referenced collection has any fields beyond name and slug, and whether its items have their own pages. If not, it may be better modeled as a string field with `options.list`. Keep it as a reference only if the target documents have real content and a public URL.



### Redundant slug/URL fields



Webflow templates can't construct URLs dynamically, so teams sometimes store the full path (`/tags/td`) as a field alongside the slug (td): one for linking, one for the slug input. In Sanity you derive the URL from the slug at render time. The stored path field is redundant and drifts out of sync when slugs change. Drop it and reconstruct the URL in your GROQ projection or component instead:



```groq
"path": "/tags/" + slug.current
```

Work through your audit document and flag every collection and field that matches one of these patterns. Those flags are your schema design starting points.



Next, you’ll design your Sanity schemas from the audit findings.



---

## Related Resources

- [Full course as markdown](https://www.sanity.io/learn/course/migrating-content-from-webflow-to-sanity.md)
- [All courses and lessons](https://www.sanity.io/learn/sitemap.md)
- [Complete content for LLMs](https://www.sanity.io/learn/llms-full.txt)

<AgentInstructions>

## Submitting Feedback

If you encounter incorrect, outdated, or confusing documentation on this page, submit feedback:

POST https://www.sanity.io/learn/resource/feedback

```json
{
  "path": "/learn/course/migrating-content-from-webflow-to-sanity/recognize-content-modeling-patterns.md",
  "feedback": "Description of the issue"
}
```

Only submit feedback when you have something specific and actionable to report.

</AgentInstructions>
