HomeGuidesReferenceLearn
ArchiveExpo SnackDiscord and ForumsNewsletter

Configuring EAS Metadata

Learn about different ways to configure EAS Metadata.


EAS Metadata is in beta and subject to breaking changes.

EAS Metadata is configured by a store.config.json file at the root of your project.

You can configure the path or name of the store config file with the eas.json metadataPath property. Besides the default JSON format, EAS Metadata also supports more dynamic config using JavaScript files.

Static store config

The default store config type for EAS Metadata is a simple JSON file. The code snippet below shows an example store config with basic App Store information written in English (U.S.).

You can find all configuration options in the store config schema.

If you have the VS Code Expo Tools extension installed, you get auto-complete, suggestions, and warnings for store.config.json files.

store.config.json
{
  "configVersion": 0,
  "apple": {
    "info": {
      "en-US": {
        "title": "Awesome App",
        "subtitle": "Your self-made awesome app",
        "description": "The most awesome app you have ever seen",
        "keywords": ["awesome", "app"],
        "marketingUrl": "https://example.com/en/promo",
        "supportUrl": "https://example.com/en/support",
        "privacyPolicyUrl": "https://example.com/en/privacy"
      }
    }
  }
}

Dynamic store config

At times, Metadata properties can benefit from dynamic values. For example, the Metadata copyright notice should contain the current year. This can be automated with EAS Metadata.

To generate content dynamically, start by creating a JavaScript config file store.config.js. Then, use the metadataPath property in the eas.json file to pick the JS config file.

eas metadata:pull can't update dynamic store config files. Instead, it creates a JSON file with the same name as the configured file. You can import the JSON file to reuse the data from eas metadata:pull.

store.config.js
// Use the data from `eas metadata:pull`
const config = require('./store.config.json');

const year = new Date().getFullYear();
config.apple.copyright = `${year} Acme, Inc.`;

module.exports = config;
eas.json
{
  "submit": {
    "production": {
      "ios": {
        "metadataPath": "./store.config.js"
      }
    }
  }
}

Store config with external content

When using external services for localizations, you have to fetch external content. EAS Metadata supports synchronous and asynchronous functions exported from dynamic store config files. The function results are awaited before validating and syncing with the stores.

The store.config.js function is evaluated in Node.js. If you need special values, like secrets, use environment variables.

store.config.js
// Use the data from `eas metadata:pull`
const config = require('./store.config.json');

module.exports = async () => {
  const year = new Date().getFullYear();
  const info = await fetchLocalizations('...').then(response => response.json());

  config.apple.copyright = `${year} Acme, Inc.`;
  config.apple.info = info;

  return config;
};
eas.json
{
  "submit": {
    "production": {
      "ios": {
        "metadataPath": "./store.config.js"
      }
    }
  }
}