> ## Documentation Index
> Fetch the complete documentation index at: https://cloudinary.com/documentation/llms.txt
> Use this file to discover all available pages before exploring further.

# Sync assets to Akeneo


When you use Akeneo as your Product Information Management (PIM) system, you may want to sync your Cloudinary media assets to Akeneo and link them to products. MediaFlows provides several approaches to automate this synchronization, from simple manual triggers to fully automated workflows based on metadata changes.

This page describes multiple sample PowerFlows for syncing assets to Akeneo, each suited to different workflow requirements.

* [Sync from Assets](#sync_from_assets): Manually trigger syncs from the Media Library, providing parameters (SKU, asset family, attribute) at runtime. Ideal when users need full control over which assets to sync.
* [Sync on structured metadata change](#sync_on_structured_metadata_change): Automatically trigger syncs when users update a status field in structured metadata. Perfect for defined workflows where teams prepare asset metadata before syncing.
* [Scheduled retry for failed syncs](#scheduled_retry_for_failed_syncs): Periodically search for and retry assets stuck in a "requires link" state, providing a safety net for failed syncs.

[Learn more about the Akeneo blocks](mediaflows_block_reference#akeneo).

## Prerequisites

Before building any of the flows described on this page, ensure you have:

* An Akeneo account with API access credentials (Client ID, Client Secret, Username, Password, and Host URL)
* Appropriate asset families configured in Akeneo with the attributes you need

> **INFO**:
>
> All flows that interact with Akeneo require a **Get Tokens From Akeneo** block at the start. This block authenticates with Akeneo and provides an access token that all subsequent Akeneo blocks use.

## Sync from Assets

The simplest approach lets users manually trigger a sync from the Media Library. Users select an asset, right-click, and run the automation, providing the required Akeneo parameters at that time.

This approach is ideal when:

* Users need full control over which assets to sync
* The sync parameters (asset family, attribute, SKU) vary per asset
* You don't want to pre-configure metadata on assets

### Overview

![Sync to Akeneo from Assets](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_to_akeneo_from_assets.png "thumb: c_scale,w_800/dpr_2.0, width:800, popup:true")

The PowerFlow uses the following blocks:

* [On Manual Run From Assets](#on_manual_run_from_assets): Triggers the flow from the Media Library context menu, collecting user input.
* [Get Tokens From Akeneo](#get_tokens_from_akeneo): Authenticates with Akeneo to get an access token.
* [Join Strings](#join_strings): Creates a unique Akeneo asset code by combining the SKU and Cloudinary asset ID.
* [Update Structured Metadata](#update_structured_metadata) (x3): Stores the sync parameters (SKU, family, attribute) on the Cloudinary asset for future reference.
* [Create An Asset In Akeneo](#create_an_asset_in_akeneo): Creates the asset in Akeneo's Asset Manager.

### Metadata setup

Before building this flow, create the following [structured metadata](dam_admin_structured_metadata) fields in your Cloudinary product environment:

| Field Name | Type | Description |
|------------|------|-------------|
| Akeneo SKU | Text | The product SKU |
| Akeneo Family | Text | The Akeneo asset family |
| Akeneo Attribute | Text | The attribute where the Cloudinary URL will be stored |

![Metadata for Akeneo sync from Assets](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/akeneo_smd.png "thumb: c_scale,w_700/dpr_2.0, width:700, popup:true")

### On Manual Run From Assets

The **On Manual Run From Assets** block creates a context menu option in the Media Library, allowing users to trigger the sync and provide the required parameters.

Steps:

1. Add the **On Manual Run From Assets** block to your canvas.
1. Open the block configuration and set:
   * **Description**: `Sync to Akeneo`
1. Add user **Input parameters** (under **More options**):
   * **SKU**: The product SKU to link the asset to
   * **Asset_Family**: The Akeneo asset family (e.g., `atmosphere`, `packshots`)
   * **Asset_Attribute**: The attribute where the Cloudinary URL will be stored (e.g., `link_atmosphere`)
  
      Later, the flow will save the values of these parameters as metadata on the asset.

![On Manual Run From Assets configuration](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_trigger.png "thumb: c_scale,w_600/dpr_2.0, width:600, popup:true")

### Get Tokens From Akeneo

The **Get Tokens From Akeneo** block authenticates with Akeneo and provides an access token for subsequent blocks.

Steps:

1. Add the **Get Tokens From Akeneo** block to your canvas and ensure it's connected to the **On Manual Run From Assets** block.
1. Open the block configuration and enter your Akeneo credentials:
   * **Host URL**: Your Akeneo instance URL (e.g., `https://your-instance.cloud.akeneo.com`)
   * **Client ID**: From your Akeneo connection settings
   * **Client Secret**: From your Akeneo connection settings
   * **Username**: Your Akeneo username
   * **Password**: Your Akeneo password

![Get Tokens From Akeneo configuration](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_get_tokens.png "thumb: c_scale,w_600/dpr_2.0, width:600, popup:true")

> **TIP**: Create a dedicated connection in Akeneo for MediaFlows to keep credentials separate and manageable.

### Join Strings

The **Join Strings** block creates a unique Akeneo asset code by combining the SKU and Cloudinary asset ID. This ensures uniqueness even when linking multiple images to the same product, or the same image to multiple products.

> **NOTE**: The asset code may contain only letters, numbers and underscores.

Steps:

1. Add the **Join Strings** block to your canvas and ensure it's connected to the **Get Tokens From Akeneo** block.
1. Open the block configuration and set:
   * **First string**: Click `+` to add the SKU variable from the **On Manual Run From Assets** block
   * **Second string**: Click `+` to add the Asset ID from the **On Manual Run From Assets** block (enter `asset_id` in the **Manual** section)
   * **Separator**: Add the separator `__` (double underscore)
    
The resulting asset code format is: `{SKU}__{asset_id}` (e.g., `PROD001__abc123def456`).

![Join Strings configuration](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_join_strings.png "thumb: c_scale,w_600/dpr_2.0, width:600, popup:true")

> **NOTE**: The asset code must be unique in Akeneo. By combining the SKU with the Cloudinary asset ID, you can link multiple images to the same product while ensuring each asset code is unique.

### Update Structured Metadata

Store the sync parameters on the Cloudinary asset using three **Update Structured Metadata** blocks. This is important for:

* Enabling future searches to find synced assets
* Providing a reference for deletion workflows
* Allowing users to see sync status in the Media Library

> **INFO**: Make sure you've created the structured metadata fields described in [Metadata setup](#metadata_setup) before adding these blocks.

Steps:

1. Add an **Update Structured Metadata** block to your canvas and ensure it's connected to the **Join Strings** block.
1. Rename the block to `Update Akeneo SKU` by clicking the title.
1. Configure the block:
   * **Structured metadata field**: Select `Akeneo SKU` from the list.
   * **Structured metadata value**: Select the SKU from **On Manual Run From Assets**
1. Add a second **Update Structured Metadata** block and ensure it's connected to the first.
1. Rename the block to `Update Akeneo Family`.
1. Configure the block:
   * **Structured metadata field**: Select `Akeneo Family` from the list.
   * **Structured metadata value**: Select the Asset Family from **On Manual Run From Assets**
1. Add a third **Update Structured Metadata** block and ensure it's connected to the second.
1. Rename the block to `Update Akeneo Attribute`.
1. Configure the block:
   * **Structured metadata field**: Select `Akeneo Attribute` from the list.
   * **Structured metadata value**: Select the Asset Attribute from **On Manual Run From Assets**

![Update Structured Metadata configuration](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_update_structured_metadata.png "thumb: c_scale,w_600/dpr_2.0, width:600, popup:true")

### Create An Asset In Akeneo

The **Create An Asset In Akeneo** block creates the asset in Akeneo's Asset Manager and optionally links it to a product.

Steps:

1. Add the **Create An Asset In Akeneo** block to your canvas and ensure it's connected to the third **Update Structured Metadata** block.
1. Open the block configuration and set:
   * **Host URL**: Your Akeneo instance URL
   * **Access token**: Select the token from the **Get Tokens From Akeneo** block
   * **Media URL**: Select the Secure URL from the trigger
   * **Asset code**: Select the result from the **Join Strings** block
   * **Asset family**: Select the Asset Family from **On Manual Run From Assets**
   * **Asset attribute**: Select the Asset Attribute from **On Manual Run From Assets**

![Create An Asset In Akeneo configuration](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_create_asset_in_akeneo.png "thumb: c_scale,w_600/dpr_2.0, width:600, popup:true")

> **TIP**: To automatically link assets to products, configure [Product Link Rules](https://help.akeneo.com/pim/v4/articles/assets-product-link-rules.html) in Akeneo to parse your asset code format and extract the SKU.

## Sync on structured metadata change

For a more automated approach, trigger the sync when users update structured metadata on an asset. This workflow lets users prepare asset metadata in the Media Library and then trigger the sync by changing a status field.

This approach is ideal when:

* You have a defined workflow for asset preparation
* Multiple team members need to tag assets before syncing
* You want to separate metadata preparation from the sync action

### Overview

![Sync to Akeneo on metadata change](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_smd.png "thumb: c_scale,w_800/dpr_2.0, width:800, popup:true")

The PowerFlow uses the following blocks:

* [On Structured Metadata Change](#on_structured_metadata_change): Triggers when the sync status changes to "Requires link".
* [Get Tokens From Akeneo](#get_tokens_from_akeneo-1): Authenticates with Akeneo.
* [Get Structured Metadata](#get_structured_metadata) (x3): Retrieves the metadata values (SKU, family, attribute) needed for the sync.
* [Get Asset Information](#get_asset_information): Retrieves the asset's secure URL needed for syncing to Akeneo.
* [Join Strings](#join_strings-1): Creates the unique Akeneo asset code.
* [Create An Asset In Akeneo](#create_an_asset_in_akeneo-1): Creates the asset in Akeneo.
* [Update Structured Metadata](#update_status_on_completion): Updates the status to "Linked" on success.

### Metadata setup

Before building this flow, create the following [structured metadata](dam_admin_structured_metadata) fields in your Cloudinary product environment:

| Field Name | Type | Values | Description |
|------------|------|--------|-------------|
| Akeneo Status | Single-selection list | `Requires Link`, `Linked`, `Requires Unlink` | Controls the sync action |
| Akeneo Sku | Text | - | The product SKU |
| Akeneo Family | Text | - | The Akeneo asset family |
| Akeneo Attribute | Text | - | The attribute where the Cloudinary URL will be stored |

![Metadata for Akeneo sync from structured metadata](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_smd_smd.png "thumb: c_scale,w_700/dpr_2.0, width:700, popup:true")

### On Structured Metadata Change

The **On Structured Metadata Change** block triggers the flow when the `Akeneo Status` field changes.

Steps:

1. Add the **On Structured Metadata Change** block to your canvas.
1. Open the block configuration and set it to trigger whenever the new value for `Akeneo Status` is `Requires link` and only for images.

![On Structured Metadata Change configuration](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_smd_on_structured_metadata_change.png "thumb: c_scale,w_600/dpr_2.0, width:600, popup:true")

### Get Tokens From Akeneo

The **Get Tokens From Akeneo** block authenticates with Akeneo and provides an access token for subsequent blocks.

Steps:

1. Add the **Get Tokens From Akeneo** block to your canvas and ensure it's connected to the **On Structured Metadata Change** block.
1. Open the block configuration and enter your Akeneo credentials:
   * **Host URL**: Your Akeneo instance URL (e.g., `https://your-instance.cloud.akeneo.com`)
   * **Client ID**: From your Akeneo connection settings
   * **Client Secret**: From your Akeneo connection settings
   * **Username**: Your Akeneo username
   * **Password**: Your Akeneo password

![Get Tokens From Akeneo configuration](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_smd_get_tokens.png "thumb: c_scale,w_600/dpr_2.0, width:600, popup:true")

### Get Structured Metadata

Retrieve the metadata values needed for the sync using three **Get Structured Metadata** blocks, since the trigger only provides information about what changed.

Steps:

1. Add a **Get Structured Metadata** block to your canvas and ensure it's connected to the **Get Tokens From Akeneo** block.
1. Rename the block to `Get Akeneo SKU`.
1. Configure the block:
   * **Structured metadata field**: `Akeneo SKU`
1. Add a second **Get Structured Metadata** block and ensure it's connected to the first.
1. Rename the block to `Get Akeneo Family`.
1. Configure the block:
   * **Structured metadata field**: `Akeneo Family`
1. Add a third **Get Structured Metadata** block and ensure it's connected to the second.
1. Rename the block to `Get Akeneo Attribute`.
1. Configure the block:
   * **Structured metadata field**: `Akeneo Attribute`

![Get Structured Metadata configuration](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_smd_get_smd.png "thumb: c_scale,w_600/dpr_2.0, width:600, popup:true")

### Get Asset Information

The **Get Asset Information** block retrieves asset details including the secure URL, which is needed for the Create An Asset In Akeneo block. The trigger doesn't provide the secure URL, so this block is required.

Steps:

1. Add a **Get Asset Information** block to your canvas and ensure it's connected to the third **Get Structured Metadata** block.

![Get Asset Information configuration](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_smd_get_asset_information.png "thumb: c_scale,w_600/dpr_2.0, width:600, popup:true")

### Join Strings

The **Join Strings** block creates a unique Akeneo asset code by combining the SKU and Cloudinary asset ID.

Steps:

1. Add the **Join Strings** block to your canvas and ensure it's connected to the **Get Asset Information** block.
1. Open the block configuration and set:
   * **First string**: Click `+` to add the result from the **Get Akeneo SKU** block
   * **Second string**: Click `+` to add the Asset ID from the **On Structured Metadata Change** block (enter `resources[0].asset_id` in the **Manual** section)
   * **Separator**: Add the separator `__` (double underscore)

![Join Strings configuration](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_smd_join_strings.png "thumb: c_scale,w_600/dpr_2.0, width:600, popup:true")

### Create An Asset In Akeneo

The **Create An Asset In Akeneo** block creates the asset in Akeneo's Asset Manager.

Steps:

1. Add the **Create An Asset In Akeneo** block to your canvas and ensure it's connected to the **Join Strings** block.
1. Open the block configuration and set:
   * **Host URL**: Your Akeneo instance URL
   * **Access token**: Select the token from the **Get Tokens From Akeneo** block
   * **Media URL**: Select the Secure URL from the **Get Asset Information** block
   * **Asset code**: Select the result from the **Join Strings** block
   * **Asset family**: Select the result from the **Get Akeneo Family** block
   * **Asset attribute**: Select the result from the **Get Akeneo Attribute** block

![Create An Asset In Akeneo configuration](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_smd_create_asset_in_akeneo.png "thumb: c_scale,w_600/dpr_2.0, width:600, popup:true")

### Update status on completion

After successfully creating the asset in Akeneo, update the status to indicate completion:

1. Add an **Update Structured Metadata** block after the **Create An Asset In Akeneo** block.
1. Set `Akeneo Status` to `Linked`.

![Update Structured Metadata configuration](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_smd_update_structured_metadata.png "thumb: c_scale,w_600/dpr_2.0, width:600, popup:true")

This status update serves multiple purposes:

* Indicates successful sync to users viewing the asset
* Prevents the flow from re-triggering on the same asset
* Enables searching for synced vs. unsynced assets

### Delete on status change

To handle asset removal, create a separate flow (or branch in the same flow) that triggers when the status changes to `Requires unlink`:

1. Trigger on `Akeneo Status` changing to `Requires unlink`
1. Get Tokens From Akeneo
1. Get Structured Metadata (to retrieve asset family and code)
1. Delete An Asset In Akeneo
1. Update status to clear the linked state

> **INFO**: To delete an asset from Akeneo, you need the Asset Family and Asset Code. This is why it's important to store these values in Cloudinary metadata when you create the asset.

## Scheduled retry for failed syncs

Syncs can fail for various reasons: invalid metadata, network issues, or Akeneo being temporarily unavailable. A scheduled retry flow provides a safety net by periodically attempting to sync assets that are stuck in a "requires link" state.

This approach complements the [metadata-triggered](#sync_on_structured_metadata_change) flow by:

* Retrying failed syncs automatically
* Catching any assets that were missed
* Providing a backup mechanism for reliability

### Overview

![Scheduled retry flow](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_scheduled_retry.png "thumb: c_scale,w_800/dpr_2.0, width:800, popup:true")

The PowerFlow uses the following blocks:

* [On Scheduled Search](#on_scheduled_search): Runs periodically to find assets needing sync.
* [Iterate Assets](#iterate_assets): Processes each asset found by the search individually.
* [Scheduled Email Report](#scheduled_email_report): Sends a daily email report summarizing the assets processed by the flow.
* [Get Tokens From Akeneo](#get_tokens_from_akeneo-2): Authenticates with Akeneo.
* [Get Structured Metadata](#get_structured_metadata-1) (x3): Retrieves the sync parameters (SKU, family, attribute) for each asset.
* [Get Asset Information](#get_asset_information-1): Retrieves the asset's secure URL needed for syncing to Akeneo.
* [Join Strings](#join_strings-2): Creates the unique Akeneo asset code.
* [Create An Asset In Akeneo](#create_an_asset_in_akeneo-2): Attempts to create the asset.
* [Update Structured Metadata](#update_structured_metadata): Updates the status to "Linked" on success.

### On Scheduled Search

The **On Scheduled Search** block runs a search query at specified intervals to find assets that need syncing.

Steps:

1. Add the **On Scheduled Search** block to your canvas.
1. Open the block configuration and set:
   * **Recurring schedule**: Daily (or more frequent as needed), `0 10 * * ? *` is every dat at 10am.
   * **Search expression**: `metadata.akeneo_status="requires_link"`
   * **Max results**: Set an appropriate limit

![On Scheduled Search configuration](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_scheduled_retry_trigger.png "thumb: c_scale,w_600/dpr_2.0, width:600, popup:true")

### Iterate Assets

The **Iterate Assets** block processes each asset found by the search individually, allowing the subsequent blocks to run once per asset.

Steps:

1. Add an **Iterate Assets** block to your canvas and ensure it's connected to the **On Scheduled Search** block.
1. Open the block configuration and set:
   * **Source of asset list**: Select `resources` from the **On Scheduled Search** block.
   * **Run in parallel**: Select `Yes` to run the flow for all assets simultaneously.

![Iterate Assets configuration](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_scheduled_retry_iterate.png "thumb: c_scale,w_600/dpr_2.0, width:600, popup:true")

### Scheduled Email Report

The **Scheduled Email Report** block sends a daily email summary of the assets processed by the flow. The email is sent at the configured time and includes details of all the assets that reach this block in a 24-hour period.

Steps:

1. Add a **Scheduled Email Report** block to your canvas and ensure it's connected to the **Iterate Assets** block.
1. Open the block configuration and set:
   * **Recipients**: A comma-separated list of email addresses to receive the report
   * **Time**: The UTC time that you want MediaFlows to send the email (e.g., `10:00`)
   * **Report name**: The subject of the email, e.g. `Retries for failed Akeneo syncs from metadata`
   * **Description**: Text for the body of the email, e.g. `These assets were scheduled for retry syncing to Akeneo.` 

![Scheduled Email Report configuration](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_scheduled_email_report.png "thumb: c_scale,w_600/dpr_2.0, width:600, popup:true")

Here's an example of how the email may look:

![Email Report example](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/mf_retries_email.png "thumb: c_scale,w_600/dpr_2.0, width:600, popup:true")

### Get Tokens From Akeneo

The **Get Tokens From Akeneo** block authenticates with Akeneo and provides an access token for subsequent blocks.

Steps:

1. Add the **Get Tokens From Akeneo** block to your canvas and ensure it's connected to the **Scheduled Email Report** block.
1. Open the block configuration and enter your Akeneo credentials:
   * **Host URL**: Your Akeneo instance URL (e.g., `https://your-instance.cloud.akeneo.com`)
   * **Client ID**: From your Akeneo connection settings
   * **Client Secret**: From your Akeneo connection settings
   * **Username**: Your Akeneo username
   * **Password**: Your Akeneo password

![Get Tokens From Akeneo configuration](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_scheduled_get_tokens.png "thumb: c_scale,w_600/dpr_2.0, width:600, popup:true")

### Get Structured Metadata

Retrieve the sync parameters for each asset found by the search using three **Get Structured Metadata** blocks.

Steps:

1. Add a **Get Structured Metadata** block to your canvas and ensure it's connected to the **Get Tokens From Akeneo** block.
1. Rename the block to `Get Akeneo SKU`.
1. Configure the block:
   * **Structured metadata field**: `Akeneo SKU`
1. Add a second **Get Structured Metadata** block and ensure it's connected to the first.
1. Rename the block to `Get Akeneo Family`.
1. Configure the block:
   * **Structured metadata field**: `Akeneo Family`
1. Add a third **Get Structured Metadata** block and ensure it's connected to the second.
1. Rename the block to `Get Akeneo Attribute`.
1. Configure the block:
   * **Structured metadata field**: `Akeneo Attribute`

![Get Structured Metadata configuration](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_scheduled_get_smd.png "thumb: c_scale,w_600/dpr_2.0, width:600, popup:true")

### Get Asset Information

The **Get Asset Information** block retrieves asset details including the secure URL, which is needed for the **Create An Asset In Akeneo** block.

Steps:

1. Add a **Get Asset Information** block to your canvas and ensure it's connected to the third **Get Structured Metadata** block.

![Get Asset Information configuration](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_scheduled_retry_get_asset_info.png "thumb: c_scale,w_600/dpr_2.0, width:600, popup:true")

### Join Strings

The **Join Strings** block creates a unique Akeneo asset code by combining the SKU and Cloudinary asset ID.

Steps:

1. Add the **Join Strings** block to your canvas and ensure it's connected to the **Get Asset Information** block.
1. Open the block configuration and set:
   * **First string**: Click `+` to add the result from the **Get Akeneo SKU** block
   * **Second string**: Click `+` to add the Asset ID from the **Iterate Assets** block
   * **Separator**: Add the separator `__` (double underscore)

![Join Strings configuration](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_scheduled_retry_join_strings.png "thumb: c_scale,w_600/dpr_2.0, width:600, popup:true")

### Create An Asset In Akeneo

The **Create An Asset In Akeneo** block attempts to create the asset in Akeneo's Asset Manager.

Steps:

1. Add the **Create An Asset In Akeneo** block to your canvas and ensure it's connected to the **Join Strings** block.
1. Open the block configuration and set:
   * **Host URL**: Your Akeneo instance URL
   * **Access token**: Select the token from the **Get Tokens From Akeneo** block
   * **Media URL**: Select the Secure URL from the **Get Asset Information** block
   * **Asset code**: Select the result from the **Join Strings** block
   * **Asset family**: Select the result from the **Get Akeneo Family** block
   * **Asset attribute**: Select the result from the **Get Akeneo Attribute** block

![Create An Asset In Akeneo configuration](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_scheduled_retry_create_asset.png "thumb: c_scale,w_700/dpr_2.0, width:700, popup:true")

### Update Structured Metadata

After successfully creating the asset in Akeneo, update the status to indicate completion.

Steps:

1. Add an **Update Structured Metadata** block to your canvas and ensure it's connected to the **Create An Asset In Akeneo** block.
1. Configure the block:
   * **Structured metadata field**: Select `Akeneo Status` from the list.
   * **Structured metadata value**: Select or enter `Linked`

![Update Structured Metadata configuration](https://cloudinary-res.cloudinary.com/image/upload/bo_2px_solid_gray/f_auto/q_auto/docs/mediaflows/sync_akeneo_scheduled_retry_update_smd.png "thumb: c_scale,w_600/dpr_2.0, width:600, popup:true")

## Sync product information to Cloudinary

After syncing an asset to Akeneo and linking it to a product, you may want to pull product information back to Cloudinary. This enriches your Cloudinary assets with product data like name, description, or category.

Add the following blocks after creating an asset in Akeneo:

1. **Get Product Information From Akeneo**: Retrieves product details using the SKU.
1. **Update Structured Metadata**: Stores selected product attributes as Cloudinary metadata.

This enables:

* Searching for assets by product attributes in Cloudinary
* Displaying product context in the Media Library
* Using product data in transformations or delivery URLs

> **READING**:
>
> * [Akeneo block reference](mediaflows_block_reference#akeneo)

> * [Structured metadata](structured_metadata)

> * [Build a flow](mediaflows_build_flow)

> * [Sample PowerFlows](mediaflows_sample_powerflows)
