payload
Use when working with Payload projects (payload.config.ts, collections, fields, hooks, access control, Payload API). Use when…
Use when user wants to migrate content from another CMS (WordPress, Contentful, Strapi, Sanity, Webflow, etc.) to Payload CMS
$ npx -y skills add payloadcms/skills --skill cms-migration --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/cms-migrationContext preview
The summary Claude sees to decide when to auto-load this skill.
Use when user wants to migrate content from another CMS (WordPress, Contentful, Strapi, Sanity, Webflow, etc.) to Payload CMS
name: cms-migration description: Use when user wants to migrate content from another CMS (WordPress, Contentful, Strapi, Sanity, Webflow, etc.) to Payload CMS
Interactive workflow to design Payload collections from source CMS data. Config-first approach: establish the data structure through conversation before any data import.
Start
↓
Ask for data sample
↓
Analyze data shape
↓
Propose collection config
↓
User reviews ──────────────┐
│ │
├─ changes needed ───→ Adjust config ──→ (back to User reviews)
│
└─ looks good ───→ Config confirmed
↓
More collections? ──────┐
│ │
├─ yes ──→ (back to Ask for data sample)
│
└─ no ───→ All collections confirmed
↓
Discuss migration approach
↓
DoneWhen user provides data (JSON, CSV, or describes their schema):
1. **Identify field types** - text, number, date, relationships, media, rich text 2. **Spot patterns** - IDs, timestamps, nested objects, arrays 3. **Note relationships** - foreign keys, embedded refs, linked content types 4. **Flag ambiguities** - fields that could be multiple types, unclear purposes
Present a Payload collection config based on analysis:
// Example output format
export const Posts: CollectionConfig = {
slug: 'posts',
fields: [
{ name: 'title', type: 'text', required: true },
{ name: 'content', type: 'richText' },
{ name: 'author', type: 'relationship', relationTo: 'users' },
// ...
],
}Explain your reasoning for each field choice. When something could go multiple ways (group vs JSON, text vs textarea, select vs relationship), ask rather than assume.
Work through uncertainties: required fields, hasMany relationships, rich text vs HTML, custom timestamps vs built-in. Continue until the user confirms the config.
After each confirmation, ask:
> "Are there other content types we should create collections for?"
If yes, loop back to Phase 1 with new data sample.
Common related collections to prompt for:
Only after ALL collections are confirmed, discuss data import:
1. **Order matters** - which collections have no dependencies? Migrate those first 2. **Relationship mapping** - how to resolve source IDs to Payload IDs 3. **Media handling** - download/re-upload vs external URLs 4. **Rich text** - HTML conversion needs or keep raw
Offer to generate a seed script or walk through manual import.
Throughout the process, watch for these:
**This is the most common migration mistake.** Data that looks static often needs to be dynamic.
When you see repeated string values (categories, tags, types, statuses):
{ "category": "Technology" }
{ "category": "News" }
{ "category": "Technology" }**Don't assume it's a select field.** Ask:
> "I see `category` has values like 'Technology', 'News'. Should this be: > - A **select field** with fixed options (values won't change) > - A **relationship** to a Categories collection (users can add/edit/remove categories later)"
**Default to relationship** for anything that looks like:
**Use select only for:**
If creating a relationship, remember to add the related collection (Categories, Tags, etc.) to the migration plan.
| Issue | How to Handle | |-------|---------------| | User provides partial data | Ask for more samples, especially edge cases | | Unclear relationships | Ask user to describe how content types connect | | Rich text ambiguity | Clarify: Lexical editor, Slate, or store raw HTML | | Missing media collection | Always confirm upload collection exists before referencing | | Overly complex nested data | Consider flattening or using blocks instead of deep groups |
A collection of skills for AI coding agents. Skills are packaged instructions and scripts that extend agent capabilities.
Use when working with Payload projects (payload.config.ts, collections, fields, hooks, access control, Payload API). Use when…