Ecommerce

Akeneo PIM Development Guide: Architecture, Custom Code & Best Practices

Build upgrade-safe Akeneo PIM customizations: architecture, bundles, jobs, APIs, and the coding habits that keep catalogs stable through version upgrades.

Akeneo PIM Development Guide: Architecture, Custom Code & Best Practices
Ecommerce 14 min read

Akeneo PIM development sits at the intersection of product data modeling, Symfony engineering, and ecommerce operations. Brands hire teams not only to “install Akeneo,” but to encode how products are enriched, approved, localized, and published across Shopify, Magento, Amazon, marketplaces, and ERP systems. This Akeneo PIM development guide explains how Spygar approaches custom Akeneo work so catalogs stay accurate, integrations stay resilient, and upgrades stay boring.

Great Akeneo development is invisible at upgrade time—custom code that survives version bumps is the real deliverable.

Understand the Akeneo platform before you customize

Akeneo Community Edition and Enterprise Edition share a product-centric domain model: families, attributes, attribute groups, categories, products, product models, variants, associations, and media. On top of that, Akeneo runs asynchronous jobs for imports, exports, mass edits, and completeness recalculation. Development work should respect these seams. If you fight the model—stuffing channel-specific copy into the wrong attribute type, or bypassing jobs for heavy writes—you create technical debt that surfaces as slow grids, failed exports, and painful migrations.

  • Map business nouns to Akeneo concepts before writing a line of bundle code
  • Prefer attributes, reference entities (EE), and rules over ad-hoc database columns
  • Use Akeneo jobs for bulk work so the UI stays responsive under catalog load
  • Plan localization and channel requirements during modeling, not after go-live

Upgrade-safe custom development patterns

The most expensive Akeneo mistake is patching vendor code. Use Symfony bundles, event subscribers, service decoration, and Akeneo extension points so custom behavior travels cleanly across minor and major releases. Keep business logic in your own namespaces. Document every override. When you must change UI screens, isolate front-end assets and avoid copying entire vendor templates unless you have a maintenance plan.

For connectors and integrations, treat Akeneo as the system of record for product content and assets—not for inventory, pricing engines, or order state unless your architecture explicitly requires it. Clear ownership boundaries make Akeneo API integrations easier to test and safer to scale. Always start from the official Akeneo REST API reference index when designing custom connectors.

API building blocks every Akeneo developer should know

Custom bundles often wrap the same REST calls Magento/Shopify connectors use. Auth + UUID product upserts cover most write paths; list/get with completeness covers most read paths. For file-based or job-based custom connectors (notify-after-export, new formats), follow our create custom Akeneo connector guide—aligned with the official docs. Deep REST parameter/response examples live in the API integration guide—here are the two calls developers hit first:

POST /api/oauth/v1/token Official docs

Get an authentication token

Exchange connection credentials for a Bearer access token. No prior Bearer auth is required for this call.

Headers

  • Content-Type: application/json (or application/x-www-form-urlencoded)
  • Authorization: Basic {base64(client_id:client_secret)}

Parameters

Name In Type Required Description
username body string Yes PIM connection username
password body string Yes PIM connection password
grant_type body string Yes Must be password

Example request

curl -X POST "https://YOUR_PIM_HOST/api/oauth/v1/token" \
  -H "Content-Type: application/json" \
  -H "Authorization: Basic $(echo -n 'CLIENT_ID:CLIENT_SECRET' | base64)" \
  -d '{
    "username": "your_connection_username",
    "password": "your_connection_password",
    "grant_type": "password"
  }'

Response — 200 OK

Returns an authentication token used as Authorization: Bearer on later calls.

{
  "access_token": "ZTZmYjU4ZmQxZWNmMzk1M2NlYzA5NmFhNmIzVjExMzE4NmJmODBkZGIyYTliYmQyNjk2ZDQwZThmNjdiZDQzOQ",
  "expires_in": 3600,
  "token_type": "bearer",
  "scope": null,
  "refresh_token": "M3FlODI0OTE3ODMyNjViMzRiOWE5ODMyNWViMThkNDU5YzJjNjFiZjNkZWFjMzIyYjc4YTgzZWY1MjE5ZTY5Mw"
}

Response — 400 Bad Request

Malformed JSON or invalid request framing.

{
  "code": 400,
  "message": "Invalid JSON message received"
}

Response — 422 Unprocessable Entity

Validation failed (wrong grant_type, bad credentials shape, etc.).

{
  "code": 422,
  "message": "Property \"grant_type\" expects a valid grant type. Check the expected format on the API documentation."
}
GET /api/rest/v1/products-uuid/{uuid} Official docs

Get a product (UUID)

Fetch one product by immutable UUID. Use query flags to include completeness, quality scores, or root parent.

Headers

  • Authorization: Bearer {access_token}
  • Accept: application/json

Parameters

Name In Type Required Description
uuid path string Yes Product UUID
scope query string No Filter scopable values
locales query string No Filter localizable values
attributes query string No Limit returned attributes
with_attribute_options query boolean No Include option labels
with_quality_scores query boolean No Include quality scores
with_completenesses query boolean No Include completenesses
with_root_parent query boolean No Include root parent model code

Example request

curl -G "https://YOUR_PIM_HOST/api/rest/v1/products-uuid/25566245-55c3-42ce-86d9-8610ac459fa8" \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Accept: application/json" \
  --data-urlencode 'scope=ecommerce' \
  --data-urlencode 'locales=en_US' \
  --data-urlencode 'with_completenesses=true'

Response — 200 OK

Product standard format.

{
  "uuid": "25566245-55c3-42ce-86d9-8610ac459fa8",
  "enabled": true,
  "family": "tshirt",
  "categories": ["summer_collection"],
  "groups": [],
  "parent": null,
  "values": {
    "sku": [{"data": "top", "locale": null, "scope": null, "attribute_type": "pim_catalog_identifier"}],
    "name": [
      {"data": "Top", "locale": "en_US", "scope": null, "attribute_type": "pim_catalog_text"}
    ],
    "description": [
      {"data": "Summer top", "locale": "en_US", "scope": "ecommerce", "attribute_type": "pim_catalog_textarea"}
    ]
  },
  "created": "2026-01-05T10:00:00+00:00",
  "updated": "2026-03-01T12:30:00+00:00",
  "completenesses": [
    {"scope": "ecommerce", "locale": "en_US", "data": 100}
  ]
}

Response — 404 Not Found

UUID does not exist (or not visible under permissions).

{
  "code": 404,
  "message": "Product \"25566245-55c3-42ce-86d9-8610ac459fa8\" does not exist."
}

Jobs, queues, and observability

Real catalogs are big. Imports of tens or hundreds of thousands of SKUs, nightly channel exports, and completeness recalculations belong in jobs with logging, retries, and dead-letter handling. Surface job status to business users. Alert on repeated failures. Without observability, “Akeneo is slow” becomes a vague complaint instead of a measurable queue backlog or a missing index.

  • Instrument import/export jobs with duration, error counts, and sample failing SKUs
  • Keep idempotent writers so a replayed job does not duplicate or corrupt data
  • Separate validation failures (business) from infrastructure failures (ops)
  • Load-test completeness and grid queries with production-like volume

Testing and delivery discipline

Akeneo custom development should ship with fixtures that represent your hardest product families—variant trees, multi-locale requirements, asset-heavy SKUs, and incomplete records. Automate smoke tests for login, product save, import job success, and one channel export. Pair that with a documented upgrade runbook: backup, dependency matrix, migration scripts, regression on critical connectors, and a rollback path.

When to choose CE vs EE for development scope

Community Edition can power strong mid-market catalogs when modeling and connectors are designed carefully. Enterprise Edition unlocks governance features—rules engines, workflows, advanced asset management, and reference entities—that reduce custom code for large brand teams. Spygar helps clients decide where licensed EE capability is cheaper than building equivalents, and where custom Akeneo development still creates durable advantage.

How Spygar delivers Akeneo PIM development

We start with product modeling workshops, then design connectors, enrichment UX, and operational jobs against measurable outcomes: faster time-to-market, fewer channel rejections, and higher catalog completeness. Whether you need a greenfield Akeneo build, a connector to Magento or Shopify, or hardening of an existing instance, we treat maintainability as a first-class requirement—because Akeneo only creates value when merchandisers trust it every day.

Ready to start your next project?

Let's work together to bring your ideas to life.