Skip to main content
Updated Nov 1, 2026

Upload to Storage

Use this action when you want to save a file or binary response into your company storage and reuse the uploaded file later.

Best for​

  • Saving a file downloaded from an HTTP request
  • Storing generated documents or media
  • Getting a file URL to use in later messages or records

Main fields​

FieldWhat it does
ContentThe file data to upload
Content typeThe MIME type, such as image/png or application/pdf. Auto-detected from the file name if omitted
File nameAn optional file name
CategoryOrganizes the file as an image, video, audio, or document. Auto-detected from the content type if omitted
PublicControls whether the uploaded file should be openly accessible
PurposeOptional. Only certain values are kept as the file's purpose; see the note below

About Purpose: the kept values are workflow_storage_upload (the default), action_response_media, dynadata, storage_manual_upload, whatsapp_catalog_product_image, template_message_media, chat_media_upload and scheduled_message_media. Any other value is stored as workflow_storage_upload, but still appears in the step log. Avatar and icon purposes (contact_avatar, company_logo, user_avatar, autochat_integration_avatar, autochat_widget_icon) are not honoured, so a workflow cannot fill those fields. Use dynadata for a file you'll attach to a record's file field.

What later steps can use​

Upload results are available at:

  • workflow.step(N).file
  • workflow.step(N).signedUrl
  • workflow.step(N).contentType
  • workflow.step(N).size

Tips​

  • Pair this with HTTP request when you want to download a file first.
  • Turn on Return as buffer in the HTTP step when you are working with binary files.
  • Use the signed URL in later message or record-update steps when you need immediate access to the uploaded file. The signed URL is temporary and expires after about 15 minutes — store workflow.step(N).file instead when a later step needs a long-term reference.
  • Content type is normalized when the file is stored, and the step's contentType output shows the stored value. Renderable or unsafe types (HTML, SVG, XML and +xml types, multipart, comma-separated lists, malformed values) are stored as application/octet-stream. Documents are stored without parameters and must be a supported document type (PDF, plain text, CSV, JSON, ZIP, Word, Excel, PowerPoint or RTF), otherwise application/octet-stream. Images are stored without parameters. Audio and video keep only the codecs parameter, so audio/ogg; codecs=opus stays usable for voice notes. Passing contentType=maps.get(workflow.step(0),'headers.content-type') still works; the value is just normalized.