Custom UI extension (floating window + panel) never loads — surface bootstrap iframe has empty userId/companyId

Hi all, working on an app with AI and ran into some trouble. Here it is, thanks in advance!

I’m building a private app with two custom UI extensions (custom floating window and a custom panel on deal details), both pointing to the same HTTPS URL. Neither loads — the floating window spins forever, the panel shows “Something went wrong… Please refresh the panel.”

What I found investigating via browser devtools:

Before ever requesting my app’s own URL, Pipedrive loads a bootstrap iframe pointing to its own domain:

https://<company>.pipedrive.com/api/v1/marketplace-extensions/surfaces/{extension_id}?resource=deal&view=details&userId&companyId&id=xxx&theme=light

Note userId and companyId are present as parameter names but carry no value. My app’s own URL is never requested at all — confirmed with network monitoring (zero requests to my domain). This happens identically for both extension types.

What I’ve ruled out so far:

  • OAuth scopes: Pipedrive support suggested requesting only necessary scopes. I narrowed mine to the real minimum (Deals/Activities/Contacts/Leads, read-only) and re-authorized — confirmed the new scopes actually took effect via “View authorization info” in the installed-apps UI. No change in behavior.
  • Draft vs. live: Switched the app from draft to live. No change.
  • Credentials: OAuth token exchange itself works correctly (client_id/secret are valid) — this is purely about the surface bootstrap step, which happens before any request reaches my backend.
  • Extension config: URL, placement (resource: deal, view: details), and app installation status all look correct in the API response for GET /api/v1/marketplace/apps/extensions.

Has anyone run into this specific symptom — empty userId/companyId in the surface bootstrap URL? Is there some additional setup step for custom UI extensions I might be missing?

App client_id: 08a36b16807252b4 (private app, sandbox account).