{"id":22541,"date":"2021-11-02T15:21:37","date_gmt":"2021-11-02T15:21:37","guid":{"rendered":"http:\/\/build_workflows_with_cloudinary_s_mediaflows"},"modified":"2025-03-02T09:44:24","modified_gmt":"2025-03-02T17:44:24","slug":"build_workflows_with_cloudinary_s_mediaflows","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows","title":{"rendered":"Build Workflows With Cloudinary\u2019s MediaFlows"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>Many of you who work with the Cloudinary platform have a media-associated workflow for moderation of images, dispatch of notifications with certain data or headers, implementation of activities through add-ons, etc. For most of those cases, Cloudinary would suggest that you take advantage of our <a href=\"https:\/\/cloudinary.com\/documentation\/notifications\">webhook notifications<\/a> and build the workflow with an infrastructure like AWS Lambda. This post describes how to do that with Cloudinary\u2019s <a href=\"https:\/\/mediaflows.cloudinary.com\/\">MediaFlows<\/a> a <strong>beta<\/strong> product that helps tackle management and operational tasks related to visual media.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/image\/upload\/w_700,c_fill,f_auto,q_auto,dpr_2.0\/Web_Assets\/blog\/godafoss-1840758_1280.jpg\" alt=\"Waterfall\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1400\" height=\"933\"\/><\/p>\n<p>What exactly is MediaFlows, you wonder? Here\u2019s the official description:<\/p>\n<p><em>MediaFlows connects Cloudinary\u2019s APIs and services with a visual interface. Developers and marketers can design, deploy, and automate custom media applications and processes in minutes, not days.<\/em><\/p>\n<p>Based on drag-and-drop, MediaFlows automates the process of receiving notifications and acting on the changes to your media resources on Cloudinary. The simple use case below typifies a MediaFlows process:<\/p>\n<ol>\n<li>You upload images to Cloudinary.<\/li>\n<li>You move the images to a designated folder with a preset, which also enables manual moderation.<\/li>\n<li>The moderators review the images and approve or reject the media.<\/li>\n<li>Cloudinary automatically moves the approved images to a folder called Approved.<\/li>\n<\/ol>\n<div class='c-callout  c-callout--inline-title c-callout--note'><strong class='c-callout__title'>Note:<\/strong> <p>For an in-depth discussion of moderation with Cloudinary, see <a href=\"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api\">Nadav Soferman\u2019s article<\/a>.<\/p><\/div>\n<p>Below is a tutorial that shows you how to create workflows with Cloudinary\u2019s MediaFlows.<\/p>\n<h2>Step 1: Upload Images to Cloudinary<\/h2>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/image\/upload\/w_500,c_fill,f_auto,q_auto,dpr_2.0\/Web_Assets\/blog\/step1.png\" alt=\"Step 1\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"500\" height=\"226\"\/><\/p>\n<p>First, ensure that uploaded images to Cloudinary land in a certain folder, marked for moderation. Do the following:<\/p>\n<ol>\n<li>Create an <a href=\"https:\/\/cloudinary.com\/documentation\/upload_presets\">upload preset<\/a> in which to specify a folder called <code>toBeModerated<\/code> as the target.<\/li>\n<li>Set up this parameter: <code>Auto Moderation: manual<\/code>.<\/li>\n<li>Name the preset <code>moderate<\/code>.<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/image\/upload\/w_700,c_fill,f_auto,q_auto,dpr_2.0\/Web_Assets\/blog\/upload_preset_example.png\" alt=\"Example of an upload preset\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1400\" height=\"459\"\/><\/p>\n<p>You can browse the settings of the preset with the <a href=\"https:\/\/cloudinary.com\/documentation\/admin_api#get_the_details_of_a_single_upload_preset\">Admin API<\/a>.<\/p>\n<pre class=\"js-syntax-highlighted\"><code>$ cld admin upload_preset moderate\n\n{\n &quot;name&quot;: &quot;moderate&quot;,\n &quot;unsigned&quot;: false,\n &quot;settings&quot;: {\n   &quot;overwrite&quot;: true,\n   &quot;use_filename&quot;: true,\n   &quot;unique_filename&quot;: false,\n   &quot;type&quot;: &quot;upload&quot;,\n   &quot;moderation&quot;: &quot;manual&quot;,\n   &quot;folder&quot;: &quot;toBeModerated&quot;\n }\n}\n<\/code><\/pre>\n<h2>Step 2: Create the MediaFlow<\/h2>\n<p>Now create a MediaFlows account and link it to your Cloudinary account, as follows.<\/p>\n<h3>Sign Up With MediaFlows<\/h3>\n<ol>\n<li>Go to <a href=\"https:\/\/mediaflows.cloudinary.com\/\"><code>mediaflows.cloudinary.com\/<\/code><\/a>, click the <strong>Sign In<\/strong> button, and create a new account with Gmail or GitHub. (For now, those are the only ways for setting up MediaFlows accounts.)<\/li>\n<li>Create a project called <strong>Moderation<\/strong>.<\/li>\n<li>Click <strong>Connect with Cloudinary<\/strong> to map the MediaFlow account to one on Cloudinary. When prompted, log in to Cloudinary.<\/li>\n<\/ol>\n<div class='c-callout  c-callout--inline-title c-callout--note'><strong class='c-callout__title'>Note:<\/strong> <p>If you have multiple subaccounts with Cloudinary, you will be asked to pick one. Because MediaFlows operates at the subaccount level, you cannot enable the same task for multiple subaccounts.<\/p><\/div>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/image\/upload\/w_700,c_fill,f_auto,q_auto,dpr_2.0\/Web_Assets\/blog\/mf_create_new_project.png\" alt=\"Setting up a new project\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1400\" height=\"1144\"\/><\/p>\n<h3>Build Your Workflow<\/h3>\n<p>You can now use MediaFlows to build a workflow. Follow these two steps:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/image\/upload\/w_500,c_fill,f_auto,q_auto,dpr_2.0\/Web_Assets\/blog\/step2.png\" alt=\"Setting up a workflow\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"500\" height=\"249.5\"\/><\/p>\n<h4>Set Up Notifications<\/h4>\n<p>At the outset, create a basic flow by clicking <strong>Start from basic<\/strong>.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/image\/upload\/w_700,c_fill,f_auto,q_auto,dpr_2.0\/Web_Assets\/blog\/mf_create_flow.png\" alt=\"Create a basic flow\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1400\" height=\"813\"\/><\/p>\n<p>A dialog box titled <strong>Catch Webhook<\/strong> is displayed, denoting that you will be notified of changes in your Cloudinary account. For details, double-click the dialog box. Note down the URL for a later step.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/image\/upload\/w_700,c_fill,f_auto,q_auto,dpr_2.0\/Web_Assets\/blog\/mf_create_flow.png\" alt=\"Catch Webhook dialog box\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1400\" height=\"813\"\/><\/p>\n<h4>Check for Approval and Move the Image<\/h4>\n<p>This step is the core of the MediaFlows setup: You\u2019ll verify if the notification is for an image that has been approved and, if so, have MediaFlows move the image to a folder you specify.<\/p>\n<p>The notification on an approval reads like this:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json shcb-wrap-lines\">{\n  <span class=\"hljs-attr\">\"asset_id\"<\/span>: <span class=\"hljs-string\">\"9f377ced45037da942fbd1883c27b98d\"<\/span>,\n  <span class=\"hljs-attr\">\"moderation_status\"<\/span>: <span class=\"hljs-string\">\"approved\"<\/span>,\n  <span class=\"hljs-attr\">\"url\"<\/span>: <span class=\"hljs-string\">\"http:\/\/res.cloudinary.com\/dbmataac4\/image\/upload\/v1633466870\/toBeModerated\/aaa4.jpg\"<\/span>,\n  <span class=\"hljs-attr\">\"version\"<\/span>: <span class=\"hljs-number\">1633466870<\/span>,\n  <span class=\"hljs-attr\">\"moderation_updated_at\"<\/span>: <span class=\"hljs-string\">\"2021-10-05T20:47:55Z\"<\/span>,\n  <span class=\"hljs-attr\">\"etag\"<\/span>: <span class=\"hljs-string\">\"982dc96b643b044c55a1d8be8c2d0e29\"<\/span>,\n  <span class=\"hljs-attr\">\"moderation_kind\"<\/span>: <span class=\"hljs-string\">\"manual\"<\/span>,\n  <span class=\"hljs-attr\">\"secure_url\"<\/span>: <span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/dbmataac4\/image\/upload\/v1633466870\/toBeModerated\/aaa4.jpg\"<\/span>,\n  <span class=\"hljs-attr\">\"public_id\"<\/span>: <span class=\"hljs-string\">\"toBeModerated\/aaa4\"<\/span>,\n  <span class=\"hljs-attr\">\"notification_type\"<\/span>: <span class=\"hljs-string\">\"moderation\"<\/span>,\n  <span class=\"hljs-attr\">\"uploaded_at\"<\/span>: <span class=\"hljs-string\">\"2021-10-05T20:47:50Z\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>The important fields for approval are\u2014<\/p>\n<ul>\n<li>\n<code>public_id<\/code>, which identifies the asset for moving. Additionally, you can pinpoint the asset with this ID in the folder and check the asset\u2019s details.<\/li>\n<li>\n<code>notification_type<\/code>, which bears the value <code>moderation<\/code> in this context.<\/li>\n<li>\n<code>moderation_status<\/code>, which bears the value <code>approved<\/code> in this context.<\/li>\n<\/ul>\n<p>Suppose you want the workflow to proceed with these two tasks:<\/p>\n<ul>\n<li>Move the to-be-approved images to a folder named <code>toBeModerated<\/code>.<\/li>\n<li>Move the approved images to a folder named <code>Approved<\/code>.<\/li>\n<\/ul>\n<p>To add the logic, do the following:<\/p>\n<ol>\n<li>\n<p>Add a new block called <strong>MediaFlows Function<\/strong> and join <strong>Catch Webhook<\/strong> to it, as illustrated in this diagram:\n<img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/image\/upload\/w_700,c_fill,f_auto,q_auto,dpr_2.0\/Web_Assets\/blog\/mf_mediaflows.png\" alt=\"MediaFlows\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1400\" height=\"300\"\/><\/p>\n<\/li>\n<li>\n<p>Double-click the <strong>MediaFlows<\/strong> block, in which is a text field for JavaScript code. Click the <code>{}<\/code> button on the bottom left for an option for selecting the dynamic value and passing along the entire JSON format from the previous step. This video shows the process:<\/p>\n<\/li>\n<\/ol>\n<p><video controls=\"controls\" muted poster=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/image\/upload\/w_700,c_fill,f_auto,q_auto,dpr_2.0\/Web_Assets\/blog\/mf_adding_code_block-2.png\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/video\/upload\/f_auto,q_auto\/Web_Assets\/blog\/mf_adding_code_block-2.mp4\n\">\n<\/video><\/p>\n<p>Here, the webhook block is passing the information as <code>{{event.data[event.mf.previous_node_id]}}<\/code> with these specifics:<\/p>\n<ul>\n<li>\n<code>{{event.data[event.mf.previous_node_id].notification_type}}<\/code>: the notification type.<\/li>\n<li>\n<code>{{event.data[event.mf.previous_node_id].moderation_status}}<\/code>: the notification status.<\/li>\n<li>\n<code>{{event.data[event.mf.previous_node_id].public_id}}<\/code>: the public ID of the object, i.e., the image, video, or RAW file.<\/li>\n<\/ul>\n<p>Now write the logic (see below) in the code template as shown. The code performs three steps:<\/p>\n<ol>\n<li>Check if the notification is for an approval.<\/li>\n<li>Extract the path if the to-be-moderated image is in the folder.<\/li>\n<li>Move the image, assuming that it\u2019s been approved, to the <code>Approved<\/code> folder.<\/li>\n<\/ol>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-built_in\">module<\/span>.exports = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> (<span class=\"hljs-params\">event, cloudinary, callback<\/span>) <\/span>{\n  <span class=\"hljs-comment\">\/\/ Get the notification type and status.<\/span>\n  <span class=\"hljs-keyword\">const<\/span> notificationType = {{event.data&#91;event.mf.previous_node_id].notification_type}}\n  <span class=\"hljs-keyword\">const<\/span> notificationStatus = {{event.data&#91;event.mf.previous_node_id].moderation_status}}\n\n  <span class=\"hljs-comment\">\/\/ If the asset is in moderation and approved, proceed.<\/span>\n  <span class=\"hljs-keyword\">if<\/span> (notificationType === <span class=\"hljs-string\">'moderation'<\/span> &amp;&amp; notificationStatus === <span class=\"hljs-string\">'approved'<\/span>) {\n    <span class=\"hljs-comment\">\/\/ Get the current public ID.<\/span>\n    <span class=\"hljs-keyword\">const<\/span> fromId = {{event.data&#91;event.mf.previous_node_id].public_id}}\n    <span class=\"hljs-comment\">\/\/ Build a new public ID.<\/span>\n    <span class=\"hljs-keyword\">const<\/span> pathComponents = fromId.split(<span class=\"hljs-string\">'\/'<\/span>)\n    <span class=\"hljs-keyword\">if<\/span> (pathComponents.length === <span class=\"hljs-number\">2<\/span> &amp;&amp; pathComponents&#91;<span class=\"hljs-number\">0<\/span>] === <span class=\"hljs-string\">'toBeModerated'<\/span>) {\n      <span class=\"hljs-keyword\">const<\/span> toId = pathComponents&#91;<span class=\"hljs-number\">0<\/span>] + <span class=\"hljs-string\">'\/'<\/span> + <span class=\"hljs-string\">'approved'<\/span> + <span class=\"hljs-string\">'\/'<\/span> + pathComponents&#91;<span class=\"hljs-number\">1<\/span>]\n      <span class=\"hljs-comment\">\/\/ Issue the rename command.<\/span>\n      cloudinary.v2.uploader.rename(fromId, toId, {\n        <span class=\"hljs-attr\">type<\/span>: <span class=\"hljs-string\">'upload'<\/span>,\n        <span class=\"hljs-attr\">resource_type<\/span>: <span class=\"hljs-string\">'image'<\/span>\n      })\n        .then(<span class=\"hljs-function\"><span class=\"hljs-params\">res<\/span> =&gt;<\/span> {\n          <span class=\"hljs-comment\">\/\/ Pass along the status for the next step.<\/span>\n          callback(<span class=\"hljs-literal\">null<\/span>, { <span class=\"hljs-attr\">remame<\/span>: { <span class=\"hljs-attr\">status<\/span>: <span class=\"hljs-string\">'success'<\/span> } })\n        })\n        .catch(<span class=\"hljs-function\"><span class=\"hljs-params\">err<\/span> =&gt;<\/span> {\n          <span class=\"hljs-built_in\">JSON<\/span>.stringify(err)\n        })\n    }\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<div class='c-callout  c-callout--inline-title c-callout--note'><strong class='c-callout__title'>Note:<\/strong> <p>The above code does not pass along the API credentials from the <code>cloudinary<\/code> object. When you first link your Cloudinary account, this information is collected by MediaFlows and made available as part of the  <code>cloudinary<\/code> object. Hence, you can build your code like you would with the <a href=\"https:\/\/cloudinary.com\/documentation\/node_integration\">Node.js SDK<\/a>.<\/p><\/div>\n<h4>Send a Confirmation (Optional)<\/h4>\n<p>Finally, if you desire, send a message to your systems after an image has been renamed. For example, you can update your database to show that an image has been moderated or monitor the status though your logging and reporting platform. To do so, add a <strong>Send HTTP Request<\/strong> element and connect it to the <strong>MediaFlows Function<\/strong> element. Double-click the object and specify the values of these two parameters:<\/p>\n<ul>\n<li>\n<code>Request Method<\/code>: <code>GET<\/code> or <code>POST<\/code>.<\/li>\n<li>\n<code>Request URL<\/code>: Your notification endpoint. For this tutorial, enter the free <code>webhook.site<\/code> URL.<\/li>\n<\/ul>\n<p>Watch this video for the steps:<\/p>\n<p><video controls=\"controls\" muted poster=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/image\/upload\/w_700,c_fill,f_auto,q_auto,dpr_2.0\/Web_Assets\/blog\/mf_http_notification.png\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/video\/upload\/f_auto,q_auto\/Web_Assets\/blog\/mf_http_notification.mp4\n\">\n<\/video><\/p>\n<h2>Step 3: Link MediFlows to Your Cloudinary Account<\/h2>\n<p>As a final touch, enable your Cloudinary account to send notifications to the MediaFlows endpoint, as shown here:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/image\/upload\/w_500,c_fill,f_auto,q_auto,dpr_2.0\/Web_Assets\/blog\/step3.png\" alt=\"Step 3\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"500\" height=\"226\"\/><\/p>\n<p>Recall that you received the notification URL after completing the step <strong>Set Up Notifications<\/strong> above. Copy that URL., which in this tutorial is <code>https:\/\/hooks.mediaflows.cloudinary.com\/v1\/********<\/code>, and do the following:<\/p>\n<ol>\n<li>Click the <strong>Settings<\/strong> icon in your Cloudinary account and then the <em>Upload<\/em> tab near the top.<\/li>\n<li>Fill in the text field <strong>Notification URL<\/strong> with the URL from MediaFlows.<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/image\/upload\/w_700,c_fill,f_auto,q_auto,dpr_2.0\/Web_Assets\/blog\/mf_notification_setup.png\" alt=\"Notification setting\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1400\" height=\"187\"\/><\/p>\n<h2>Test<\/h2>\n<p>Finally, test the integration. Follow the steps in the video below.<\/p>\n<p><video controls=\"controls\" muted poster=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/image\/upload\/w_700,c_fill,f_auto,q_auto,dpr_2.0\/Web_Assets\/blog\/mf_test_webhook.png\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/video\/upload\/f_auto,q_auto\/Web_Assets\/blog\/mf_test_webhook.mp4\n\">\n<\/video><\/p>\n<h2>The Many MediaFlows Capabilities<\/h2>\n<p>With MediaFlows, you can customize workflows, sequence operations like image moderation, removal of background, and maybe extraction of tests from images. All those complex tasks can be accomplished only through orchestration with AWS Lambda or other external systems. This chart summarizes the workflow you just created:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/image\/upload\/w_500,c_fill,f_auto,q_auto,dpr_2.0\/Web_Assets\/blog\/workflow.png\" alt=\"Workflow\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"500\" height=\"775.5\"\/><\/p>\n<p>MediaFlows seamlessly brings this infrastructure closer to you with only minimal coding on your part and no maintenance. What\u2019s more, you can share with the Cloudinary community your workflows so that others can leverage and learn from your handiwork.<\/p>\n<p>I look forward to seeing cool, automated creations from you that capitalize on MediaFlows.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":22542,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[25,89],"class_list":["post-22541","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-asset-management","tag-digital-asset-management"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>How to Build Workflows With Cloudinary\u2019s MediaFlows<\/title>\n<meta name=\"description\" content=\"Creating workflows with Cloudinary&#039;s MediaFlows yields automation and useful capabilities. The process is simple and the workflows, maintenance free.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Build Workflows With Cloudinary\u2019s MediaFlows\" \/>\n<meta property=\"og:description\" content=\"Creating workflows with Cloudinary&#039;s MediaFlows yields automation and useful capabilities. The process is simple and the workflows, maintenance free.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-11-02T15:21:37+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-03-02T17:44:24+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649725921\/Web_Assets\/blog\/workflows-in-mediaflows-1\/workflows-in-mediaflows-1-png?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"1540\" \/>\n\t<meta property=\"og:image:height\" content=\"847\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Build Workflows With Cloudinary\u2019s MediaFlows\",\"datePublished\":\"2021-11-02T15:21:37+00:00\",\"dateModified\":\"2025-03-02T17:44:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows\"},\"wordCount\":6,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649725921\/Web_Assets\/blog\/workflows-in-mediaflows-1\/workflows-in-mediaflows-1.png?_i=AA\",\"keywords\":[\"Asset Management\",\"Digital Asset Management\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2021\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows\",\"url\":\"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows\",\"name\":\"How to Build Workflows With Cloudinary\u2019s MediaFlows\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649725921\/Web_Assets\/blog\/workflows-in-mediaflows-1\/workflows-in-mediaflows-1.png?_i=AA\",\"datePublished\":\"2021-11-02T15:21:37+00:00\",\"dateModified\":\"2025-03-02T17:44:24+00:00\",\"description\":\"Creating workflows with Cloudinary's MediaFlows yields automation and useful capabilities. The process is simple and the workflows, maintenance free.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649725921\/Web_Assets\/blog\/workflows-in-mediaflows-1\/workflows-in-mediaflows-1.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649725921\/Web_Assets\/blog\/workflows-in-mediaflows-1\/workflows-in-mediaflows-1.png?_i=AA\",\"width\":1540,\"height\":847},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Build Workflows With Cloudinary\u2019s MediaFlows\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How to Build Workflows With Cloudinary\u2019s MediaFlows","description":"Creating workflows with Cloudinary's MediaFlows yields automation and useful capabilities. The process is simple and the workflows, maintenance free.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows","og_locale":"en_US","og_type":"article","og_title":"Build Workflows With Cloudinary\u2019s MediaFlows","og_description":"Creating workflows with Cloudinary's MediaFlows yields automation and useful capabilities. The process is simple and the workflows, maintenance free.","og_url":"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows","og_site_name":"Cloudinary Blog","article_published_time":"2021-11-02T15:21:37+00:00","article_modified_time":"2025-03-02T17:44:24+00:00","og_image":[{"width":1540,"height":847,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649725921\/Web_Assets\/blog\/workflows-in-mediaflows-1\/workflows-in-mediaflows-1-png?_i=AA","type":"image\/png"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows"},"author":{"name":"","@id":""},"headline":"Build Workflows With Cloudinary\u2019s MediaFlows","datePublished":"2021-11-02T15:21:37+00:00","dateModified":"2025-03-02T17:44:24+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows"},"wordCount":6,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649725921\/Web_Assets\/blog\/workflows-in-mediaflows-1\/workflows-in-mediaflows-1.png?_i=AA","keywords":["Asset Management","Digital Asset Management"],"inLanguage":"en-US","copyrightYear":"2021","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows","url":"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows","name":"How to Build Workflows With Cloudinary\u2019s MediaFlows","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649725921\/Web_Assets\/blog\/workflows-in-mediaflows-1\/workflows-in-mediaflows-1.png?_i=AA","datePublished":"2021-11-02T15:21:37+00:00","dateModified":"2025-03-02T17:44:24+00:00","description":"Creating workflows with Cloudinary's MediaFlows yields automation and useful capabilities. The process is simple and the workflows, maintenance free.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649725921\/Web_Assets\/blog\/workflows-in-mediaflows-1\/workflows-in-mediaflows-1.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649725921\/Web_Assets\/blog\/workflows-in-mediaflows-1\/workflows-in-mediaflows-1.png?_i=AA","width":1540,"height":847},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/build_workflows_with_cloudinary_s_mediaflows#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Build Workflows With Cloudinary\u2019s MediaFlows"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":""}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649725921\/Web_Assets\/blog\/workflows-in-mediaflows-1\/workflows-in-mediaflows-1.png?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/22541","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=22541"}],"version-history":[{"count":2,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/22541\/revisions"}],"predecessor-version":[{"id":37081,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/22541\/revisions\/37081"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/22542"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=22541"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=22541"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=22541"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}