Route assets through approval in a media flow

Represent approval as structured asset metadata, block public delivery while review is pending, and make the media library’s filtered view the working queue. Add deadlines and escalation paths so items cannot stall indefinitely, then write the approver and decision time back to each asset for later audit.
Prerequisites
Before building the flow, confirm that the media library can store the approval state, reviewer, deadline, approver, and decision time as fields on each asset. Cloudinary describes its field system in the structured metadata documentation, checked 2026-08-18.
You also need a delivery control that can keep an asset unavailable at a public URL until approval. Do not start with notifications or reviewer screens. If a pending asset remains publicly reachable, the approval step records an opinion but does not enforce the decision.
Route each asset through approval
-
Define the approval state machine in metadata
Approval is a state machine. Represent its current state in structured metadata rather than implying it through the folder containing the asset.
A workable minimum is
pending,approved, andrejected. Add another state only when it changes what the system does. For example,timed_outis useful if an overdue item must leave the active review queue and enter an escalation queue. A genericin_progressstate is not useful unless claiming an item prevents another reviewer from acting on it.Create fields that let the flow enforce and explain each transition:
Field Purpose approval_statusControls whether the asset is pending, approved, rejected, or timed out submitted_atStarts the review deadline review_due_atDetermines when escalation must run assigned_reviewerIdentifies who currently owns the decision approved_byRecords the person responsible for an approval approved_atRecords when that approval occurred Keep folder placement separate from state. Moving an asset between folders can still help people navigate the library, but the flow must not interpret location as approval. Folder moves are easy to perform manually, and a rename or reorganisation can silently break rules based on paths. A metadata value gives the automation one explicit condition to evaluate.
-
Block delivery before sending the asset to review
Make the transition into
pendingperform two operations as one logical submission: apply the pending metadata and ensure the asset cannot be reached through a public URL. The delivery restriction is the enforcement boundary.Cloudinary’s moderation PowerFlow documentation, checked 2026-08-18, is the supplied reference for constructing this type of media-review automation. Use the delivery control available in the product environment, but verify its effect instead of treating configuration as proof.
Test with the exact URL that a publishing system, storefront, or social workflow would use. While
approval_status=pending, that request must not return the reviewable asset. Repeat the test forrejectedandtimed_out. Onlyapprovedshould be eligible for public delivery.This ordering matters. If the notification is sent first, there is a period in which reviewers believe the item is controlled even though delivery is still possible. If restricting delivery fails, submission should fail visibly rather than continuing to the review notification.
-
Build explicit transitions for approve and reject
Give reviewers two deliberate transitions:
pendingtoapproved, andpendingtorejected. An approval transition removes the pending restriction only after the state change and decision fields have been written. Rejection keeps the asset unavailable and removes it from the active approval queue.Use Cloudinary’s sample PowerFlows, checked 2026-08-18, as implementation references for arranging flow blocks. Treat the samples as starting structures, not as evidence that your own delivery gate, metadata mapping, or timeout path works.
Prevent transitions that do not make sense. An already approved item should not be approved a second time without first entering a new review cycle. A rejected item should not become public merely because somebody moves it to another folder. If the asset changes after approval, decide whether that edit creates a new submission; if it does, set it back to
pending, block delivery again, and clear the earlier decision fields rather than presenting an old approval as current.For user-submitted assets, keep this approval routing aligned with the wider process for automating UGC moderation. Automated checks and human approval can be separate transitions, but every route to publication must end in the same enforceable approved state.
-
Make the library view the review queue
Build a saved or reproducible filtered view whose primary condition is
approval_status=pending. Include the asset preview, submission time, due time, and assigned reviewer in the view. Sort by the deadline or submission time so neglected items remain visible.Send notifications only as pointers into that queue. Notification without a queue produces an inbox nobody works through: messages are deleted, forwarded, or buried, while nobody can see whether another reviewer completed the task. The reviewable list must be a filtered view of the media library itself because the library holds the current state.
A reviewer opening an old message should land on the asset’s current record, not a stale snapshot. If the item has already been approved, rejected, or timed out, it should no longer appear in the pending view. That makes the queue self-clearing and prevents two people from deciding the same item based on separate copies of a notification.
-
Add a timeout and an escalation owner
Timeouts matter more than the approval buttons. The common failure is an asset remaining in review indefinitely because its reviewer left the company.
Set
review_due_atwhen the asset enterspending. When that time passes, the flow must change something observable: reassign the item, place it in a filtered escalation view, or move it totimed_out. Sending another message while leaving the same absent reviewer and unchanged state is not escalation.Give the timeout route an owner who is defined by role or operating responsibility, not solely by the original reviewer’s identity. Keep timed-out assets unavailable at public URLs. A missed deadline is not approval, and it must never become an implicit publish action.
If the business also removes media after a retention period, keep review deadlines distinct from asset expiry and retention automation. The first determines who must make a decision; the second determines how long the asset should remain. Combining them makes it difficult to tell whether an item disappeared because it was rejected, abandoned, or intentionally expired.
-
Write approval evidence onto the specific asset
On approval, write
approved_byandapproved_atto the asset before enabling delivery. Do not rely on a general workflow log as the only record.The later question is usually about one item: who approved this image, and when? Asset-level metadata answers that question from the record being investigated. A process-level report may show that the flow ran, but it forces an operator to correlate executions, notifications, and asset identifiers before answering a simple audit question.
Rejection should receive equivalent item-level evidence if the decision must be reviewed later. At minimum, keep the rejected state and decision time attached to the asset. Add a reason field only if someone will use it to correct, resubmit, or report on rejected work; otherwise it becomes another required input with no operational purpose.
-
Test the failure paths before connecting publishing
Run one asset through approval, rejection, and timeout. At every non-approved state, request its intended public URL and confirm the asset is unavailable. Confirm that each transition removes the item from the previous filtered view and places it in the correct next view. Then inspect the approved asset directly and verify that its approver and approval time are present.
Also test a reviewer who can no longer act: assign an item, let its deadline pass, and verify that another owner can find it without searching the departed reviewer’s inbox. This is the test that proves the timeout path is operational rather than decorative.
If the no-code flow cannot make state changes and delivery controls behave as one dependable transition, move that boundary into code. The decision point is covered in when a media automation should become code. Keep the library metadata as the source of state even if code performs the transition.
Expected result
The finished flow stores approval as asset metadata, keeps every pending, rejected, and timed-out asset unavailable through its public delivery URL, and presents pending work as a filtered library queue. Every submission has a deadline and escalation route. Every approved asset records who approved it and when before public delivery becomes possible.
Sources
- structured metadata documentationcloudinary.com
- moderation PowerFlow documentationcloudinary.com
- sample PowerFlowscloudinary.com
See also
The real running cost of a hosted media automation: base-plan credits, add-on invoice lines, per-asset trigger multipliers, and the alternative it replaces.
Sort retryable from terminal failures, space retries with jitter, cap bulk-import blast radius and dead-letter what cannot be fixed in a hosted media flow.
What a visual automation canvas gives up against code — no diff, branch or pull request — and the procedural controls that stand in for them.
Separate upload validation, stored-format conversion, and browser-aware delivery so a no-code workflow enforces the intended media policy.