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

# Hidden URL Flags & Admin Tricks

> Internal reference for the hidden URL query-params and unlisted tabs that expose operator, debug, and self-serve tooling in the app.

> [!WARNING]
>
> This is an **internal, operator-only** reference. It is intentionally unlisted in the
> sidebar and is meant for Statisfy support and admin staff. The flags below expose
> diagnostic, debug, and destructive tooling — do not share externally or link from
> customer-facing pages.

These flags are plain URL query-params — no server-side flag infrastructure. Append them
to the relevant app URL (`https://app.statisfy.com/...`). Two resolution styles are used,
so the exact value matters:

| Style | Trigger | Backed by |
| :- | :- | :- |
| Presence flag | `?internal` (presence only — value ignored) | `useInternalMode()` |
| Value flag | `?<name>=1` | `useUrlFeatureFlag()` |
| Sticky value flag | `?<name>=1`, then persists for the browser session; `?<name>=0` clears it | `useStickyUrlFeatureFlag()` (via `sessionStorage`) |

> [!NOTE]
>
> These are distinct from **PostHog-backed feature flags** (`useFeatureFlag`), which gate
> production rollouts by user / cohort / percentage. The flags on this page are manual URL
> switches only.

## Quick reference

| Flag / URL | Feature | Notes |
| :- | :- | :- |
| `&show_sync=true` | Activity → Meeting: CRM sync status | Append to any meeting activity to check whether it synced to the CRM |
| `&salesforce_account_debug=true` | Account → Objects: Salesforce debug | Shows live Salesforce values and the diff vs. Statisfy fields |
| `?tab=delete` | Activity: delete any activity | Unlisted tab; admin-gated; requires a written deletion reason |
| `?tab=unsubscribed` | Campaigns: unsubscribed recipients | Unlisted tab listing everyone who unsubscribed |
| `/integrations/monitoring?tab=sync_issues` | Integration Monitoring: records stuck on their way to the CRM | Visible tab when upstream sync is on; requires settings manage permission; sub-tabs per entity type via `&issueType=` |
| `?sync_errors=1` | Account and person pages: CRM sync status icon | Admin and Member All Accounts see the icon without the flag; other roles need it |
| `?tab=accounts&manage_customers=1&skip_type_check=1` | Settings: self-serve account merge | Enables the merge-duplicate-accounts UI, including untyped accounts. See [Merging duplicate accounts](/accounts/merging_duplicate_accounts) |
| `?internal` | Integration admin: backfill + detailed monitoring | JIRA / BigQuery / Snowflake backfill, per-query triggers, and diagnostic monitoring |
| `?tab=config&health_frequency_update=1` | Settings: health computation frequency | Lets users change how often health is recomputed (in-development) |
| `?show_note=1` | Project/Task comments: internal-note visibility | Reveals the Reply / Internal-note tabs (and per-comment visibility badge) on comments of an externally-shared project |
| `/portals` | Portals management page | Hidden route (no left-nav entry yet); list, create, and manage portals + API keys |
| `?ai_usage=1` | Settings: AI Usage & Credits page | Not in the left navigation by default; the flag reveals the row. Full page content documented at [AI Usage & Credits](/admin/ai_usage) |
| `?workbench=1` | Settings: Human Twin tab | Admin-only + flag-gated. Tenant-wide third-party MCP tool config and skills for the Workbench, plus a dry-run preview panel (choose a user, account, and optional activity to see what the Workbench would draft for them) |

## Flag details

### `&show_sync=true` — Meeting CRM sync status

Append to a meeting activity URL to reveal a CRM sync-status indicator at the bottom of the
activity, so you can confirm whether a specific activity synced to the connected CRM.

* **Where:** meeting activity detail (`/book/[id]/.../activity/[activity_id]`)
* **Value required:** `=true`

### `&salesforce_account_debug=true` — Salesforce account debug

On an account's **Objects** view, reveals controls to refresh field values directly from
Salesforce — both a bulk "refresh all fields" action and per-field refresh — and displays
the live Salesforce value alongside the Statisfy value so you can spot field-level
differences.

* **Where:** account detail → Objects (`/book/[id]/details`)
* **Value required:** `=true`

### `?tab=delete` — Delete any activity

An unlisted tab on the Activity page that lets an admin look up an activity by ID, preview
it, and permanently delete it.

* **Where:** `https://app.statisfy.com/activity?tab=delete`
* **Gated by:** `activity_report` permission (admins only — the tab renders empty otherwise)
* **Guardrail:** a deletion reason is mandatory (minimum 5 words / 20 characters) before the delete can be submitted

> [!WARNING]
>
> Deletion is permanent. Always capture a meaningful reason — it is required and recorded.

### `?tab=unsubscribed` — Unsubscribed recipients

An unlisted tab on the Campaigns page that lists every recipient who has unsubscribed,
along with the timestamp. It has no visible tab trigger and is reachable only via the URL.

* **Where:** `https://app.statisfy.com/campaigns?tab=unsubscribed`

### `/integrations/monitoring?tab=sync_issues` — Records stuck on their way to the CRM

A **Sync Issues** tab on the **Integration Monitoring** page listing every record whose changes
have not reached the connected CRM, in one place. The per-record banner on an opportunity answers
*"is this one stuck"*; this page answers *"what is stuck at all"*, which nothing else could without
opening records one at a time.

* **Where:** `https://app.statisfy.com/integrations/monitoring?tab=sync_issues`
* **Gated by:** the `settings` `manage` permission. Rows carry raw CRM error bodies naming
  Salesforce field API names and validation rules, which is why it is permission-gated.
* **Visible tab:** the monitoring page shows an **Integrations** tab and a **Sync Issues** tab
  only when bidirectional (upstream) sync is on for at least one of accounts, opportunities,
  people, or activities. Otherwise the page shows only the integration list.
* **Old URL retired:** `/integrations?tab=sync_issues` no longer opens Sync Issues. Use the
  monitoring URL above.

#### Entity sub-tabs

The page opens on **Opportunities**. Each sub-tab is its own `&issueType=` value, so a
deep link lands on the right one:

| Sub-tab | URL |
| :- | :- |
| Accounts | `/integrations/monitoring?tab=sync_issues&issueType=account` |
| Opportunities *(default)* | `/integrations/monitoring?tab=sync_issues&issueType=opportunity` |
| Projects/Tasks | `/integrations/monitoring?tab=sync_issues&issueType=project_task` |
| People | `/integrations/monitoring?tab=sync_issues&issueType=contact` |
| Activity | `/integrations/monitoring?tab=sync_issues&issueType=activity` |

#### Reading a row

* **ID** links to the record itself, and shows a friendlier label where the id says nothing —
  a contact row shows the person's email, with the uuid kept in the link.
* **Last attempt** is when the push was last tried, in UTC, newest first.
* **Error** is the CRM's own words: the message, and the field it named where it named one.
  Expanding a row shows the CRM's raw response with the HTTP headers stripped.
* **Retry sync** appears on **Opportunities only**. It pushes that one record immediately and
  reports what the CRM said. The other types have no single-record push to offer yet.

> [!NOTE]
>
> An empty table is the healthy answer. A record in sync has no row at all, so there is no green
> "all good" list to read — absence is the signal. The CRM's name comes from the record's own
> destination, so a HubSpot tenant reads HubSpot and a Jira-bound project task reads JIRA.

#### ERRORED vs FAILED

| State | Means |
| :- | :- |
| **ERRORED** (amber) | Still being retried on the hourly sync. The count reads *"N of 5"*. |
| **FAILED** (red) | Retried five times and stopped. The hourly job now skips it entirely, so it stays put until someone retries it by hand or fixes the cause in the CRM. |

The cap is `UPSTREAM_SYNC_MAX_RETRIES` (default 5). Rows written before the skip landed can
carry a true count above the cap; the UI clamps the display to *"5 of 5"* while the row keeps
the real number.

### `?sync_errors=1` — CRM sync status icon on account and person pages

Shows the sync status icon (and its **Force sync** dialog) on an account or person page for a
user whose role does not see it by default.

* **Where:** `/book/[id]?sync_errors=1` and `/people/[id]?sync_errors=1` (use `&sync_errors=1`
  when the URL already has a `?`)
* **Shown without the flag to:** the **Admin** and **Member All Accounts** roles
* **Value required:** `=1`
* **Backed by:** `useShowSyncErrors()`, which reads `useUrlFeatureFlag('sync_errors')`
* **Not sticky:** the icon goes away on the next page that does not carry the flag

### `?manage_customers=1` + `?skip_type_check=1` — Self-serve account merge

On **Settings → Accounts**, `manage_customers=1` turns on the self-serve UI for merging
duplicate accounts. `skip_type_check=1` additionally includes accounts that have no type set
in the merge-candidate list (untyped accounts are excluded server-side by default).

* **Where:** `https://app.statisfy.com/settings?tab=accounts&manage_customers=1&skip_type_check=1`
* **Sticky:** `manage_customers` is sticky for the browser session — once enabled it stays on across navigation until you pass `?manage_customers=0`
* **See also:** [Merging duplicate accounts](/accounts/merging_duplicate_accounts)

### `?internal` — Integration backfill & detailed monitoring

A presence flag (just `?internal`, no value) that reveals operator-only tooling inside the
Integration admin without standing up server-side flags:

* **Warehouse config** (BigQuery, **Snowflake**, Redshift, Postgres): per-query backfill triggers
* **JIRA config:** per-project backfill controls
* **Integration monitoring:** the diagnostic view (log request-id chips, failure-investigation context)

Add `?internal` to the relevant Integration → Admin page (e.g. JIRA, BigQuery, Snowflake).

> [!NOTE]
>
> There is no separate Snowflake flag — Snowflake backfill and monitoring are covered by
> `?internal`, the same as the other warehouse integrations.

### `?health_frequency_update=1` — Health computation frequency

On **Settings → Config**, reveals a control that lets users change how frequently account
health is recomputed. This is an in-development flag and is hidden by default.

* **Where:** `https://app.statisfy.com/settings?tab=config&health_frequency_update=1`
* **Value required:** `=1`

### `?show_note=1` — Comment internal-note visibility

On an **externally-shared** project, reveals the comment-visibility controls: the
**Reply / Internal-note** tabs in the composer (project and task comments) plus the
per-comment visibility badge. Without the flag the composer falls back to a plain
single box and every comment is saved as internal — so the internal-note surface
stays hidden until the full shared-comments experience is fully rolled out.

* **Where:** project detail and task comments (`/projects/[id]`, and the `/share/...`
  project view) — only takes effect when the project's **Share externally** toggle is on
* **Value required:** `=1`
* **Backed by:** `useUrlFeatureFlag('show_note')`

### `/portals` — Portals management page

A route that lists all portals (drafts + live, with any archived-but-live one badged
**Archived**), and lets you create a portal and manage publishable API keys. It has no
entry in the left navigation yet — the feature is not fully live, so the page is reachable
only by navigating to the URL directly.

* **Where:** `/portals` (e.g. `https://dev-app.statisfy.com/portals`)
* **Sub-params:**
  * `?tab=api-keys` — deep-links straight to the API-keys panel (same panel as `/settings?tab=api-keys`)
  * `?view=live` — filters the list to live portals only (hides drafts)
* **Related:** `/portals/[id]` for an individual portal

### `?ai_usage=1` — AI Usage & Credits page

Reveals the **AI Usage** row in the left navigation (under Settings) and unlocks the
`/ai-usage` route directly. There is no rollout infrastructure behind this — it's a plain
URL switch, not a per-org enablement.

* **Where:** anywhere in the app, e.g. `https://app.statisfy.com/ai-usage?ai_usage=1`
* **Value required:** `=1`
* **Backed by:** `useUrlFeatureFlag('ai_usage')`
* **Page content:** see [AI Usage & Credits](/admin/ai_usage) for what the page shows once unlocked

### `?workbench=1` — Human Twin settings tab

Reveals the **Human Twin** tab in Settings (admin users only).

* **Where:** `https://app.statisfy.com/settings?tab=workbench-agent&workbench=1`
* **Value required:** `=1`
* **Backed by:** `useUrlFeatureFlag('workbench')`

#### Third-party tools (MCP)

The Workbench can use connected [third-party MCP tools](/integrations/third_party_mcp_servers)
(for example, Jira) when it prepares actions. An admin enables them under the **Human Twin**
tab:

* Turn on **Enable third-party MCP tools for the workbench**.
* Select which tools the workbench may use from each connected server.
* Optionally add an **injected prompt** that steers when and how it uses them (for example,
  *"File a Jira ticket when a customer reports a hardware issue"*).

Tools marked **approval-required** on the Integrations page pause for review before they
run — the review shows up as a tool-approval action in your queue, rather than executing
automatically.

#### Skills

The **Skills** tab under **Settings → Human Twin** sets which skills (ready-made workflows) the Human Twin can load. One list applies to every kind of Workbench run.

1. Open the **Skills** tab and click **Add Skills**.
2. Pick skills from the catalog. To detach one, click remove on its card.
3. Click **Save**. **Cancel** discards unsaved edits.

A skill runs only when it is attached here and enabled for your organization in **Settings → Skills**.

* **Save replaces the whole list.** Removing a card and saving detaches that skill.
* **Unavailable skills stay visible.** An attached skill that is later archived or turned off shows as an **Unavailable** card. Remove it and save to clean it up.
* **Refused saves.** Statisfy refuses the save and names the skills at fault if you add a skill your organization can't use (*"These skills can't be attached: ..."*) or one that needs tools the Workbench can't provide, such as the slide-building tools (*"These skills need tools the workbench can't provide ..."*). Only newly added skills are checked.

#### Previewing the Workbench for a user

Admins can see what the Workbench *would* prepare for a specific person and account — a
dry run that reads their data. It's useful for checking how the Workbench behaves for a
teammate before they rely on it.

From the **Human Twin** tab, click **Playground** (or go directly to
`/settings/workbench-agent/playground?workbench=1`). On the preview panel:

1. **User** — choose the person to run as. The preview uses that user's book of business
   and permissions.
2. **Account** — pick the account to focus on.
3. **Activity (optional)** — leave it on **Whole account (or pick one activity)** to scan
   the whole account, or select a single activity (like one email thread) to scope the
   preview to just that.
4. Click **Run preview**.

The preview thinks through the account the same way the live Workbench does and shows the
actions it *would* draft — emails, Slack replies, tasks, and meeting prep — along with its
reasoning.

> [!NOTE]
>
> Workbench Preview is available to **admins** and creates, sends, or executes nothing
> side-effecting — but read-only lookups (like a search or a memory read) may still execute,
> so it isn't a fully inert read of static data.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.