Skip to content

Post Studio — Compose & Publish Client Posts

Post Studio is the app customer-care reps use to compose and actually publish social/GBP posts on behalf of FCR subscribers — to Google Business Profile, Facebook, Instagram, LinkedIn and the website widget, via the subscriber’s Yext account. First real GBP post published through it 2026-05-31.

  • Front-end: React/TS app at post-studio.pages.dev (repo FCR4IE/post-studio, branch productionnot GitHub-connected; updates only via manual wrangler pages deploy).
  • Backend: the post-studio-* handlers in this repo’s fcr-dashboard-api worker.
  • Entry: the AI advisor’s “post-studio” door mints a signed JWT deep-link. The JWT is the credential — the worker verifies the HS256 signature (STUDIO_JWT_SECRET) on every call.
  1. Find the listingpost-studio-search searches the subscriber’s Yext entities.
  2. Load the client’s real factsdashboard-post-studio-brand (per-subscriber brand config), -gbp-photos (GBP owner photos via Pleper), -products (Merchant Centre product feed).
  3. Draftpost-studio-draft runs one canonical system prompt (single source of truth across all reps; the rep’s custom_guardrails are appended per request). When a grounding_url is supplied the worker crawls it server-side and feeds the real page content to the model alongside the structured business/product fields — the “never invent” invariant only works if the model is actually given the facts. Crawl failure is non-fatal.
  4. Suggest / illustratepost-studio-post-suggest and -image-suggest offer options; post-studio-image-generate creates an image via the Creator/Modal pipeline.
  5. Publishpost-studio-publish.
  • Yext Management API v2: POST /v2/accounts/{subscriberId}/posts — the Yext account id is the FCR subscriberId (accounts/me returns empty; proven on the read path).
  • Auth is an independent app key (YEXT_POSTS_API_KEY, the second of the two Yext keys — Studio-isolated so it can be rotated without touching listings sync).
  • Yext takes one publisher per Post:Create, so multi-platform selections fan out one request per publisher with per-platform results reported back.
  • topicType / CTA fields are GBP-only; photoUrls accept any public URL (Yext re-hosts the image).
  • Safety valves: dry_run:true builds the exact payloads without sending; with no key set the handler returns status:"spoofed" instead of hitting Yext. Every call (spoof, dry-run, live) writes an audit row to KV (post-studio-publish:<job_id>, 30-day TTL) carrying the live Yext postIds.
  • Status: GBP publishing is proven live; Facebook/Instagram/LinkedIn are wired but untested.

post-studio-handoff-create / -poll / -complete persist images dropped into an advisor chat to R2 with a JWT, so the Studio surfaces can pick them up. The same handoff serves Creator Studio (the advisor’s image create/edit brain, separate static front-end at creator-studio-738.pages.dev, repo FCR4IE/creator-studio) — the advisor is the router; Creator is the image brain; Post Studio is the publisher.

Both Studio surfaces are backed by this repo’s worker; only YEXT_POSTS_API_KEY + STUDIO_JWT_SECRET are Studio-isolated/rotatable, and Pleper is shared with the wider platform (the gbp-photos picker). Full developer handover including every credential: STUDIO_AND_POST_STUDIO_HANDOVER_2026-06-08.md (repo root).

Ask the docsRAG over this site
Ask anything about the FCR Dashboard platform — architecture, BigQuery, the worker routes, billing rules, the LRC stack, scoring… Answers are grounded in this documentation, with source links.
How does the deal-brief refresh work? Which routes are Worker vs n8n? How is account health scored?