Your stock-keeping unit (SKU) data is probably in three places right now. An Enterprise Resource Planning (ERP) system owns price and inventory, supplier spreadsheets land by email or SFTP, and a storefront database holds whatever you last pasted into it. Marketing wants richer descriptions, the marketplace team wants attribute sets the ERP never had, and someone asks whether the company needs a Product Information Management (PIM) system. You're the one expected to answer.
There are three realistic paths. You can build a product information layer from scratch, buy dedicated PIM software, or use a headless Content Management System (CMS) such as Strapi 5 as the system that models, enriches, and serves product data. Each path gives a different answer on data model flexibility, licensing, governance, and maintenance load, and you can evaluate those differences with code and docs rather than vendor decks.
The final section puts all three paths into a decision matrix you can fill in for your own catalog.
In brief
These four points summarize the main tradeoffs:
- A PIM system models product attributes and variants, tracks enrichment, applies approval and validation rules, and distributes an approved record to storefronts, marketplaces, and data pools.
- Building gives you full control over the schema and pipelines. The admin UI and workflow tooling are where the cost hides.
- A headless CMS such as Strapi 5 covers modeling, APIs, tokens, webhooks, and Draft and Publish. Completeness scoring, supplier portals, and channel mapping need custom code.
- Choose by catalog size, channel count, who edits data, and compliance needs.
Together, these factors determine which approach fits your catalog and team.
What a PIM System Does and What You Need From It
Most of the build-versus-buy argument turns on two questions: which jobs a PIM system does, and where its data boundary sits against the ERP and the CMS.
Core Jobs of a PIM System
A PIM system is the product data management layer for commerce. It keeps one approved, enriched record per product and publishes it to every sales channel. Modeling defines product families, variant axes, and attributes that can differ per channel or locale. Enrichment fills those attributes and tracks how complete each product is per channel. Governance covers approval workflows, validation rules, version control, and role-based ownership, and one ecommerce platform's PIM guide lists all of these. Distribution pushes the approved record to storefronts, marketplaces, and data pools, which GS1 defines as trading partner repositories for exchanging item data in a standard format.
An API-first headless CMS handles the first job and the API half of the fourth natively, which is why the question comes up at all in composable commerce stacks.
PIM vs CMS vs ERP: Where Each Owns the Data
Your ERP owns price and stock. In typical composable commerce setups, list prices live in the ERP and inventory lives in whichever system owns orders, usually an order management system (OMS) or the ERP. Updates flow one way: the commerce platform doesn't tell the ERP to change a price or update a product description.
Your PIM owns descriptive and enriched data: attributes, long-form text, images, and compliance data. Your CMS owns unstructured marketing content. Vendors disagree at the edges. One PIM vendor also lists pricing and inventory among PIM-managed data, so treat the split as typical rather than standard.
Headless blurs the PIM/CMS line. A headless CMS already has custom fields, relations, and localization, so product data tends to land there, and one integrator describes the storefront as the point where commerce API data and CMS content merge. Once your team edits hero copy and product attributes in one Admin Panel, the distinction may stop being obvious to your non-engineering colleagues.
Building From Scratch: Full Control, Full Maintenance
Most teams underestimate the cost of building a PIM themselves. The schema is the easy part. You end up maintaining the tooling around it for years.
What You Own When You Build
The schema comes first, and product catalogs push you toward Entity-Attribute-Value (EAV) storage. One commerce framework's developer docs give the reason: a laptop store and a yarn store need different attributes, and even within yarn some products carry length while others carry diameter. EAV has its own costs. One agency glossary notes a single product can pull from 30 to 50 attribute tables [TKTK].
Then come import pipelines. Instacart's catalog team describes more than 30 data sources (retailers, aggregators, manufacturers, field data), SFTP CSV drops, real-time APIs, and reconciliation when sources conflict [TKTK]. They also built a web portal so retailers could update attributes by filling in forms, which is your admin UI line item. Variant axes need their own model and validation. Audit history and per-channel feeds each become code you maintain indefinitely.
When Building Makes Sense
Martin Fowler's rule still holds: you should build when the business process is part of your competitive advantage; otherwise, buy a package and adjust the process to fit (Martin Fowler).
In practice, that gives you two cases. The first is an unusual domain model. Wikipedia's EAV entry says designers intended EAV for usage patterns that are arbitrary or unforeseeable under a fixed design. The second is a small catalog with strict constraints where a package would be mostly unused surface area. This second case is judgment rather than hard data.
The hidden cost sits in the admin UI and workflow tooling, and the evidence is anecdotal but consistent. After a team of seven described building user management, inventory, schema, and API in-house, a Hacker News commenter warned that trivial-sounding things are very hard to get right [TKTK]. One low-code vendor's build-versus-buy guide quotes a commenter who said an internal tool took four to six person-months and buying would probably have been cheaper [TKTK]. That source sells the alternative, the number is a single anecdote, and it matches the other anecdotes.
Buying Dedicated PIM Software
Commercial PIM software exists because governance and syndication are hard. You need to decide whether you need enough of either to accept the licensing model attached.
What You Get Out of the Box
Gartner's Peer Insights market definition (updated February 2025) lists the mandatory features: workflow, data modeling and hierarchy management, rich content authoring, multichannel publishing and contextualization, digital asset management (DAM), and variant management. Beyond that baseline, three capabilities are hard to replicate.
Completeness scoring tells a merchandiser that a product is 80% ready for one channel and 100% for another, calculated per channel and per locale from configurable rules. Supplier onboarding portals give suppliers a templated, validated way to submit attribute data without touching your Admin Panel. Syndication connectors ship pre-mapped feeds to marketplaces and standards-based data pools. Forrester's PIM Wave cites syndication to third-party digital shelves as one reason vendors stay essential. If marketplaces are rejecting listings for incomplete attributes today, this tier of software addresses that problem.
Where Licensing and Rigid Models Hurt
Subscription pricing typically scales with SKU count, seats, and features, and tiers jump with more SKUs, more users, or more channels. Published vendor ranges vary widely and conflict even across one vendor's own pages, so the pattern is reliable and the numbers are not. Vendors often sell store and marketplace connectors as add-ons, and enterprise tiers are often quote-based, multi-year, and sometimes dependent on an implementation partner.
The data model is the second constraint. Some tools ship a predefined product-centric model (products, families, attributes, categories) that you configure rather than define, while others let you write the classes. If your catalog has relationships the predefined model didn't anticipate, you're working around the tool.
Open source PIM editions trade license cost for operations. Community editions often hold back DAM, advanced permissions, or workflow automation for paid tiers, and if you self-host, you also run the database and search infrastructure yourself. The open source tradeoffs are different from commercial ones, but no smaller.
Using a Headless CMS as Your PIM System
Strapi 5 is the concrete example here because the docs describe its modeling, API, and governance features in enough detail to map against the PIM jobs above. Strapi's PIM page pitches it as a headless PIM. This section checks that pitch against the docs, current as of Strapi 5.56.0 (released September 30, 2026).
No Licensing Fees, Real Operating Costs
The Strapi Community Edition is open source under the MIT License, and the Strapi pricing page lists unlimited entries, API calls, and CMS seats on Community. The PIM page says you can model unlimited variants, bundles, and configurations without additional fees, though it names no plan tier.
You pay instead for hosting, operations, and engineering time, plus any paid features. If you'd rather avoid self-hosting, Strapi Cloud provides managed hosting, automated backups, security updates, and built-in scalability. The Growth plan adds scheduled Releases, Content History, and Live Preview. Review Workflows and Audit Logs require Enterprise; see Strapi pricing for current plans. A catalog with 20,000 SKUs costs the same in license fees as one with 200, and the difference shows up in your database and your calendar. The true cost breakdown has the full accounting.
Flexible Product Modeling in the Content-Type Builder
Model the catalog in the Content-Type Builder with Collection Types for Product, Variant, Category, and Brand. Attribute groups that repeat across products (dimensions, materials, care instructions) go in Components. These are reusable structures stored under ./src/components (Models docs) and usable as single or repeatable fields. Category-specific attributes go in Dynamic Zones, which let one Product type carry a laptop-specs component for one entry and a yarn-specs component for another. Internationalization and Draft and Publish are in core, off by default, and enabled per Content-Type.
Components and Dynamic Zones are added through the Content-Type Builder UI. The file below shows the core fields and relations:
// ./src/api/product/content-types/product/schema.json
{
"kind": "collectionType",
"collectionName": "products",
"info": {
"singularName": "product",
"pluralName": "products",
"displayName": "Product"
},
"options": { "draftAndPublish": true },
"pluginOptions": { "i18n": { "localized": true } },
"attributes": {
"sku": { "type": "string", "required": true, "unique": true },
"name": { "type": "string", "required": true },
"slug": { "type": "uid", "targetField": "name" },
"brand": {
"type": "relation",
"relation": "manyToOne",
"target": "api::brand.brand",
"inversedBy": "products"
},
"categories": {
"type": "relation",
"relation": "manyToMany",
"target": "api::category.category"
},
"variants": {
"type": "relation",
"relation": "oneToMany",
"target": "api::variant.variant",
"mappedBy": "product"
}
}
}Don't name any field status. Draft and Publish reserves it, and the Content-Type Builder blocks it (see the Draft and Publish docs). The content modeling guide covers the Variant type and locale-aware Components in more depth.
The Content-Type Builder runs in development only, and the Strapi FAQ confirms there is no plan to allow creating or updating models in a production environment. Your merchandisers cannot add an attribute in production. You add it in development, then deploy, as the deployment docs describe.
Bulk Import and Export for Catalog Data
The built-in Data Management commands (strapi export, strapi import, and strapi transfer) move data between Strapi instances (CLI docs). None of them read a supplier CSV.
For supplier feeds, write an upsert against the Document Service API keyed on the unique sku field. A core service is a natural home for it:
// ./src/api/product/services/product.js
const { createCoreService } = require('@strapi/strapi').factories;
const uid = 'api::product.product';
module.exports = createCoreService(uid, ({ strapi }) => ({
async upsertBySku(rows) {
for (const row of rows) {
const existing = await strapi.documents(uid).findFirst({
filters: { sku: { $eq: row.sku } },
});
if (existing) {
await strapi.documents(uid).update({ documentId: existing.documentId, data: row });
} else {
await strapi.documents(uid).create({ data: row });
}
}
},
}));Call strapi.service('api::product.product').upsertBySku(rows) from a cron job or a custom route. findFirst() searches drafts in the default locale unless you pass status or locale, and documentId (not id) is the identifier that survives import/export. Add status: 'published' to publish while writing.
The community compatibility list marks the original import-export-entries plugin as unsupported for Strapi 5 (issue #22522), and its last version shipped in late 2023. Several community Strapi 5 alternatives exist in the Strapi Marketplace, such as Tablify for CSV and JSON import and export, with varying maturity, so you should test before relying on one.
REST and GraphQL APIs for Multichannel Delivery
Once the Content-Type exists and a role or token has find permission, Strapi exposes this endpoint:
GET /api/products?filters[sku][$eq]=SKU-1042&populate=variantsRelations, media, Components, and Dynamic Zones return only when you pass populate, and the calling token needs find permission on each populated type (populate docs). Strapi 5 responses are flat, with attributes at the top level of data alongside id and documentId (REST docs).
Install the GraphQL plugin with npm install @strapi/plugin-graphql; Strapi hosts the sandbox at /graphql (GraphQL plugin docs). The same query:
query {
products(filters: { sku: { eq: "SKU-1042" } }) {
documentId
sku
variants {
documentId
}
}
}See the GraphQL vs REST comparison for more on choosing between them.
Scope access with API tokens. Read-only tokens can only call find and findOne, and Custom tokens set per-Content-Type permissions, so give the storefront a read-only token and the import job a custom one. To push updates out, Strapi webhooks fire on entry.create, entry.update, entry.delete, entry.publish, and entry.unpublish, with a payload carrying model, uid, and the entry including documentId.
Review Workflows for Approval Gates
Review Workflows ship with four default stages: To do, In progress, Ready to review, and Reviewed. You can add custom stages such as Legal review or Brand review, set which roles can move content out of a stage and into it, and assign entries to any admin user. The review-workflows.updateEntryStage webhook fires on every stage change with workflow.stages.from and .to in the payload, which is how you'd trigger a channel push only after legal signs off. The feature requires an Enterprise plan (Strapi Enterprise).
On Community, the fallback has three parts:
- Draft and Publish: a two-state gate.
- Permissions: Role-based access control limits who can publish (three default roles, with some field-level permissions).
- Middleware: Document Service middleware, registered via
strapi.documents.use(), validates or blocks writes before they hit the database.
That gets you content governance without multi-stage approvals or stage-change webhooks. A custom status field plus middleware can approximate them, though the docs don't describe that pattern directly.
Where You Still Write Custom Code
The Strapi 5 docs don't list three dedicated-PIM capabilities. Completeness scoring: field-level required, unique, and min/max validation exist, but nothing calculates a per-channel readiness percentage, and the docs list no scoring plugin. Channel-specific mapping: webhooks tell a channel that a product changed, but you write the code that transforms the payload into a marketplace or GS1 Global Data Synchronisation Network (GDSN) format, and GDSN also needs a certified data pool. Supplier onboarding: Review Workflow assignees must be admin users and the PIM page mentions partner portals only generically, so a supplier portal is a separate build.
The docs don't cover bulk editing of field values from the list view either. A plugin can add it through addBulkAction.
How to Choose the Right PIM System Approach
The matrix below compresses the three paths onto the dimensions that decide most projects. The questions after it surface the facts you need to fill it in for your catalog.
Decision Matrix
| Dimension | Build from scratch | Buy dedicated PIM software | Headless CMS (Strapi 5) |
|---|---|---|---|
| Time to launch | Longest. Schema, pipelines, admin UI, and permissions all from zero | Usually fastest for governance and syndication, with configuration plus an implementation partner | Fast for modeling and APIs. Add time for import scripts and any scoring or mapping |
| Data model flexibility | Total, at EAV complexity cost | Ranges from predefined product-family models to classes you define | Collection Types, Components, Dynamic Zones, and relations. Schema changes are deploy events |
| Licensing cost | None | Tiers by SKU, seat, or channel. Connectors as add-ons. Enterprise quote-based | Community is MIT with unlimited entries, API calls, and seats. Review Workflows and Audit Logs need Enterprise |
| Governance | Whatever you build | Completeness scoring, multi-stage approvals, validation rules out of the box | Draft and Publish, RBAC, and middleware on Community. Four-stage configurable workflows on Enterprise |
| Maintenance load | Indefinite. Custom code needs dedicated staff | Vendor-maintained. You own integrations and upgrades | You run hosting, upgrades, and the custom pieces listed above |
Questions to Ask Before You Commit
Start with catalog size and channel count. Vendor rules of thumb put the tipping point around 100 to 500 SKUs across three or more channels, below which a CMS with custom fields copes [TKTK]. One consultancy argues attribute and channel complexity matter more than raw count. Vendors don't state a methodology for these thresholds, so treat them as ranges to test against your own data rather than cutoffs.
Then ask who edits the data. If merchandisers need to add attributes without a deploy, the Content-Type Builder's production restriction is a blocker. You then need either dedicated software or a Dynamic Zone design that anticipates new attribute groups. If you own the model and a small team enriches entries, Strapi's Admin Panel is likely enough.
Finally, check compliance. A GS1 healthcare pilot lists 24 mandatory attributes for GDSN (seven to register, 17 to exchange data) plus a certified data pool. The ETIM classification standard spans 21 countries. Standards work like that is where a dedicated PIM earns its license. For a storefront-first catalog, the headless CMS for ecommerce guide and the B2B wholesale catalog walkthrough show what the Strapi path looks like in practice.
Start Small and Grow the Product Model
The lowest-risk way to answer the PIM question is to model one product family in Strapi 5 with a Product type, a Variant relation, and a single Dynamic Zone, then run a sku-keyed upsert against one supplier feed. If the model holds and the governance you need fits Draft and Publish plus roles, you have a PIM system with no license meter. If you find yourself writing a completeness calculator and a supplier portal in the first month, that's your signal to price dedicated software or Enterprise workflows against the engineering time.
The two guides linked above walk through a catalog build with Strapi 5 in more detail. If you'd rather see the Admin Panel in action before writing a schema, try the Strapi live demo, or contact the Strapi team about an Enterprise demo to see Review Workflows.





