Akeneo Connect is a CELUM extension which allows you to synchronize previews, IDs, URLs and metadata from CELUM to Akeneo.
In the other direction you can synchronize the product structure and attributes from Akeneo to CELUM. It is also possible to write data from Akeneo to the CELUM structure to efficiently use the search of CELUM.
To be configured in {home}/appserver/conf/custom.properties
type: String, required: yes, default: -
The base URL of your Akeneo instance
e.g. akeneoConnector.api.baseUrl=https://akeneo-demo.brix.ch
type: String, required: yes, default: -
The client ID of the Akeneo API key
e.g. akeneoConnector.api.clientId=1_3f8ostwi792c88sasdws123ww0skkgog0kg4c13k04s84k448g
type: String, required: yes, default: -
The client secret of the Akeneo API key
e.g. akeneoConnector.api.clientSecret=1fyrte3werps088w8sw1111kk0c4s04s0sc4wgso8c8css8kgso
type: String, required: yes, default: -
The name of the Akeneo API user
e.g. akeneoConnector.api.username=user_name
type: String, required: yes, default: -
The password of the Akeneo API user
e.g. akeneoConnector.api.password=password
type: String, required: yes, default: -
The license for Akeneo Connect provided by brix IT Solutions
e.g. akeneoConnector.license=B3Kj3MbcupVIF/zHV2fn0uwmjRpaQ4YcynIjENCxA0l4ncLRYyUZwubIhXKpgW/+baPziK
type: String, required: yes, default: sku
The code of the identifier attribute in akeneo
e.g. akeneoConnector.identifierAttributeCode=art_no
type: List of Strings (comma-separated), required: yes, default: -
Priority list of channel codes to consider when synchronizing attributes with different values per channel
e.g. akeneoConnector.api.channelPrecedence=ecommerce,print
type: Number, required: yes, default: -
The ID of the newly created node information field (see above)
This is a technical information field for storing identifier data needed by the sync algorithm. It is recommended to hide it for all users (except superusers) via role configuration.
e.g. akeneoConnector.informationFieldId.hierarchyIdentifier=205
type: Number, required: yes, default: -
The ID of the root node of the product hierarchy synchronized from Akeneo
e.g. akeneoConnector.hierarchySync.rootNodeId=17362
The provided default values should be fine for most cases.
type: String, required: no, default: UTC
The configured time zone on your Akeneo server instance.
Server instances hosted by Akeneo (*.cloud.akeneo.com) always have UTC configured.
e.g. akeneoConnector.api.timeZoneId=Europe/Vienna
type: String, required: no, defaults: en_US, de_DE, fr_FR, es_ES, it_IT
Defines the default country code (variant) for a language.
Because CELUM does not support language variants, the connector needs to decide which language variant to use if Akeneo returns data for multiple variants of the same language e.g. en_US and en_GB.
Example:
akeneoConnector.defaultCountryCode.en=GB
akeneoConnector.defaultCountryCode.de=CH
akeneoConnector.defaultCountryCode.fr=BE
type: List of Strings (comma-separated), required: no, default: -
List of locales to include in Akeneo API responses
Setting this property may slightly improve performance by stripping unnecessary locale data from all API responses.
e.g. akeneoConnector.api.requiredLocales=en_US,de_DE,fr_FR
type: Number, required: no, default: 100
The maximum number of records returned per API request
e.g. akeneoConnector.api.pageLimit=50
Consider decreasing this value if you experience request timeouts. The maximum value supported by the Akeneo API is 100.
type: Number, required: no, default: 10
Timeout in seconds for establishing a connection to the Akeneo API
e.g. akeneoConnector.api.connectTimeout=10
type: Number, required: no, default: 300 (5 minutes)
Timeout in seconds when reading data from the Akeneo API
e.g. akeneoConnector.api.readTimeout=300
type: Number, required: no, default: 600 (10 minutes)
Timeout in seconds when writing data to the Akeneo API
e.g. akeneoConnector.api.writeTimeout=600
type: String, required: no, default: Akeneo Connect
The name of the CELUM task group which synchronizes the structure into CELUM.
e.g. akeneoConnector.hierarchySync.taskGroup=Akeneo:connect
type: String, required: no, default: Hierarchy Full Sync
The name of the CELUM task which synchronizes the structure into CELUM.
e.g. akeneoConnector.hierarchySync.taskName.fullSync=Full Synchronisation
type: String, required: no, default: -
A Quartz cron expression for scheduling the full sync task. If this property is left empty, the task will only run when started manually via CELUM System Tasks.
e.g. akeneoConnector.hierarchySync.taskCron.fullSync=0 0 6/12 * * ?
type: String, required: no, default: Hierarchy Delta Sync
The name of the CELUM task which synchronizes the structure into CELUM.
e.g. akeneoConnector.hierarchySync.taskName.deltaSync=Delta Synchronisation
type: String, required: no, default: -
A Quartz cron expression for scheduling the delta sync task. If this property is left empty, the task will only run when started manually via CELUM System Tasks.
e.g. akeneoConnector.hierarchySync.taskCron.deltaSync=0 0 0-5,9-17,21-23 * * ?
type: List of Strings (comma-separated), required: no, default: -
List of e-mail addresses which will receive an error report in case of failure of a synchronisation task.
e.g. akeneoConnector.hierarchySync.errorMailRecipients=marketing@example.com,it@example.com
type: List of Strings (comma-separated), required: no, default: -
List of Akeneo family codes
If set, only products from the listed families will be synchronized, all products otherwise.
e.g. akeneoConnector.hierarchySync.familyFilter=clothing
type: Boolean, required: no, default: true
Whether to partition all products by Akeneo family and synchronize each family separately.
It is strongly recommended to leave this enabled for performance reasons, if you want to synchronize a large number of products.
type: Boolean, required: no, default: true
Whether to trigger exports to Akeneo when an asset is directly assigned to an Akeneo hierarchy node
e.g. akeneoConnector.export.triggerOnDirectAssignment=false
type: List of Integer (comma-separated), required: no, default: -
The IDs of one or many node-referencing information field which refer to the synchronized Akeneo product hierarchy
If this property is set, exports to Akeneo are triggered when one of the configured information field is updated on an asset.
e.g. akeneoConnector.export.triggerFieldId=235,236
type: Boolean, required: no, default: true (since v1.9.8-2.3 / v1.10.7-3.0)
Whether to clear the configured trigger information field when an asset is moved to the trashbin
By default, no metadata is removed when an asset is moved to the trashbin. With this property set to true, the configured trigger field is cleared when an asset is moved to the trashbin, which will consequently trigger removal of the exported asset data from Akeneo.
e.g. akeneoConnector.export.clearTriggerFieldOnMoveToTrashbin=true
type: Boolean, required: no, default: false
Whether to consider asset availability status for exports
If this property is set to true, exports to Akeneo will only be triggered if the availability status of the asset is 'active'. Furthermore, an already exported asset will be removed from Akeneo when its availability status changes to 'inactive'.
e.g. akeneoConnector.export.considerAssetAvailability=true
type: List of Long (comma-separated), required: no, default: -
Which UserGroupIDs should be able to see the "Export assets to Akeneo" context menu on assets (super-admins can always see it).
#### Akeneo Connector ####
akeneoConnector.license={provided by brix}
# API credentials
akeneoConnector.api.baseUrl=https://akeneo-demo.brix.ch
akeneoConnector.api.clientId=iue5vmu489ughstusm5tzkljxy59zuhrtshnj4w5
akeneoConnector.api.clientSecret=lkuizes5v89z4tvohjsbpgsdtg5oö8ughtgjbdg
akeneoConnector.api.username=celum_api
akeneoConnector.api.password=kljt89PpPwtgtdjigsg!
# ID of the node information field for storing the hierarchy identifier
akeneoConnector.informationFieldId.hierarchyIdentifier=301
# ID of the root node of the product hierarchy synchronized from Akeneo
akeneoConnector.hierarchySync.rootNodeId=1736
# code of the identifier attribute in akeneo
akeneoConnector.identifierAttributeCode=art_no
# prefer attribute data from ecommerce channel, fallback to print
akeneoConnector.api.channelPrecedence=ecommerce,print
# run full sync every saturday at 1 am
akeneoConnector.hierarchySync.taskCron.fullSync=0 0 1 ? * SAT
# run delta sync every 4 hours
akeneoConnector.hierarchySync.taskCron.deltaSync=0 0 0/4 * * ?
# send error report on sync task failure
akeneoConnector.hierarchySync.errorMailRecipients=marketing@example.com,it@example.com
# don't trigger exports when an asset is directly assigned to an product node
akeneoConnector.export.triggerOnDirectAssignment=false
# trigger exports when a product node is assigned via node referencing field with ID 195
akeneoConnector.export.triggerFieldId=195
# clear this information field when an asset is moved to the trash bin
akeneoConnector.export.clearTriggerFieldOnMoveToTrashbin=true
# only export 'active' assets to akeneo and remove 'inactive' ones
akeneoConnector.export.considerAssetAvailability=true
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<util:map id="akeneoConnectorHierarchyConfigsByFamily" key-type="java.lang.String" value-type="ch.brix.akeneoConnector.config.AkeneoHierarchyConfiguration">
<entry key="default">
<bean class="ch.brix.akeneoConnector.config.AkeneoHierarchyConfiguration">
<property name="filterExpressions">
<util:list>
<!-- see https://api.akeneo.com/documentation/filter.html -->
<bean class="ch.brix.akeneoConnector.config.FilterExpression">
<!-- value for query parameter 'search' -->
<constructor-arg name="expression">
<value>{"web_blocked":[{"operator":"=","value":false}],"since":[{"operator":"NOT EMPTY"}]}</value>
</constructor-arg>
<!-- value for query parameter 'search_scope' -->
<property name="channel" value="print"/>
<!-- value for query parameter 'search_locale' -->
<property name="locale" value="de_AT"/>
</bean>
<!-- FilterExpression beans on top level are connected with OR (i.e. the union of the records returned by each of them is built) -->
<bean class="ch.brix.akeneoConnector.config.FilterExpression">
<constructor-arg name="expression">
<value>{"in_shop":[{"operator":"=","value":true}]}</value>
</constructor-arg>
</bean>
</util:list>
</property>
<property name="hierarchyLevelConfigurations">
<util:list value-type="ch.brix.akeneoConnector.lib.pimSync.config.HierarchyLevelConfiguration">
<!-- family -->
<bean class="ch.brix.akeneoConnector.lib.pimSync.config.HierarchyLevelConfiguration">
<constructor-arg name="hierarchyLevel">
<bean class="ch.brix.akeneoConnector.hierarchySync.model.hierarchyLevel.FamilyLevel" factory-method="getInstance"/>
</constructor-arg>
</bean>
<!-- producer attribute -->
<bean class="ch.brix.akeneoConnector.lib.pimSync.config.HierarchyLevelConfiguration">
<constructor-arg name="hierarchyLevel">
<bean class="ch.brix.akeneoConnector.hierarchySync.model.hierarchyLevel.AttributeLevel" factory-method="getInstance">
<constructor-arg value="producer"/>
</bean>
</constructor-arg>
<constructor-arg name="labelBuilder">
<bean class="ch.brix.akeneoConnector.lib.pimSync.label.AttributeValueLabelBuilder">
<constructor-arg name="attributeCode" value="producer"/>
<property name="valueTransformer">
<bean class="ch.brix.akeneoConnector.hierarchySync.valueTransformer.ReferenceEntityRecordValueTransformer">
<constructor-arg name="referenceEntityType" value="manufacturer"/>
<constructor-arg name="referenceAttributeCode" value="name"/>
<constructor-arg name="cacheTtlInMinutes" value="480"/>
<property name="prefetchAllData" value="false"/>
</bean>
</property>
</bean>
</constructor-arg>
</bean>
<!-- product model level 1 -->
<bean class="ch.brix.akeneoConnector.lib.pimSync.config.HierarchyLevelConfiguration">
<constructor-arg name="hierarchyLevel">
<bean class="ch.brix.akeneoConnector.hierarchySync.model.hierarchyLevel.ProductModelLevel" factory-method="getInstance">
<constructor-arg value="1"/>
</bean>
</constructor-arg>
<!-- custom LabelBuilder: Product model identifier followed by value of attribute 'product_name' separated by pipe -->
<constructor-arg name="labelBuilder">
<bean class="ch.brix.akeneoConnector.lib.pimSync.label.ConcatLabelBuilder">
<constructor-arg name="labelBuilders">
<util:list>
<bean class="ch.brix.akeneoConnector.lib.pimSync.label.IdLabelBuilder"/>
<bean class="ch.brix.akeneoConnector.lib.pimSync.label.AttributeValueLabelBuilder">
<constructor-arg name="attributeCode" value="product_name"/>
</bean>
</util:list>
</constructor-arg>
<property name="delimiter" value=" | "/>
</bean>
</constructor-arg>
</bean>
<!-- product model level 2 -->
<bean class="ch.brix.akeneoConnector.lib.pimSync.config.HierarchyLevelConfiguration">
<constructor-arg name="hierarchyLevel">
<bean class="ch.brix.akeneoConnector.hierarchySync.model.hierarchyLevel.ProductModelLevel" factory-method="getInstance">
<constructor-arg value="2"/>
</bean>
</constructor-arg>
</bean>
<!-- product -->
<bean class="ch.brix.akeneoConnector.lib.pimSync.config.HierarchyLevelConfiguration">
<constructor-arg name="hierarchyLevel">
<bean class="ch.brix.akeneoConnector.hierarchySync.model.hierarchyLevel.ProductLevel" factory-method="getInstance"/>
</constructor-arg>
<property name="defaultImportMappingsByPropertyExpression">
<util:map>
<entry key="ean" value="113"/>
<entry key="description" value="120"/>
</util:map>
</property>
<property name="importMappingsByPropertyExpression">
<util:map>
<entry key="multiValueAttribute">
<bean class="ch.brix.akeneoConnector.lib.mappingTypes.infofield.NodeReferencingInfofieldByMultiNameMapping">
<property name="infofieldId" value="228"/>
<property name="exclusive" value="true"/>
<property name="doUpdateCheck" value="true"/>
<property name="clearOnEmptyValue" value="true"/>
<property name="overwrite" value="true"/>
<property name="localizedNodeFinder">
<bean class="ch.brix.akeneoConnector.lib.nodeFinder.DefaultNodeFinder">
<property name="rootNodeId" value="180575"/>
<property name="createIfNotFound" value="true"/>
<property name="adaptOtherLocales" value="true"/>
<property name="matchType" value="EXACT_CASE_INSENSITIVE"/>
</bean>
</property>
</bean>
</entry>
</util:map>
</property>
<property name="exportMappings">
<util:list>
<!-- export asset ID to text attribute -->
<bean class="ch.brix.akeneoConnector.assetExport.exportMapping.AssetIdExportMapping">
<constructor-arg name="attributeCode" value="celum_asset_id"/>
<!-- overwrite attribute value instead of appending to current value -->
<property name="overwriteValue" value="true"/>
</bean>
<!-- export asset name to text attribute -->
<bean class="ch.brix.akeneoConnector.assetExport.exportMapping.AssetNameExportMapping">
<constructor-arg name="attributeCode" value="celum_asset_name"/>
</bean>
<!-- export Public URL to text attribute -->
<bean class="ch.brix.akeneoConnector.assetExport.exportMapping.PublicUrlExportMapping">
<constructor-arg name="attributeCode" value="celum_public_url"/>
<!-- CELUM Public URLs are identified by a description, provider and an optional provider instance -->
<property name="urlDescription" value="video"/>
<property name="providerFilter">
<bean class="com.celum.api.model.ProviderFilter">
<constructor-arg name="provider" value="youtube"/>
<!-- optional instance identifier -->
<constructor-arg name="instance" value="instance123"/>
</bean>
</property>
<!-- delimit multiple values by line break instead of comma -->
<property name="delimiter" value="\n"/>
</bean>
<!-- export asset binary to media file attribute -->
<bean class="ch.brix.akeneoConnector.assetExport.exportMapping.MediaFileExportMapping">
<constructor-arg name="attributeCode" value="picture"/>
<constructor-arg name="binaryUrlProvider">
<bean class="ch.brix.akeneoConnector.lib.pimSync.model.export.binaryUrlProvider.CustomFormatBinaryUrlProvider">
<constructor-arg name="downloadFormatId" value="17"/>
</bean>
</constructor-arg>
</bean>
<!-- export asset binary to asset collection attribute -->
<bean class="ch.brix.akeneoConnector.assetExport.exportMapping.AkeneoAssetExportMapping">
<constructor-arg name="attributeCode" value="celum_assets"/>
<constructor-arg name="binaryUrlProvider">
<bean class="ch.brix.akeneoConnector.lib.pimSync.model.export.binaryUrlProvider.StandardFormatBinaryUrlProvider">
<constructor-arg name="representationTypeId" value="prvw"/>
</bean>
</constructor-arg>
<!-- optional export condition: Export only if condition holds -->
<property name="exportCondition">
<bean class="ch.brix.akeneoConnector.lib.pimSync.model.export.condition.AssetNameExportCondition">
<constructor-arg name="regex" value="^[A-Z]{2}\d{2}-[A-Z0-9]\d{2}_\d{5}_front\.\w+$"/>
<constructor-arg name="caseSensitive" value="false"/>
</bean>
</property>
<!-- omit if attribute is not scoped by channel -->
<property name="channelCode" value="ecommerce"/>
<!-- omit if attribute is not scoped by locale -->
<property name="locale" value="en_US"/>
</bean>
<!-- export to Asset Manager -->
<bean class="ch.brix.akeneoConnector.assetExport.exportMapping.AssetManagerExportMapping">
<constructor-arg name="assetFamilyCode" value="celum_assets"/>
<constructor-arg name="assetCodeExpression" value="product.code"/> <!-- "product.code" or "asset.id" -->
<constructor-arg name="productAttributeCode" value="assets"/>
<property name="assetIdAttributeCode" value="celum_id"/>
<property name="removeAssetFromProduct" value="true"/>
<constructor-arg name="assetAttributeExportMappings">
<set>
<bean class="ch.brix.akeneoConnector.assetExport.exportMapping.assetAttribute.text.AssetIdAssetAttributeExportMapping">
<constructor-arg name="attributeCode" value="celum_id"/>
</bean>
<bean class="ch.brix.akeneoConnector.assetExport.exportMapping.assetAttribute.text.AssetNameAssetAttributeExportMapping">
<constructor-arg name="attributeCode" value="celum_name"/>
<property name="locale" value="de_DE"/> <!-- optional -->
<property name="channelCode" value="ecommerce"/> <!-- optional -->
</bean>
<bean class="ch.brix.akeneoConnector.assetExport.exportMapping.assetAttribute.text.PublicUrlAssetAttributeExportMapping">
<constructor-arg name="attributeCode" value="cdn_url"/>
<!-- CELUM Public URLs are identified by a description, provider and an optional provider instance -->
<property name="urlDescription" value="cdnImage1"/>
<!-- optional -->
<property name="providerFilter">
<bean class="com.celum.api.model.ProviderFilter">
<constructor-arg name="provider" value="exporter"/>
<!-- optional instance identifier -->
<constructor-arg name="instance" value="instance123"/>
</bean>
</property>
</bean>
<bean class="ch.brix.akeneoConnector.assetExport.exportMapping.assetAttribute.binary.MediaFileAssetAttributeExportMapping">
<constructor-arg name="attributeCode" value="media"/>
<constructor-arg name="binaryUrlProvider">
<bean class="ch.brix.akeneoConnector.lib.pimSync.model.export.binaryUrlProvider.CustomFormatBinaryUrlProvider">
<constructor-arg name="downloadFormatId" value="17"/>
</bean>
</constructor-arg>
</bean>
</set>
</constructor-arg>
</bean>
</util:list>
</property>
</bean>
</util:list>
</property>
</bean>
</entry>
</util:map>
</beans>
If there are mappings of data from Akeneo to CELUM, they will be written on the information field of the product node. To copy them from the node to all assigned Assets, we recommend using our extension Carbon Copy
If you like to see in general which assets are used in Akeneo, we recommend using our extension Asset Marker
CELUM | Akeneo | Akeneo Connect |
---|---|---|
5.13.3 - 6.3 | 2.0 - 2.3 | 1.0.0 - 1.9.x |
5.13.3 - 6.3 | 3.0 - 3.2 | 1.10.0 - 1.14.x |
6.4 - 6.8 | 3.0 - 3.2 | 1.14.1 and above |
5.13.3 - 6.3 | 4.0 - 6.0 | 1.20.0 and above |
6.4 - 6.8 | 4.0 - 6.0 | 1.20.0-6.4 and above |
6.9 (21.2) | 4.0 - 6.0 | 1.20.0-6.9 and above |
6.13 (22.4) | 4.0 - 6.0 | 1.23.14-6.9 and above |
6.15 (23.1) and above | 4.0 - 7.0 | 1.31.2-a6.0-c6.9 and above |
Released 2018-11-01
Released 2018-11-08
Released 2018-11-29
Released 2018-12-04
Released 2019-01-31
Released 2019-02-20
Released 2019-03-05
Released 2019-03-13
Released 2019-03-25
Released 2019-04-11
Released 2019-05-14
Released 2019-06-12
Released 2019-06-27
Released 2020-02-04
Released 2020-05-13
Released 2020-12-08
Released 2021-08-11
Released 2021-08-24
Released 2022-01-18
Released 2023-05-10
Released 2023-07-12
Released 2023-07-19
Released 2024-01-25
Released 2024-07-17