> ## Documentation Index
> Fetch the complete documentation index at: https://docs.seosorted.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Troubleshooting

> Error messages you might hit while connecting or publishing, and what to do about each.

## Connecting

<AccordionGroup>
  <Accordion title="“Connecting a CMS or analytics integration is a Pro feature. Upgrade to continue.”">
    The workspace is on the Free plan. Connectors and publishing are Pro features — upgrade from
    **Billing**, then connect again.
  </Accordion>

  <Accordion title="“…stopped with your plan. Resubscribe to continue.”">
    The subscription lapsed. Existing connectors stay configured; publishing and syncing resume
    once billing is current.
  </Accordion>

  <Accordion title="“You are not a member of this workspace” or “Requires ADMIN or higher”">
    Connecting requires the **Admin** or **Owner** role. Editors can publish to existing
    connectors but not create them.
  </Accordion>

  <Accordion title="“Confirm your email address to continue”">
    The account's email is unverified. Use the link in the verification email, or resend it from
    your account settings.
  </Accordion>
</AccordionGroup>

## WordPress

<AccordionGroup>
  <Accordion title="“WordPress rejected those credentials”">
    We reached your REST API and it refused the login. Check that you used the WordPress
    *username* (not the email), and generate a fresh application password.
  </Accordion>

  <Accordion title="“Couldn't reach the WordPress REST API at …”">
    We tried `/wp-json/` and `?rest_route=` and neither returned JSON. Usual causes: a security
    plugin blocking the REST API, HTTP basic auth or a staging password in front of the site,
    Cloudflare "Under Attack" mode, or a site that isn't publicly reachable.

    Check it directly: `https://yoursite.com/wp-json/wp/v2/types` should return JSON.
  </Accordion>

  <Accordion title="No Application Passwords section in WordPress">
    WordPress hides it on non-HTTPS sites. Serve the site over HTTPS, or check whether a security
    plugin has disabled the feature.
  </Accordion>
</AccordionGroup>

## Webhook

<AccordionGroup>
  <Accordion title="“A signing secret must be at least 16 characters”">
    Supply a longer secret, or leave the field blank and we'll generate a strong one.
  </Accordion>

  <Accordion title="“Test failed: Connection refused by …”">
    Nothing is listening on that host and port. Check the URL, the port, and that the service is
    running and reachable from the internet.
  </Accordion>

  <Accordion title="“Test failed: DNS lookup failed for …”">
    The hostname doesn't resolve publicly. Internal-only hostnames and `localhost` won't work
    against the hosted app.
  </Accordion>

  <Accordion title="“Test failed: No response … within 15s”">
    Your endpoint took too long. Acknowledge with a `2xx` immediately and process afterwards.
  </Accordion>

  <Accordion title="Signature verification always fails">
    Almost always because the HMAC was computed over a re-serialized body. Sign the **raw bytes**
    exactly as received, and confirm you're using the secret shown when the webhook was
    connected — reconnecting generates a new one.
  </Accordion>

  <Accordion title="The connector shows “Error”">
    Five or more deliveries failed within an hour. Fix the endpoint, then click **Send test** —
    a successful delivery clears the state.
  </Accordion>
</AccordionGroup>

## Google Search Console and Analytics

<AccordionGroup>
  <Accordion title="“Google hasn't verified this app”">
    Expected while the app is in Google's verification review. Click **Advanced**, then **Go to
    seosorted (unsafe)**, and approve the read-only scope. We only ever request
    `webmasters.readonly` and `analytics.readonly`.
  </Accordion>

  <Accordion title="The property list is empty">
    You signed in with a Google account that has no access to the property. Disconnect, connect
    again, and choose the right account on Google's screen.
  </Accordion>

  <Accordion title="Sync finishes with “no new rows for this property yet”">
    The connector worked; the property has no data in the window. For GA4 this usually means the
    wrong property was chosen. Verify in Google Analytics that the property receives traffic.
  </Accordion>

  <Accordion title="The card still says “Setup required”">
    OAuth completed but no property was chosen. Click **Choose property** and save one.
  </Accordion>

  <Accordion title="Numbers don't match Google exactly">
    Search Console data lags 2–3 days and is sampled at Google's end for some queries. Small
    differences against the Search Console UI are expected; large gaps usually mean a
    domain-property vs URL-prefix mismatch.
  </Accordion>
</AccordionGroup>

## Webflow and Shopify

<AccordionGroup>
  <Accordion title="Shopify: Connect lands on a reactivation or billing page">
    The store's plan is paused, frozen or cancelled — Shopify blocks app installs until billing is
    active again. Reactivate the store, then connect.
  </Accordion>

  <Accordion title="Shopify: “Enter your permanent Shopify domain…”">
    You entered a custom domain. Use the `yourstore.myshopify.com` form.
  </Accordion>

  <Accordion title="Webflow: “No Webflow sites found for this account”">
    The authorisation granted no site. Disconnect, connect again, and pick a site on Webflow's
    authorisation screen.
  </Accordion>
</AccordionGroup>

## Publishing

<AccordionGroup>
  <Accordion title="The Publish dialog offers no destinations">
    No publishing destination is connected yet. Use **+ Connect another destination** in the
    dialog, or set one up in **Project Settings → Integrations**.
  </Accordion>

  <Accordion title="A destination is listed but greyed out with “Setup required”">
    Webflow needs a collection and field mapping; Shopify needs a blog. Finish setup on the
    Integrations tab.
  </Accordion>

  <Accordion title="“Article has no body to publish”">
    The article was never generated or its body was emptied. Generate or write the article first.
  </Accordion>

  <Accordion title="A scheduled article never published">
    Check that the destination is still connected and not in **Error**, and that the plan is
    active. Scheduled runs skip workspaces that fail either check.
  </Accordion>
</AccordionGroup>

<Note>
  Still stuck? Email [hello@seosorted.ai](mailto:hello@seosorted.ai) with the connector, the exact
  error text, and roughly when it happened — the delivery and job logs are keyed by timestamp.
</Note>
