Custom Product Pages and A/B Tests
Produce alternate App Store screenshot sets for Custom Product Pages and product page optimization tests using separate collections, tags and outFile paths.
App Store Connect lets you publish more than one set of screenshots for the same app. Custom Product Pages give each audience or ad campaign its own page and URL. Product page optimization runs A/B tests of alternate screenshots, icons or previews against your default page. Both need several complete screenshot sets that stay in sync with your app.
Open Assets has no special mode for this. You model each set as a collection, which gives you per-set renders, folders and caching for free.
One collection per screenshot set
Give each variant its own collection id and its own template folder. Shared styles and captured app images live in one place so every set uses the same UI.
{
"version": 1,
"name": "My App",
"publicDir": "public",
"tags": [
{ "id": "store", "label": "Store" },
{ "id": "experiment", "label": "Experiment" }
],
"collections": [
{
"id": "screenshots",
"label": "Default page",
"tags": ["store"],
"sourceSize": { "width": 440, "height": 956 },
"templates": [
{ "src": "assets/screenshots/01-hero.html", "name": "01-hero" },
{ "src": "assets/screenshots/02-plan.html", "name": "02-plan" }
],
"export": [
{ "name": "iphone-6.9", "size": { "width": 1320, "height": 2868 } }
]
},
{
"id": "cpp-students",
"label": "Custom page: students",
"tags": ["store", "experiment"],
"sourceSize": { "width": 440, "height": 956 },
"templates": [
{ "src": "assets/cpp-students/01-hero.html", "name": "01-hero" },
{ "src": "assets/screenshots/02-plan.html", "name": "02-plan" }
],
"export": [
{ "name": "iphone-6.9", "size": { "width": 1320, "height": 2868 } }
]
}
]
}Notes:
- A template file can appear in several collections. Above,
02-plan.htmlis shared and only the hero differs. - Each collection renders into its own folder:
exports/cpp-students/iphone-6.9/01-hero.png. - Collection
tagsreference ids in the roottagslist. See Tags.
Render one set or all of them
npx open-assets render --collection cpp-students # one set
npx open-assets render --tag experiment # every experimental set
npx open-assets render --tag store # everything that ships to the store--tag keeps collections whose tags include the value. If nothing matches, the command reports an error instead of rendering nothing.
Vary copy without copying templates
If a variant only changes the words, not the layout, keep one template and drive the text from a localizations file. Each collection can point at its own file:
[
{ "id": "screenshots", "localizations": "copy/default.json", "locales": ["en"] },
{ "id": "test-b", "localizations": "copy/headline-b.json", "locales": ["en"] }
]Both collections list the same template files, and {{hero_title}} resolves to a different string in each. See Strings. This also gives you every language for free: add locales to each file and each variant renders per language.
Keep variants honest
- Re-render every set when the app UI changes.
npx open-assets render --force --tag storerefreshes all of them after new captures. - Keep the same template
namevalues across sets when the screenshots are meant to be compared side by side, so file names line up. - Apple reviews the content of Custom Product Pages and test treatments. Each set should show your real app.
Related
Last updated on
Upload to App Store Connect
Map Open Assets export folders to App Store Connect and Google Play screenshot slots, then upload by hand or automate it with fastlane deliver or an asc CLI.
Google Play Assets
Render Google Play phone screenshots, the 1024x500 feature graphic and the 512px app icon from HTML templates, with a ready to copy collection config.