Troubleshooting common issues
A symptom-by-symptom guide for the most common problems in Ken AI, written for both end users and AI support agents diagnosing issues.
Overview
This article covers four common failure modes: a reply that will not send from the Replies page, a "Failed to load search metadata" toast that blocks campaign audience setup, a page that is stuck in a loading skeleton, and a dashboard that shows zeros across every metric. Each section explains what you see, why it happens, and exactly how to recover.
The Replies page is at /replies in the sidebar. Dashboard analytics are at /dashboard. Campaign audience setup (where search metadata is required) is accessed from inside a campaign under the audience/segment step.
Before you start
You must be signed in with an active workspace selected. If the dashboard shows "Select a workspace," choose one from the workspace switcher at the top of the page before proceeding with any troubleshooting step here.
If you see "Access denied" or "Sign in required" anywhere on the dashboard, contact your workspace admin - those are permission or session issues, not the scenarios covered here.
How to resolve each issue
Cannot send a reply
- Open the Replies page (
/replies). - Click the thread you want to reply to.
- In the composer at the bottom of the thread, check whether the "Reply" button is greyed out or missing entirely. If it is active but clicking it does nothing, note the exact toast message that appears.
- If the toast reads "The page was updated while you were replying. Copy your draft, refresh, and try again." - copy your composed text out of the editor, then press
Cmd+R(Mac) orF5(Windows/Linux) to reload the page. Paste your draft back in and send. - If the toast reads "The app was updated. Reloading..." - the app will reload automatically within 1-2 seconds. Wait for the reload, then reopen the thread and resend.
- If the toast reads "Failed to send. Check your connection and try again." - check your internet connection and retry. If the problem persists, reload the page.
- If the page reloads on its own with no toast visible - this is the automatic chunk recovery (see How it works below). Wait for the reload to finish, then reopen the thread. No action is needed.
Search metadata failed to load
This affects the audience filter panel inside campaign setup. The symptom is a toast notification that reads "Failed to load search metadata." and a filter panel that shows an error state with a "Retry" button.
- Click the Retry button that appears in the filter panel. This re-fetches the metadata without a full page reload.
- If the retry fails again, reload the page (
Cmd+RorF5). - If the error persists across reloads, wait 5-10 minutes and try again. The metadata endpoint occasionally times out under load.
Page stuck on a loading skeleton
If a page shows loading placeholders (grey animated bars) for more than about 10 seconds and never resolves to real content:
- Reload the page once. Most stale-tab issues resolve with a single reload.
- If the page shows content briefly, then goes blank and reloads by itself - that is automatic chunk recovery. It happens at most once. The page will load normally after the reload.
- If after the automatic reload the page still shows only a loading skeleton, clear the browser cache and reload: in Chrome, press
Cmd+Shift+R(Mac) orCtrl+Shift+R(Windows/Linux). - If the stuck state persists, try a different browser tab or an incognito window to rule out a cached state issue.
Dashboard shows zero for every metric
- Open the Dashboard page (
/dashboard). - Confirm a workspace is active. If the page shows "Select a workspace," pick one from the workspace switcher first.
- Check the date range selector at the top right of the page. If no range is selected, the chart area shows "Select a date range" and all metric pills show 0. Select a preset such as "Last 30 days" and wait for data to load.
- If a range is already set and everything still reads 0, click the Refresh button next to the date picker. This re-resolves the date range against today (important on long-lived sessions) and invalidates all cached queries.
- If the chart area shows "Couldn't load analytics" with a "Retry" button, click Retry. If the campaigns or email delivery cards show the same inline error, use the per-card Retry button.
- If campaigns genuinely have activity in the selected range but the chart still shows 0, this can indicate the campaign uses segments. Check that the campaign's segment breakdown data is present by navigating to the campaign directly and reviewing its analytics tab.
How it works
Automatic page recovery after a deploy. When the team ships an update, old JavaScript chunk filenames become invalid. If you have a tab open during a deploy, your browser may request a file that no longer exists on the server. The app detects this and reloads the tab once, automatically. A session-level guard (stored in sessionStorage) ensures this reload happens at most once within a 10-second window - so a file that is genuinely missing for another reason will never cause an infinite reload loop. After the single reload, your browser fetches the new build and everything works normally.
Reply send and stale Server Actions. When you click Reply, the composer calls a Next.js Server Action. Server Action references are also content-hashed, so a tab opened before a deploy will call an action that no longer exists. The app detects this, shows a toast, and either reloads automatically (when you are not mid-composition) or shows the "Copy your draft, refresh, and try again" message (when preserving your work is safer).
Why old chunks stay available for a while. The deploy pipeline copies the new build's static files onto disk before rolling the new containers. Files untouched for more than 3 days are removed. This means most tabs opened before a deploy can keep loading their old JavaScript chunks with no interruption at all - the reload path is a fallback for tabs older than the retention window.
Search metadata. The metadata that powers campaign audience filters (industry lists, seniority options, location hierarchies) is fetched once per session from a dedicated endpoint. If that endpoint is slow to respond or briefly unreachable, the fetch fails and the filter panel enters its error state. A retry or page reload almost always recovers because the endpoint is only transiently unavailable.
Dashboard zero stats. The dashboard chart and metric pills are calculated server-side from your workspace's email-sending activity. Zeros are the correct result when no date range is selected, or when the selected range falls outside the period when campaigns were active. Zeros can also appear temporarily on sessions left open for hours if the date-range calculation uses a stale "today" reference - the Refresh button re-resolves it.
Troubleshooting & debugging
Symptom: "The page was updated while you were replying. Copy your draft, refresh, and try again."
- Cause: The page was deployed while the reply composer was open. The Server Action reference rotated.
- What to check: The composer's send button. The draft text in the editor should still be there.
- Fix: Copy the draft text manually, press
Cmd+R, reopen the thread, paste the draft back in, and send.
Symptom: "The app was updated. Reloading..."
- Cause: A deploy happened and a non-composer surface detected the stale action. Auto-reload is safe here.
- What to check: Nothing. The app reloads in 1.5 seconds.
- Fix: Wait for the reload to complete.
Symptom: Page reloads itself once with no toast.
- Cause: A missing JavaScript chunk was detected (ChunkLoadError). The app recovered automatically.
- What to check: After the reload, the page should work normally.
- Fix: None needed. If the page still fails after the single auto-reload, try a manual hard refresh (
Cmd+Shift+R).
Symptom: Page is permanently stuck loading (skeleton never clears).
- Cause: Possible network partition, very slow API response, or a rare case where a chunk is genuinely 404 after the retry window.
- What to check: Open the browser's developer console (F12) and look for 4xx or 5xx errors in the Network tab. A 502 on
/api/healthor a 15-second timeout on any API call indicates a server-side issue. - Fix: Reload the page. If the problem repeats within minutes, contact support with the URL and any error codes from the Network tab.
Symptom: "Failed to load search metadata." toast when opening campaign audience setup.
- Cause: The search metadata endpoint timed out or returned an error. This can happen transiently under load.
- What to check: Click Retry first. If retries keep failing, check whether other pages in the app load normally. An isolated metadata failure is usually transient.
- Fix: Retry, then reload. If failing for more than ~5 minutes, escalate to the engineering team with the exact time so they can check the search service logs.
Symptom: Dashboard shows zeros on every metric with a date range already selected.
- Cause: (a) Long-lived tab with a stale "today" reference, (b) the workspace has no activity in the selected range, (c) an API error on the analytics endpoint.
- What to check: Look for an inline "Couldn't load analytics" error message under the chart. If it is absent, zeros are likely a real "no data" result.
- Fix: Click Refresh. If the Refresh button is greyed out during a fetch, wait for the current request to finish. If the error message is present, use the Retry button on the chart section.
Symptom: "Couldn't load campaigns" or "Couldn't load email delivery" card error on the dashboard.
- Cause: A transient API failure on one of the two card endpoints. Cards load independently, so the chart can still load while a card fails.
- What to check: The other cards. If only one card shows an error, it is a scoped failure.
- Fix: Click the per-card Retry button. If both cards fail simultaneously, reload the page.
Symptom: "Access denied" on the dashboard analytics section.
- Cause: Your account role does not have permission to view analytics for this workspace.
- What to check: Your role in Settings. Analytics access is role-gated.
- Fix: Contact a workspace admin to adjust your role.
FAQ
The reply composer appears but clicking "Reply" does nothing. Why? The Reply button is disabled until the body has text, the To field is valid, and no validation error is shown. Check that you have typed a message body, and that the To: field contains a valid email address. The button label matches the current mode - "Reply," "Reply All," or "Forward."
Will I lose my draft if the page auto-reloads? If the app detects a stale Server Action while you are writing, it shows the "Copy your draft" message and does not reload automatically - it is waiting for you to save the text first. The automatic reload only happens in non-composer contexts, or in the composer when the body is empty.
Why does the dashboard date range sometimes show an old window on a tab I left open? Relative presets like "Last 30 days" are calculated when the tab loads and when you click Refresh. They are not recalculated continuously. On a tab open for many hours, clicking Refresh moves the window to today's date before re-fetching data.
The search filter panel says "Something went wrong" and Retry keeps failing. What next? If three or more retries all fail, the search metadata service may be experiencing a sustained outage. Try again in 10-15 minutes. If the problem lasts longer, contact support and include the time the errors started so the team can review service health logs.
I see zeros on the dashboard chart but the campaign list shows positive reply counts. Are the numbers wrong? Not necessarily. The dashboard chart may be scoped to a different date range than the campaign's own analytics view, or the campaign may be sharded into segments that do not roll up in the current view. Click Refresh and confirm the date range covers the period when the replies arrived.
The page reloaded once on its own and is now working. Is that normal? Yes. That is the automatic chunk recovery running correctly. It happens when your browser requests a JavaScript file that was replaced by a new deploy. The app reloads once, fetches the new files, and continues. You do not need to take any action.