Alias for the upload_to_app_store action

deliver uploads screenshots, metadata and binaries to App Store Connect. Use deliver to submit your app for App Store review.

FeaturesQuick StartUsageTips

deliver is part of fastlane: The easiest way to automate beta deployments and releases for your iOS and Android apps.


  • Upload hundreds of localized screenshots completely automatically
  • Upload a new ipa/pkg file to App Store Connect without Xcode from any Mac
  • Maintain your app metadata locally and push changes back to App Store Connect
  • Easily implement a real Continuous Deployment process using fastlane
  • Store the configuration in git to easily deploy from any Mac, including your Continuous Integration server
  • Get a HTML preview of the fetched metadata before uploading the app metadata and screenshots to iTC
  • Automatically uses precheck to ensure your app has the highest chances of passing app review the first time

To upload builds to TestFlight check out pilot.

Quick Start

The guide will create all the necessary files for you, using the existing app metadata from App Store Connect.

  • cd [your_project_folder]
  • fastlane deliver init
  • Enter your App Store Connect credentials
  • Enter your app identifier
  • Enjoy a good drink, while the computer does all the work for you

From now on, you can run fastlane deliver to deploy a new update, or just upload new app metadata and screenshots.


Check out your local ./fastlane/metadata and ./fastlane/screenshots folders (if you don't use fastlane it's ./metadata instead)


You'll see your metadata from App Store Connect. Feel free to store the metadata in git (not the screenshots). You can now modify it locally and push the changes back to App Store Connect.

Run fastlane deliver to upload the app metadata from your local machine

fastlane deliver

Provide the path to an ipa file to upload and submit your app for review:

fastlane deliver --ipa "App.ipa" --submit_for_review

or you can specify path to pkg file for macOS apps:

fastlane deliver --pkg "MacApp.pkg"

If you use fastlane you don't have to manually specify the path to your ipa/pkg file.

This is just a small sub-set of what you can do with deliver, check out the full documentation in #more-options

Download existing screenshots from App Store Connect

fastlane deliver download_screenshots

Download existing metadata from App Store Connect

fastlane deliver download_metadata

To get a list of available options run

fastlane action deliver

Use in a Fastfile

  submit_for_review: true,
  force: true,
  metadata_path: "./metadata"

More options

View all available options and their valid values

Available options

All the options below can easily be added to your Deliverfile. The great thing: if you use fastlane you can use all these options from your Fastfile too, for example:

  submit_for_review: true,
  metadata_path: "../folder"

The bundle identifier (e.g. "")


Your Apple ID email address


A path to a signed ipa file, which will be uploaded. If you don't provide this value, only app metadata will be uploaded. If you want to submit the app for review make sure to either use fastlane deliver --submit_for_review or add submit_for_review true to your Deliverfile


if you use fastlane the ipa file will automatically be detected.


A path to a signed pkg file, which will be uploaded. Submission logic of ipa applies to pkg files.


Optional, as it is usually automatically detected. Specify the version that should be created / edited on App Store Connect:


In the case if deliver uploads your application to App Store Connect it will automatically update "Prepare for submission" app version (which could be found on App Store Connect->My Apps->App Store page)

The option allows uploading your app without updating "Prepare for submission" version.

This could be useful in the case if you are generating a lot of uploads while not submitting the latest build for Apple review.

The default value is false.


Add this to your Deliverfile to automatically submit the app for review after uploading metadata/binary. This will select the latest build.


A path to a folder containing subfolders for each language. This will automatically detect the device type based on the image resolution. Also includes  Watch Support.



Path to the metadata you want to use. The folder has to be structured like this


If you run deliver init this will automatically be created for you.


If set to true, no HTML report will be generated before the actual upload. You can also pass --force when calling deliver.


Pass the price tier as number. This will be active from the current day.

price_tier 0

Trade Representative Contact information for Korean App Store. Available options: first_name, last_name, address_line1, address_line2, address_line3, city_name, state, country, postal_code, phone_number, email_address, is_displayed_on_app_store.

  first_name: "Felix",
  last_name: "Krause",
  address_line1: "1 Infinite Loop",
  address_line2: "",
  address_line3: null,
  city_name: "Cupertino",
  state: "California",
  country: "United States",
  postal_code: "95014",
  phone_number: "+43 123123123",
  email_address: "",

You can also provide these values by creating files in a metadata/trade_representative_contact_information/ directory. The file names must match the pattern <key>.txt (e.g. first_name.txt, address_line1.txt etc.). The contents of each file will be used as the value for the matching key. Values provided in the Deliverfile or Fastfile will be take priority over values from these files.

is_displayed_on_app_store is the option on App Store Connect described as: Display Trade Representative Contact Information on the Korean App Store


Contact information for the app review team. Available options: first_name, last_name, phone_number, email_address, demo_user, demo_password, notes.

  first_name: "Felix",
  last_name: "Krause",
  phone_number: "+43 123123123",
  email_address: "",
  demo_user: "demoUser",
  demo_password: "demoPass",
  notes: "such notes, very text"

You can also provide these values by creating files in a metadata/review_information/ directory. The file names must match the pattern <key>.txt (e.g. first_name.txt, notes.txt etc.). The contents of each file will be used as the value for the matching key. Values provided in the Deliverfile or Fastfile will be take priority over values from these files.


You can provide additional information to the app review team as a file attachment. As of this writing, Apple supports following file attachment formats: .pdf, .doc, .docx, .rtf, .pages, .xls, .xlsx, .numbers, .zip, .rar, .plist, .crash, .jpg, .png, .mp4, or .avi.

Provide an empty string (i.e. "", not null) to remove the existing attachment file (if any) from the review information being edited.

app_review_attachment_file: "./readme.txt"

Must be a hash. This is used as the last step for the deployment process, where you define if you use third party content or use encryption. A list of available options.

  add_id_info_serves_ads: true,

Should the app be released to all users once Apple approves it? If set to false, you'll have to manually release the update once it got approved.

# or

Enable or disable the phased releases feature of App Store Connect. If set to true, the update will be released over a 7 day period. Default behavior is to leave whatever you defined on App Store Connect.

# or

Reset your app's summary rating for all territories. If set to true, it will reset rating when this version is released. Default behavior is to keep existing rating.

# or

You can set the app age ratings using deliver. You'll have to create and store a JSON configuration file. Copy the template to your project folder and pass the path to the JSON file using the app_rating_config_path option.

The keys/values on the top allow one of 3 strings: "NONE", "INFREQUENT_OR_MILD" or "FREQUENT_OR_INTENSE", and the items on the bottom allow false or true. More information in #reference.


All options below are useful if you want to specify certain app metadata in your Deliverfile or Fastfile


Localized values should be set like this

  'en-US' => "English Description here",
  'de-DE' => "Deutsche Beschreibung hier"

The title/name of the app


Localized subtitle of the app

  "en-US" => "Awesome English subtitle here",
  "de-DE" => "Jetzt mit deutschen Untertiteln!"

The description of the app


The release_notes (What's new / Changelog) of the latest version

support_url, marketing_url, privacy_url

These URLs are shown in the AppStore


Keywords separated using a comma.

  "en-US" => "Keyword1, Keyword2"

Localized promotional text

  "en-US" => "Hey, you should totally buy our app, it's the best",
  "de-DE" => "App kaufen bitte"

A path to a new app icon, which must be exactly 1024x1024px


A path to a new app icon for the  Watch, which must be exactly 1024x1024px


The platform of your application (a.e. ios, osx).

This option is optional. The default value is "ios" and deliver should be able to figure out the platform from your binary.

However, in the case if multiple binaries present, you can specify a platform which you want to deliver explicitly.

The available options:

  • 'ios'
  • 'appletvos'
  • 'osx'


The up to date copyright information.

copyright("#{} Felix Krause")

The english name of the category you want to set (e.g. Business, Books)

See #reference for a list of available categories


The english name of the secondary category you want to set


The english name of the primary first sub category you want to set


The english name of the primary second sub category you want to set


The english name of the secondary first sub category you want to set


The english name of the secondary second sub category you want to set

Submit Build

deliver allows you to promote an existing build to production. Below are examples to select a previously uploaded build and submit it for review.

fastlane deliver submit_build --build_number 830

Submit build in a Fastfile

lane :submit_review do
    build_number: '830',
    submit_for_review: true,
    automatic_release: true,
    force: true, # Skip HTMl report verification
    skip_metadata: true,
    skip_screenshots: true,
    skip_binary_upload: true

Omit build_number to let fastlane automatically select the latest build number for the current version being edited for release from App Store Connect.

Compliance and IDFA settings

Use the submission_information parameter for additional submission specifiers, including compliance and IDFA settings. Look at the Spaceship's app_submission.rb file for options. See this example.

fastlane deliver submit_build --build_number 830 --submission_information "{\"export_compliance_uses_encryption\": false, \"add_id_info_uses_idfa\": false }"

App Privacy Details

Starting on December 8, 2020, Apple announced that developers are required to provide app privacy details that will help users understand an app's privacy practies. deliver does not allow for updating of this information but this can be done with the upload_app_privacy_details_to_app_store action. More information on Uploading App Privacy Details


A detailed description about how your credentials are handled is available in a credentials_manager.

How does this thing even work? Is magic involved? 🎩

Your password will be stored in the macOS keychain, but can also be passed using environment variables. (More information available on CredentialsManager)

Before actually uploading anything to iTunes, deliver will generate a HTML summary of the collected data.

deliver uses the following techniques under the hood:

  • The iTMSTransporter tool is used to upload the binary to App Store Connect. iTMSTransporter is a command line tool provided by Apple.
  • For all metadata related actions deliver uses spaceship


Available language codes

ar-SA, ca, cs, da, de-DE, el, en-AU, en-CA, en-GB, en-US, es-ES, es-MX, fi, fr-CA, fr-FR, he, hi, hr, hu, id, it, ja, ko, ms, nl-NL, no, pl, pt-BR, pt-PT, ro, ru, sk, sv, th, tr, uk, vi, zh-Hans, zh-Hant

Available Metadata Folder Options

deliver allows for metadata to be set through .txt files in the metadata folder. This metadata folder location is defaulted to ./fastlane/metadata but can be overridden through the metadata_path parameter. Below are all allowed metadata options.

Non-Localized Metadata

Key Editable While Live Directory Filename
copyright Yes <metadata_path> copyright.txt
primary_category No <metadata_path> primary_category.txt
secondary_category No <metadata_path> secondary_category.txt
primary_first_sub_category No <metadata_path> primary_first_sub_category.txt
primary_second_sub_category No <metadata_path> primary_second_sub_category.txt
secondary_first_sub_category No <metadata_path> secondary_first_sub_category.txt
secondary_second_sub_category No <metadata_path> secondary_second_sub_category.txt

Localized Metadata

Key Editable While Live Directory Filename
name No <metadata_path>/<lang>/ name.txt
subtitle No <metadata_path>/<lang>/ subtitle.txt
privacy_url Yes <metadata_path>/<lang>/ privacy_url.txt
apple_tv_privacy_policy No <metadata_path>/<lang>/ apple_tv_privacy_policy.txt
description Yes <metadata_path>/<lang>/ description.txt
keywords No <metadata_path>/<lang>/ keywords.txt
release_notes Yes <metadata_path>/<lang>/ release_notes.txt
support_url Yes <metadata_path>/<lang>/ support_url.txt
marketing_url Yes <metadata_path>/<lang>/ marketing_url.txt
promotional_text Yes <metadata_path>/<lang>/ promotional_text.txt

Review Information Metadata

Key Editable While Live Directory Filename Deprecated Filename
first_name Yes <metadata_path>/review_information first_name.txt review_first_name.txt
last_name Yes <metadata_path>/review_information last_name.txt review_last_name.txt
phone_number Yes <metadata_path>/review_information phone_number.txt review_phone_number.txt
email_address Yes <metadata_path>/review_information email_address.txt review_email.txt
demo_user Yes <metadata_path>/review_information demo_user.txt review_demo_user.txt
demo_password Yes <metadata_path>/review_information demo_password.txt review_demo_password.txt
notes Yes <metadata_path>/review_information notes.txt review_notes.txt


View all available categories, etc.

Available Categories

  • NEWS

Available Game Subcategories

  • MZGenre.Action
  • MZGenre.Adventure
  • MZGenre.Arcade
  • MZGenre.Board
  • MZGenre.Card
  • MZGenre.Casino
  • MZGenre.Dice
  • MZGenre.Educational
  • MZGenre.Family
  • MZGenre.Music
  • MZGenre.Puzzle
  • MZGenre.Racing
  • MZGenre.RolePlaying
  • MZGenre.Simulation
  • MZGenre.Sports
  • MZGenre.Strategy
  • MZGenre.Trivia
  • MZGenre.Word

Available Stickers Subcategories


Available age rating groups

Non Boolean


  • 0: None (Legacy value, use NONE instead)
  • 1: Infrequent/Mild (Legacy value, use INFREQUENT_OR_MILD instead)
  • 2: Frequent/Intense (Legacy value, use FREQUENT_OR_INTENSEinstead)
  • NONE


  • 'alcoholTobaccoOrDrugUseOrReferences'
  • 'contests'
  • 'gamblingSimulated'
  • 'medicalOrTreatmentInformation'
  • 'profanityOrCrudeHumor'
  • 'sexualContentGraphicAndNudity'
  • 'sexualContentOrNudity'
  • 'horrorOrFearThemes'
  • 'matureOrSuggestiveThemes'
  • 'unrestrictedWebAccess'
  • 'violenceCartoonOrFantasy'
  • 'violenceRealisticProlongedGraphicOrSadistic'
  • 'violenceRealistic'
  • 'kidsAgeBand'



  • gambling
  • 'seventeenPlus'
  • unrestrictedWebAccess

Kids Age


  • null


  • kidsAgeBand

Default values

Deliver has a special default language code which allows you to provide values that are not localized, and which will be used as defaults when you don’t provide a specific localized value.

In order to use default, you will need to tell deliver which languages your app uses. You can do this in either of two ways:

  1. Create the folders named with the language in the metadata folder (i.e. fastlane/metadata/en-US or fastlane/metadata/de-DE)
  2. Add the following to your Deliverfile languages(['en-US','de-DE'])

You can use this either in json within your Deliverfile and/or as folders in your metadata folder. deliver will take the union of both language sets from the Deliverfile and from the metadata folder and create on single set of languages which will be enabled.

Imagine that you have localized data for the following language codes: en-US, de-DE, el, it

You can set the following in your Deliverfile

  'default' => "Shiny and new",
  'de-DE' => "glaenzend und neu"

Deliver will use "Shiny and new" for en-US, el and it.

It will use "glaenzend und neu" for de-DE.

You can do the same with folders


In this case, default values for keywords, urls, name and release notes are used in all localizations, but each language has a fully localized description

Uploading screenshots for "iPad Pro (12.9-inch) (3rd generation)"

Starting March 20, 2019 Apple's App Store requires 12.9-inch iPad Pro (3rd generation) screenshots additionally to the iPad Pro 2nd generation screenshots. As fastlane historically uses the screenshot dimensions to determine the "display family" of a screenshot, this poses a problem as both use the same dimensions and are recognized as the same device family.

To solve this a screenshot of a 12.9-inch iPad Pro (3rd generation) must contain either the string iPad Pro (12.9-inch) (3rd generation), IPAD_PRO_3GEN_129, or ipadPro129 (Apple's internal naming of the display family for the 3rd generation iPad Pro) in its filename to be assigned the correct display family and to be uploaded to the correct screenshot slot in your app's metadata.

Automatically create screenshots

If you want to integrate deliver with snapshot, check out fastlane!

Jenkins integration

Detailed instructions about how to set up deliver and fastlane in Jenkins can be found in the fastlane README.

Firewall Issues

deliver uses the iTunes Transporter to upload metadata and binaries. In case you are behind a firewall, you can specify a different transporter protocol using


HTTP Proxy

iTunes Transporter is a Java application bundled with Xcode. In addition to utilizing the DELIVER_ITMSTRANSPORTER_ADDITIONAL_UPLOAD_PARAMETERS="-t DAV", you need to configure the transporter application to use the proxy independently from the system proxy or any environment proxy settings. You can find the configuration file within Xcode:

for Xcode11 and later

TOOLS_PATH=$( xcode-select -p )

for Xcode10 or earlier

TOOLS_PATH=$( xcode-select -p )

Add necessary proxy configuration values to the according to Java Proxy Configuration.

As an alternative to editing the properties files, proxy configuration can be specified on the command line directly:



App Store Connect has a limit of 150 binary uploads per day.

Editing the Deliverfile

Change syntax highlighting to Ruby.

Provider Short Name

If you are on multiple App Store Connect teams, deliver needs a provider short name to know where to upload your binary. deliver will try to use the long name of the selected team to detect the provider short name. To override the detected value with an explicit one, use the itc_provider option.

Supported platforms ios, mac
Author @KrauseFx

3 Examples

  force: true, # Set to true to skip verification of HTML preview
  itc_provider: "abcde12345" # pass a specific value to the iTMSTransporter -itc_provider option
deliver   # alias for "upload_to_app_store"
appstore  # alias for "upload_to_app_store"


Key Description Default
api_key_path Path to your App Store Connect API Key JSON file (
api_key Your App Store Connect API Key information (
username Your Apple ID Username *
app_identifier The bundle identifier of your app *
app_version The version that should be edited or created
ipa Path to your ipa file *
pkg Path to your pkg file *
build_number If set the given build number (already uploaded to iTC) will be used instead of the current built one
platform The platform to use (optional) ios
edit_live Modify live metadata, this option disables ipa upload and screenshot upload false
use_live_version Force usage of live version rather than edit version false
metadata_path Path to the folder containing the metadata files
screenshots_path Path to the folder containing the screenshots
skip_binary_upload Skip uploading an ipa or pkg to App Store Connect false
skip_screenshots Don't upload the screenshots false
skip_metadata Don't upload the metadata (e.g. title, description). This will still upload screenshots false
skip_app_version_update Don’t create or update the app version that is being prepared for submission false
force Skip verification of HTML preview file false
overwrite_screenshots Clear all previously uploaded screenshots before uploading the new ones false
sync_screenshots Sync screenshots with local ones. This is currently beta option so set true to 'FASTLANE_ENABLE_BETA_DELIVER_SYNC_SCREENSHOTS' environment variable as well false
submit_for_review Submit the new version for Review after uploading everything false
verify_only Verifies archive with App Store Connect without uploading false
reject_if_possible Rejects the previously submitted build if it's in a state where it's possible false
automatic_release Should the app be automatically released once it's approved? (Can not be used together with auto_release_date)
auto_release_date Date in milliseconds for automatically releasing on pending approval (Can not be used together with automatic_release)
phased_release Enable the phased release feature of iTC false
reset_ratings Reset the summary rating when you release a new version of the application false
price_tier The price tier of this application
app_rating_config_path Path to the app rating's config
submission_information Extra information for the submission (e.g. compliance specifications, IDFA settings)
team_id The ID of your App Store Connect team if you're in multiple teams *
team_name The name of your App Store Connect team if you're in multiple teams *
dev_portal_team_id The short ID of your Developer Portal team, if you're in multiple teams. Different from your iTC team ID! *
dev_portal_team_name The name of your Developer Portal team if you're in multiple teams *
itc_provider The provider short name to be used with the iTMSTransporter to identify your team. This value will override the automatically detected provider short name. To get provider short name run\ -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v off. The short names of providers should be listed in the second column *
run_precheck_before_submit Run precheck before submitting to app review true
precheck_default_rule_level The default precheck rule level unless otherwise configured :warn
individual_metadata_items DEPRECATED! Removed after the migration to the new App Store Connect API in June 2020 - An array of localized metadata items to upload individually by language so that errors can be identified. E.g. ['name', 'keywords', 'description']. Note: slow
app_icon DEPRECATED! Removed after the migration to the new App Store Connect API in June 2020 - Metadata: The path to the app icon
apple_watch_app_icon DEPRECATED! Removed after the migration to the new App Store Connect API in June 2020 - Metadata: The path to the Apple Watch app icon
copyright Metadata: The copyright notice
primary_category Metadata: The english name of the primary category (e.g. Business, Books)
secondary_category Metadata: The english name of the secondary category (e.g. Business, Books)
primary_first_sub_category Metadata: The english name of the primary first sub category (e.g. Educational, Puzzle)
primary_second_sub_category Metadata: The english name of the primary second sub category (e.g. Educational, Puzzle)
secondary_first_sub_category Metadata: The english name of the secondary first sub category (e.g. Educational, Puzzle)
secondary_second_sub_category Metadata: The english name of the secondary second sub category (e.g. Educational, Puzzle)
trade_representative_contact_information DEPRECATED! This is no longer used by App Store Connect - Metadata: A hash containing the trade representative contact information
app_review_information Metadata: A hash containing the review information
app_review_attachment_file Metadata: Path to the app review attachment file
description Metadata: The localised app description
name Metadata: The localised app name
subtitle Metadata: The localised app subtitle
keywords Metadata: An array of localised keywords
promotional_text Metadata: An array of localised promotional texts
release_notes Metadata: Localised release notes for this version
privacy_url Metadata: Localised privacy url
apple_tv_privacy_policy Metadata: Localised Apple TV privacy policy text
support_url Metadata: Localised support url
marketing_url Metadata: Localised marketing url
languages Metadata: List of languages to activate
ignore_language_directory_validation Ignore errors when invalid languages are found in metadata and screenshot directories false
precheck_include_in_app_purchases Should precheck check in-app purchases? true
app The (spaceship) app ID of the app you want to use/modify

* = default value is dependent on the user's system


To show the documentation in your terminal, run

fastlane action deliver


It is recommended to add the above action into your Fastfile, however sometimes you might want to run one-offs. To do so, you can run the following command from your terminal

fastlane run deliver

To pass parameters, make use of the : symbol, for example

fastlane run deliver parameter1:"value1" parameter2:"value2"

It's important to note that the CLI supports primitive types like integers, floats, booleans, and strings. Arrays can be passed as a comma delimited string (e.g. param:"1,2,3"). Hashes are not currently supported.

It is recommended to add all fastlane actions you use to your Fastfile.

Source code

This action, just like the rest of fastlane, is fully open source, view the source code on GitHub

Back to actions