← back to Marketing Command Center
docs/tiktok-app-review-package.md
119 lines
# TikTok App Review Submission Package — DW Marketing (app 7662772350357866516)
Goal: get the **production** app approved for `video.publish` + `video.upload` so
`@designerwallcoverings` can auto-post publicly from the Marketing Command Center.
Prepared 2026-07-21. Sandbox is already configured, token minted, domain verified.
---
## 1. Production-app fields (paste-ready)
TikTok dev portal → app **DW Marketing** → **Production** tab → App details.
| Field | Value |
|---|---|
| **App icon** | `~/Desktop/Images/DW-TikTok-icon.png` (1024×1024 PNG) |
| **App name** | `DW Marketing` |
| **Category** | `Shopping` |
| **Description** (≤120) | `Designer Wallcoverings posts its own product and room videos to its official TikTok via the Content Posting API.` |
| **Terms of Service URL** | `https://designerwallcoverings.com/policies/terms-of-service` |
| **Privacy Policy URL** | `https://designerwallcoverings.com/policies/privacy-policy` |
| **Platform** | **Web** |
| **Web/Desktop URL** | `https://marketing.designerwallcoverings.com` ← must match the domain shown in the demo video |
| **Products** | Login Kit + Content Posting API |
| **Scopes** | `user.info.basic`, `video.publish`, `video.upload` |
| **Redirect URI** | `https://marketing.designerwallcoverings.com/api/channels/oauth/tiktok/callback` |
> Note: production uses the SAME domain as the demo. `OAUTH_REDIRECT_BASE` on the live MCC
> is `https://marketing.designerwallcoverings.com`. Do NOT put localhost anywhere (TikTok rejects it).
---
## 2. "Explain how each product and scope works" (App Review free-text field)
> Designer Wallcoverings (designerwallcoverings.com) operates a Marketing Command Center at
> marketing.designerwallcoverings.com that manages our OWN brand's social channels. The TikTok
> integration lets our marketing team authenticate our own official account
> (@designerwallcoverings) and publish our own product and room-setting videos to it.
>
> **Login Kit — `user.info.basic`:** When an admin clicks "Connect TikTok" in the Command
> Center's Channels page, we run the Login Kit OAuth flow to authenticate our own TikTok
> account. We read open_id / avatar / display_name only to confirm and display which account
> is connected in the dashboard. No third-party user data is involved — it is our own account.
>
> **Content Posting API — `video.publish` (Direct Post):** From the Command Center, our team
> selects a product/room video we produced and publishes it directly to our own
> @designerwallcoverings profile via the Content Posting API (Direct Post / PULL_FROM_URL from
> our verified domain designerwallcoverings.com). This is how new wallcovering collections and
> room visualizations are announced on TikTok.
>
> **Content Posting API — `video.upload`:** As a fallback, we upload a video as a draft to the
> account's TikTok inbox so a team member can finalize captions/timing and post manually.
>
> All posting is to our OWN single brand account; there is no user-generated or third-party
> content, no bulk/multi-account behavior. Domain designerwallcoverings.com is verified in the
> portal (used for PULL_FROM_URL video sources).
---
## 3. Demo-video script / shot-list (the required end-to-end demo)
**Constraints (from the portal):** mp4/mov, ≤50 MB/file, ≤5 files, must use the SANDBOX,
must clearly show UI + interactions, the on-screen domain MUST match the Web/Desktop URL
(`marketing.designerwallcoverings.com`), and EVERY selected scope must be demonstrated.
Target length ~2–3 min, screen-recorded.
**Scene 1 — Context (0:00–0:15).** Browser open, URL bar clearly showing
`https://marketing.designerwallcoverings.com`. Show the Command Center dashboard, then the
**Channels** page with the TikTok card.
**Scene 2 — Login Kit + `user.info.basic` (0:15–0:50).** Click **Connect TikTok** → the TikTok
OAuth consent screen appears (shows "DW Marketing wants to access… Designer Wallcoverings" and
the three scopes) → click **Continue/Authorize** → redirected back to the Channels page now
showing TikTok **Connected**, with the account avatar + display name (this visibly demonstrates
`user.info.basic`).
**Scene 3 — `video.publish` Direct Post (0:50–1:50).** Select one of our product/room videos in
the Command Center → choose **Post to TikTok → Direct Post** → confirm → show the success state
with the returned **publish_id** → cut to the TikTok app/profile showing the posted video
(sandbox = private/SELF_ONLY). Narrate that this is our own video to our own account.
**Scene 4 — `video.upload` draft (1:50–2:20).** Repeat with the **Upload as draft** option →
show it lands in the TikTok inbox as an editable draft (demonstrates `video.upload`).
**Scene 5 — Close (2:20–2:30).** Return to the Channels page showing connected + recent post.
**Narration file:** can be generated via the `clone-voice`/`use-voice` skill; screen capture
via the `app-demo-video` or `screenrecord` skill against the live MCC.
---
## 4. Posting pipeline — VERIFIED WORKING (2026-07-21)
Earlier thought to be a blocker; it is not. Findings:
- `postTikTok()` (`modules/channels/index.js` line ~453) is **fully implemented**:
`video/publish/init` → Direct Post, `PULL_FROM_URL` from the verified domain,
`privacy_level: SELF_ONLY`. No build needed.
- Posts only "staged" before because `connected` was false (no `TIKTOK_ACCESS_TOKEN`).
With the minted token in env, `connected → true` and posts fire for real.
- **Verified live:** `creator_info/query` returns Designer Wallcoverings / @designerwallcoverings,
`can_post=true`, privacy = PUBLIC/FRIENDS/SELF_ONLY, max 3600s. Token + `video.publish` work.
**Only two things remain to record the demo (Scenes 3–4):**
1. A real video hosted on the **verified domain** (designerwallcoverings.com or the
marketing. subdomain) to feed `PULL_FROM_URL`. (Shopify-CDN URLs won't pass — domain
must be the verified one.)
2. Firing one real `SELF_ONLY` (private) post to @designerwallcoverings — a **gated publish**;
do it live while recording, not autonomously.
Everything else in this package is ready. This is NOT a build blocker anymore.
---
## 5. Submission checklist
- [ ] Production App details filled (§1) + icon uploaded
- [ ] Scopes/products added; scope-usage text pasted (§2)
- [ ] Content Posting sandbox flow verified working (§4) — **prerequisite**
- [ ] Demo video recorded per §3 (sandbox, domain matches, all 3 scopes shown)
- [ ] Submit for review → TikTok queue (days). Sandbox posting keeps working meanwhile.