Basic Concepts
Understand the core concepts behind Akeneo Exporter.
Configuration
A Configuration defines how to connect to your Akeneo PIM and where to export data.
What's in a Configuration?
Think of it as a reusable blueprint that can be executed multiple times to create individual Export jobs.
Akeneo PIM connection details and authentication
MongoDB, PostgreSQL, or MySQL with connection settings
Optional transformation rules and filters
Key Features
- Organization-scoped — All team members can view and use shared configurations
- Reusable — Create once, run exports from it anytime
- Channel-specific — Target a specific Akeneo scope (e.g., "ecommerce", "marketplace")
interface Configuration {
name: string
source: {
type: 'akeneo'
url: string
credentials: AkeneoCredentials
scope?: string // Channel (e.g., 'ecommerce', 'marketplace')
}
destination: {
type: 'mongodb' | 'postgresql' | 'mysql'
connectionString: string
database: string
collection?: string // MongoDB only
schema?: string // PostgreSQL only
}
enrichers?: string[] // IDs of enrichers to apply
filters?: ProductFilters
}Enricher
An Enricher transforms or enriches product data during export.
What Can Enrichers Do?
Types of Enrichers
Follow an "if-then" logic pattern. Chain multiple conditions with AND/OR logic.
{
name: "Mark On Sale",
type: "conditional",
conditions: [
{ field: "attributes.price", operator: "<", value: 50 }
],
actions: [
{ type: "setField", field: "on_sale", value: true }
]
}Use Mustache templates for dynamic text generation (coming soon)
Pre-built enrichers for categories, attributes and entities
Export
An Export is a job that fetches products from Akeneo, applies enrichers, and writes to your database.
Export Lifecycle
Each export is tracked independently with its own status, progress metrics, and execution logs.
Export Modes
Exports all products from Akeneo. Replaces existing data in destination. Useful for initial setup or complete refreshes.
Only syncs products changed since last run. Uses updatedSince filter. Optimized for daily updates.
Real-time Progress
During execution, exports display granular metrics:
- Products fetched from Akeneo
- Products enriched and transformed
- Products written to destination
- Processing rate (products/second)
Product Structure & Flat Storage
Akeneo Exporter uses a flat storage architecture that optimizes for performance and scalability.
Akeneo Product Hierarchy
Akeneo supports up to 3 levels of product hierarchy:
Parent products with variants. Define common attributes (description, brand, images).
Specific SKUs with variant attributes (size, color, EAN, price). Reference their parent.
Standalone products without variants—digital goods, services, unique items.
Flat Storage Architecture
Instead of embedding variants inside parent products (which causes MongoDB's 16MB document limit issues), we use flat storage with two separate collections:
// Collection: product_parents
// Contains configurable products (Product Models)
{
_id: "nike-air-max",
code: "nike-air-max",
family: "shoes",
familyVariant: "shoes_size_color",
name: "Nike Air Max 90",
attributes: {
brand: "Nike",
description: "Classic running shoe...",
images: [...]
},
categories: ["shoes", "running"],
metadata: { created: "...", updated: "..." }
}
// Collection: products
// Contains variants AND simple products
{
_id: "nike-air-max-blue-42",
code: "nike-air-max-blue-42",
parent: "nike-air-max", // Reference to parent
familyVariant: "shoes_size_color",
attributes: {
color: "blue",
size: "42",
ean: "1234567890123",
price: 129.99
},
metadata: { level: 3, type: "product" }
}
// Simple product (no parent)
{
_id: "gift-card-50",
code: "gift-card-50",
parent: null, // No parent = simple product
family: "digital",
attributes: {
value: 50,
currency: "EUR"
},
metadata: { type: "simple-product" }
}Benefits of Flat Storage
Products with thousands of variants work perfectly
Create indexes on attributes.size, attributes.color
Update one variant without rewriting parent document
Direct queries on variants without array unwinding
Querying Your Data
// Find a product parent with all its variants
const parent = await db.product_parents.findOne({ code: "nike-air-max" })
const variants = await db.products.find({ parent: "nike-air-max" })
// Find variants by attribute (now indexable!)
db.products.createIndex({ "attributes.size": 1 })
const size42 = await db.products.find({ "attributes.size": "42" })
// Find all simple products
const simpleProducts = await db.products.find({ parent: null })
// Reconstruct full product with variants (application-level join)
const fullProduct = {
...parent,
variants: await db.products.find({ parent: parent.code }).toArray()
}Data Flow
Akeneo Exporter acts as a data pipeline, not a data warehouse. Your product data flows through the system in real-time—we never persist it.
Authenticate with Akeneo PIM, query products via REST API, handle pagination automatically.
Apply enrichers in sequence, transform data according to your rules. No permanent storage.
Upsert to your database with batch writes. Query immediately after export completes.
┌─────────────────┐
│ Akeneo PIM │ ← Source (your products)
└────────┬────────┘
│ Fetch via API
▼
┌─────────────────┐
│ Akeneo │ ← Processing (apply enrichers)
│ Exporter │
└────────┬────────┘
│ Write
▼
┌─────────────────┐
│ Your Database │ ← Destination (MongoDB/PostgreSQL)
└─────────────────┘Scopes & Locales
Understanding Scopes (Channels)
In Akeneo PIM, a scope (also called channel) represents a sales channel with its own set of attribute values. For example, your "ecommerce" scope might have web-optimized product descriptions and online prices, while your "marketplace" scope has Amazon-specific content. Scopes allow you to maintain different views of the same product catalog.
Multi-Channel Isolation Strategies
When you have multiple scopes in Akeneo, you have two strategies to organize your exported data:
Strategy A: Database per Scope
Create separate configurations, each targeting a different database.
- ✓ Physical isolation between channels
- ✓ No scope filtering in queries
- ✓ Independent scaling per channel
Strategy B: Custom Table/Collection Names
Use the same database with prefixed table or collection names.
- ✓ Single database to manage
- ✓ Cross-channel queries possible
- ✓ Simpler infrastructure
// Configuration for E-commerce
{
name: "E-commerce Export",
scope: "ecommerce",
destination: {
database: "ecommerce" // Separate database
}
}
// Configuration for B2B
{
name: "B2B Export",
scope: "b2b",
destination: {
database: "b2b" // Separate database
}
}// Configuration for E-commerce (same database, prefixed collections)
{
name: "E-commerce Export",
scope: "ecommerce",
destination: {
database: "products",
productParentsName: "ecommerce_product_parents",
productsName: "ecommerce_products"
}
}
// Configuration for B2B (same database, different prefix)
{
name: "B2B Export",
scope: "b2b",
destination: {
database: "products",
productParentsName: "b2b_product_parents",
productsName: "b2b_products"
}
}Understanding Locales
Akeneo supports localizable attributes—attributes that have different values per language (e.g., product name in English, French, German). When exporting, you configure which locales to include and which one is the default.
How Locales Are Exported
The exporter embeds all locale translations directly in each document:
- Default locale at root: The default locale's values are placed in the root
attributesobject for fast queries. - Other locales in
localesobject: Additional translations are nested underlocales.<locale_code>.attributes. - Atomic documents: All locale data is embedded in the same document—no joins needed to get translations.
{
"_id": "nike-air-max",
"code": "nike-air-max",
"attributes": {
"name": "Nike Air Max 90", // en_US (default locale)
"description": "Classic running shoe with Air cushioning.",
"price": { "amount": 129.99, "currency": "USD" }
},
"locales": {
"fr_FR": {
"attributes": {
"name": "Nike Air Max 90",
"description": "Chaussure de course classique avec coussin d'air."
}
},
"de_DE": {
"attributes": {
"name": "Nike Air Max 90",
"description": "Klassischer Laufschuh mit Air-Dämpfung."
}
}
}
}attributes for non-localized fields and locales.fr_FR.attributes for localized fields. Most applications merge these at query time or in application code.Multi-Tenant Architecture
Akeneo Exporter is built with multi-tenancy at its core. All resources (configurations, enrichers, exports) are scoped to your organization using an orgId. Teams within the same company share resources, but different organizations are completely isolated—you'll never see another company's configurations or data.
This architecture scales naturally as your business grows. Need to add a new sales channel? Create a new configuration with the appropriate scope and destination. Want to apply different enrichment rules per channel? Attach channel-specific enrichers to each configuration. All exports from all channels are tracked in a unified dashboard.