) => steps.push({ n: steps.length + 1, ...s });
add({ text: appId ? 'Open the App Privacy page of the app (deep link).' : `Open App Store Connect > Apps > the app > App Privacy (sidebar): ${consoleUrl('asc.apps')}` });
add({ text: 'First time: click "Get Started" and answer the Data Collection question; then Next.', click: ['Get Started'], answers: ['collects'] });
add({ text: 'Data types: when the Data Types section does not list exactly the collected types below, click the "Edit" next to the "Data Types" heading (never the Privacy Policy Edit), tick exactly these types and untick the rest, then Save. On an app whose answers were published before (verified 2026-10-22), Edit first opens the "Data Collection" question (Yes / No, then Next); the type list is step 2 and ends in "Continue", not "Save". Console labels: Purchase History shows as "Purchases", Other Data Types as "Other Data".', click: ['Edit', 'Next', 'Save', 'Continue'], answers: ids(answers, a => a.id.startsWith('type:')) });
add({ text: `${APPLE_ADDITIONAL_SETUP}`, click: ['OK'] });
for (const t of collected) {
const set = setUpTexts(t).filter(x => !/ ayarla$/.test(x));
add({ type: t, text: `"${t}": click the text "${set.join('" or "')}" in the Data Types section (a plain with a click handler, not a button). A dialog opens whose h2 is "${typeLabels(t).join('" or "')}". (Set up before: its row shows Edit and a summary; open it with that row's Edit only when the summary differs from the answers.)`, click: set });
add({ type: t, text: `"${t}" step 1, purposes: tick and untick the 6 checkboxes as answered, then Next.`, click: ['Next'], answers: ids(answers, a => a.id.startsWith(`purpose:${t}:`)) });
add({ type: t, text: `"${t}" step 2, linked to the user: pick the radio, then Next.`, click: ['Next'], answers: [`linked:${t}`] });
add({ type: t, text: `"${t}" steps 3 and 4: two information pages ("Let’s define two important terms…", then "To help put tracking into context, here are a few examples:"), no inputs: press Next on each.`, click: ['Next', 'Next'] });
add({ type: t, text: `"${t}" step 5, tracking: pick the radio, then the last button: "Save" (first setup: a draft) or "Publish" (answers published before: this type goes live at once, verified 2026-10-22). Publish is the owner's button unless bypass mode is on (storebound settings bypass status). Never "Definitions and Examples". The dialog closes; the row shows Edit and the summary.`, click: ['Save'], answers: [`tracking:${t}`] });
}
add({ text: 'First setup only: the page then has a Publish button (top right) and the dialog "Publish Your App Privacy Responses?". That Publish is the owner’s unless bypass mode is on; then press it yourself. Afterwards the page shows "Published … ago by …". (Answers published before: each type was already published by its own last step.)' });
add({ text: 'Verify: read the Data Types section as text (document.querySelector("main").innerText) and pipe it to `storebound console verify apple-app-privacy --from-text -`.' });
return {
start: appId ? { url: `${ASC}/apps/${appId}/distribution/privacy`, deepLink: true, reach: [] }
: { url: `${ASC}/apps`, deepLink: false, reach: ['Apps > the app (by name or bundle id) > App Privacy in the sidebar (set apple.appId, or give storebound App Store Connect API keys, for a deep link)'] },
steps,
uiFacts: [
'Verified 2026-10-12 on /apps//distribution/privacy:',
'Data Types section: each collected type has "Set Up ", a plain inside a div with the click handler (no button or link role). Click it by its exact text. It opens a