<!-- AI agents: this is the Markdown version of an AppNorth documentation page. Index: https://www.appnorth.app/llms.txt -->

# Troubleshooting

## Check first {#check-first}

1. Confirm you are using the intended live workspace and app, not demo data.
2. Copy the **public App ID** from the installation page. Dashboard project IDs and Apple app IDs are different identifiers.
3. Use the API base URL, without appending `/api/v1`; the Swift client adds its endpoint paths.
4. Check the configured origin, allowed domain, SDK version and network access.
5. Record the failing route, status, stable error code and correlation ID if available. Remove secrets and user content before sharing logs.

## The client fails to initialize {#configuration}

`AppNorthConfiguration` requires an absolute HTTP(S) API URL with no embedded credentials, a 3–100-character App ID, and an origin containing only scheme, host and optional port. A page path, query or fragment does not belong in the origin.

## Feedback is rejected by origin checks {#origin}

Check the origin passed to the client against the app's allowed domains. Keep feedback ingestion's origin requirement in place. Some native chat endpoints allow a missing Origin, but that exception does not remove feedback's checks. See [Errors](/docs/errors) for `ORIGIN_NOT_ALLOWED`.

## Sign-in works, but participation does not {#identity}

Your app login and AppNorth's signed identity are separate. Fetch a credential from your backend and pass it to the same client used by the view. Check its expiry, app-specific signing inputs and identity configuration. Renew an expired credential instead of falling back to anonymous access to a private thread.

On account changes, clear the old credential and avoid sharing cached private content or pending writes between accounts. For a hosted roadmap, use the short-lived [identity handoff](/docs/roadmap-and-changelog#handoff); an app credential is not automatically a browser session.

## Chat is hidden or cannot send {#chat}

Check the app's chat mode: disabled, identified or anyone. Identified mode needs valid identity; anyone mode still needs the anonymous token used for that conversation. If the floating chat control is hidden by native UI configuration, enable it or present `AppNorthChatView` directly.

Check the message limit and network error. For custom chat models, start polling while the conversation is active and stop it when leaving. A saved team reply and an email delivery state are separate things.

## A screenshot or description disappears {#payloads}

Screenshot capture fails closed unless consent, capture and redaction all succeed. An unchanged redaction result is rejected. Check data URL format and the screenshot/body limits.

For rejected idea descriptions, note the current mismatch between native constants and the server maximum in [Limits](/docs/limits#swift). Use the server's field errors to correct the input.

## Store data is missing or stale {#store}

Verify that the app is imported and its App Store Connect connection is active. An app-list credential check does not guarantee permission for every operation. Reviews and keywords need successful collection jobs before new observations appear.

RevenueCat charts need a valid secret v2 key, overview permission and a successful snapshot. Historical snapshots begin with collection; missing days are not fabricated. Explore also depends on collected market records and imported media.

## Publishing reports a conflict or uncertainty {#publishing}

Reload metadata after `STALE` or `PARTIALLY_PUBLISHED`, then compare Apple's current values before retrying. For prices, inspect each job item; cancellation cannot undo completed writes, and an uncertain write may already have reached Apple.

See [Metadata](/docs/metadata#conflicts) and [Price localization](/docs/price-localization#results) for the recovery paths. When retrying an SDK submission, reuse its original idempotency key and unchanged payload.
