# Simple Commenter Documentation The complete Simple Commenter documentation, concatenated for AI use. --- # AI Assistant The AI Assistant is a chat panel built into the dashboard. Ask it questions about your feedback, get reports, and let it draft status changes or replies for you to approve. Open it from the **AI Assistant** button (the sparkles icon) in the sidebar. To use ChatGPT, Claude, Cursor, or another external AI tool, open the separate **MCP** item directly in the project sidebar. [MCP & AI connections](https://www.simplecommenter.com/docs/integrations/ai-agent) has the hosted server URL, browser authorization, and local API tokens. The built-in AI Assistant needs no MCP connection or token. The assistant is included on every plan, including the trial, at no additional charge, and is available to every role: workspace admins, team leads, and clients. It only sees the projects and statuses the signed-in person can see. ## What It Can Do | Capability | What it does | | --- | --- | | Answer product questions | Searches these docs and answers with links to the relevant page. | | Query your feedback | Lists projects and comments, counts them, and summarizes recent activity. | | Generate reports | Builds a feedback report (for example, 'what was done last week') you can download as Markdown or PDF. | | Propose actions | Drafts a status change or a reply, shown as a confirmation card you approve before anything happens. | ## Asking About Your Feedback Ask in plain language. For example: - "How many open comments are on my marketing site?" - "What did clients report this week?" - "Show me high-priority feedback across all projects." The assistant only ever sees the projects and statuses **you** are allowed to see, so its answers are scoped to your access. If you have more than one project, name the project or it will ask which one you mean. ## Reports Ask for a summary or digest and the assistant gathers the data, then renders a report card. The card includes **Download as Markdown** and **Download as PDF** buttons, so you can share it with your team or a client. For a spreadsheet of individual website comments, use **Comments** or **Board → Export CSV**. For cross-project exports including assets or archived feedback, use the external [MCP export tools](https://www.simplecommenter.com/docs/integrations/ai-agent#filters-and-complete-results). ## Actions and Confirmation The assistant never changes your data on its own. When you ask it to update a status or reply to a comment, it proposes the change as a **confirmation card**. Nothing happens until you click confirm, and replies are attributed to you. If the assistant says it did something, it did so only after you approved the card. Every confirmed action is recorded in an audit log. ## Who Can Use It The AI Assistant is available to everyone, with access scoped to each role: | Role | What they get | | --- | --- | | Workspace Admin | All projects and statuses, plus custom instructions and saved preferences. | | Team Lead | Only assigned projects, with their role-visible statuses. No preferences. | | Client | Only invited projects, with their reduced statuses. No account, billing, or integration help. | ## Custom Instructions and Preferences Workspace admins can give the assistant durable, account-level guidance, for example a preferred report format or tone. The assistant also learns standing rules when you clearly state them. These preferences apply across every chat. Preferences are account-level and available to workspace admins only. Team leads and clients do not see this feature. ## Privacy The assistant's tools scope every result to what your account and role may see. It will not surface other accounts' data, and it has no access to passwords, tokens, or payment details. For billing questions it points you to **Workspace settings → Billing**. ## Next Steps - [Connect an external AI agent with MCP](https://www.simplecommenter.com/docs/integrations/ai-agent) - [Browse and manage comments](https://www.simplecommenter.com/docs/dashboard/comments) - [Set up integrations](https://www.simplecommenter.com/docs/integrations/slack) --- # Asset Commenting Collect visual feedback on design files, mockups, and documents. Upload images or PDFs to your project, share a link with clients, and receive pinpoint feedback directly on the file. ## Overview Asset commenting lets you: - **Upload design files** - Images and PDFs for visual review - **Share with clients** - Send a link, no login required - **Collect precise feedback** - Comments pinned to exact locations - **Track in dashboard** - All feedback in one place This is perfect for design reviews, mockup feedback, and document annotations without installing any code on a website. ## Getting Started ### 1. Upload Files 1. Go to your project dashboard 2. Click **Assets** in the sidebar 3. Drag and drop files or click to upload ### 2. Share with Clients 1. Click on any uploaded file to open it 2. Click **Copy Link** in the toolbar 3. Send the link to your client ### 3. Collect Feedback Clients can view the file and leave comments directly on it. Comments appear in your dashboard alongside website feedback. ## Uploading Files ### Supported Formats | Type | Formats | | --- | --- | | Images | PNG, JPG, GIF, WebP, SVG | | Documents | PDF | ### Upload Methods - **Drag and drop** - Drop files directly onto the Files page - **Click to upload** - Click the upload area to select files - **Multiple files** - Upload several files at once (plan limits apply) File size and storage limits vary by plan. See [storage limits](https://www.simplecommenter.com/docs/asset-commenting#storage-limits) below. ## File Viewer Click any file to open the full-screen viewer with these controls: ### Toolbar Options - **Copy Link** - Copy shareable URL to clipboard - **Download** - Download the original file - **Zoom** - Fit to width, fit to height, or custom zoom - **Full Screen** - Expand to full screen mode ### PDF Navigation For PDF files, use the page controls to navigate: - Previous/Next page buttons - Current page indicator - Comments are tied to specific pages ## Commenting on Files ### Adding Comments 1. Open a file in the viewer 2. The comment widget appears on the right 3. Leave feedback - comments are associated with the current view 4. For PDFs, comments track which page you're on ### Comment Features - **Text feedback** - Describe issues or suggestions - **Attachments** - Add screenshots or reference files - **Status tracking** - Mark as To Do, In Progress, Done - **Replies** - Discuss feedback in threads PDF comments include the page number, so you always know which page the feedback refers to. ## Sharing with Clients ### Enable Public Sharing To let clients view and comment without logging in: 1. Go to **Project Settings > Widget > Features** 2. Enable **Public Share Links** 3. Copy the file link and share it ### Sharing Options | Level | Description | | --- | --- | | Per-file | Enable sharing for individual files | | All files | Enable sharing for all files in the project | ### How Shared Links Work - Links use secure, time-limited URLs (auto-refresh) - Clients can view and comment without an account - You control access through project settings ## Managing Files ### Views - **Grid view** - Visual cards with thumbnails - **List view** - Table layout with details ### Filtering & Sorting Filter by: - All files - Images only - PDFs only Sort by: - Last uploaded - Name (A-Z) - File size - Most comments ### Deleting Files - Hover over a file and click the trash icon - Or select multiple files in list view for bulk delete Deleting a file also removes all comments on that file. This cannot be undone. ## Storage Limits | Plan | Max File Size | Total Storage | | --- | --- | --- | | Trial/Pro | 5 MB | 100 MB | | Unlimited | 25 MB | 1 GB | | Business | 25 MB | 5 GB | | Enterprise | 100 MB | 50 GB | ## Use Cases ### Design Review Upload mockups from Figma, Sketch, or Adobe XD. Share with stakeholders to collect feedback before development. ### Client Approvals Share design concepts with clients. They can comment directly on the design without needing any special tools. ### Document Feedback Upload contracts, proposals, or documentation. Collect page-specific feedback on PDFs. ### Internal Review Share work-in-progress with your team. Track feedback and revisions in one place. ## Next Steps - [Manage your files](https://www.simplecommenter.com/docs/dashboard/files) - [Configure sharing settings](https://www.simplecommenter.com/docs/dashboard/functionalities) - [Set up notifications](https://www.simplecommenter.com/docs/dashboard/notifications) - [Creative Asset Feedback page](https://www.simplecommenter.com/creative-asset-feedback) - [Image Feedback page](https://www.simplecommenter.com/image-feedback) - [PDF Feedback page](https://www.simplecommenter.com/pdf-feedback) --- # Chrome Extension Leave feedback on any website directly from your browser. No script installation required on the site you're reviewing — install the extension once and start commenting anywhere. Install the Extension --- ## Key Features ### Comment on Any Website Review client sites, staging environments, competitor pages, or your own live site — the extension works on any URL without touching the site's code. ### Automatic Screenshots Every comment you leave captures an automatic screenshot of the page at that moment. No need to manually attach images — context is always preserved. ### Works Hand-in-Hand with the Script If a site already has the Simple Commenter widget installed, the extension detects it and logs you in automatically. Your comments flow into the same project dashboard — no duplicate setup needed. **Website admin?** The extension is the fastest way to review any site. Install it once, pin it to your toolbar, and you're ready to annotate anything in Chrome. --- ## How to Install 1. Click **Add to Chrome** on the Chrome Web Store page 2. Pin the extension to your toolbar for quick access 3. Navigate to any website you want to review 4. Click the Simple Commenter icon and start leaving comments All comments sync back to your [dashboard](https://www.simplecommenter.com/app) automatically. Add to Chrome --- ## Onboard Clients via the Extension You can invite clients to leave feedback through the extension — they don't need a script on their site or any technical setup. 1. Go to your project in the dashboard and open the **Clients** page 2. Click **Invite Client** and enter their email address 3. Set the invite channel to **Extension** 4. The client receives an email with a link to install the extension and get started Once they install and log in, their feedback appears in your project alongside all other comments. Clients invited via the Extension channel only see comments for the projects you've added them to. They don't get access to your full dashboard. --- ## Next Steps --- # Access Settings Configure who can access and use the commenting widget on your website. These settings control widget visibility, authentication requirements, and client access modes. ## Widget Visibility ### Parameter-Based Activation When enabled, the widget only appears when a specific URL parameter is present. **How it works:** - Add `?feedback=true` to any page URL to show the widget - Without the parameter, the widget is hidden from visitors - Useful for internal review or staging environments **Turning the widget off again:** Once activated, the widget stays visible on every page of the site (the activation is remembered in the visitor's browser). To hide it: - Add `?feedback=false` to any page URL, or - Open the widget drawer, go to the **Profile** tab, and click **Exit** This is useful when you want to collect feedback on a live site without exposing the widget to regular visitors. **Already using `?simple-commenter=true`?** That older parameter still works everywhere `?feedback=true` does, so existing links and bookmarks keep functioning. New links generated by Simple Commenter use `?feedback=true`. ### Always Visible When parameter-based activation is disabled, the widget appears on all pages where the script is installed. ## Authentication ### Require Sign-In When enabled, users must sign in before they can leave comments. **Benefits:** - Track who left each comment - Enable email notifications to commenters - Prevent anonymous spam **When disabled:** - Anyone can leave comments anonymously - Name and email fields are optional ## Client Access Modes Control how external clients can access and use the widget: ### Open Access Anyone can sign up and start commenting immediately without approval. ### Request Access Clients can request access, but must be approved by an admin before they can comment. **Workflow:** 1. Client clicks "Request Access" in the widget 2. Request appears in your [Clients](https://www.simplecommenter.com/docs/dashboard/clients) dashboard 3. Admin approves or rejects the request 4. Client receives email notification of decision ### Invite Only Only clients you explicitly invite can access the widget. **Workflow:** 1. Go to [Clients](https://www.simplecommenter.com/docs/dashboard/clients) in the dashboard 2. Click **Invite Client** 3. Enter their email address 4. They receive an invitation email with access link Manage your client list in the [Clients](https://www.simplecommenter.com/docs/dashboard/clients) section. ## Saving Changes After adjusting settings, click **Save** in the bottom bar to apply changes. Click **Discard** to revert to the last saved state. ## Next Steps - [Manage clients](https://www.simplecommenter.com/docs/dashboard/clients) - [Configure what clients can do](https://www.simplecommenter.com/docs/dashboard/functionalities) - [Set up default access settings](https://www.simplecommenter.com/docs/dashboard/default-settings) - [Log your own users in automatically with the JS API](https://www.simplecommenter.com/docs/js-api) (skip the widget login for people already signed into your app) --- # Billing Manage your SimpleCommenter subscription, view billing history, and update payment details. ## Current Subscription View your active subscription details: - **Plan** - Your current tier (Trial, Pro, Unlimited, Agency, Enterprise) and plan type (Trial, Subscription, Lifetime Deal, or Free) - **Status** - Active, Canceled, or Past Due - **Renewal Date** - When your subscription renews - **Price** - Monthly or annual billing amount ## Managing Your Subscription ### Upgrade Plan To upgrade to a higher tier: 1. Click **Upgrade** or visit the [pricing page](https://www.simplecommenter.com/pricing) 2. Select your new plan 3. Complete payment 4. New features are available immediately ### Change Billing Cycle Switch between monthly and annual billing: 1. Click **Manage Subscription** 2. Select monthly or annual billing 3. Changes take effect at your next renewal Annual billing saves up to 20% compared to monthly billing. ## Billing Portal Click **Manage Billing** to access the Stripe billing portal where you can: - Update payment method (credit card) - View and download invoices - Update billing address - Manage subscription details ## Billing History View past invoices and payment history: - Invoice date - Amount charged - Payment status - Download PDF invoice ## Invoice Emails If your accounting team wants invoices delivered automatically, set an invoice email under **Account → Billing → Invoice emails**. After every successful subscription payment, the same invoice you can download from Billing History is emailed there as a PDF. - Leave the field empty to turn invoice emails off. Invoices stay available in Billing History either way. - Only workspace admins can set the invoice email. - Company details added on an invoice (name, address) are included on the emailed PDF. - One-off purchases such as lifetime deals are not emailed. Download those from Billing History. ## Cancel Subscription To cancel your subscription: 1. Click **Cancel Subscription** 2. Review what you'll lose access to 3. Confirm cancellation Canceling removes access to paid features at the end of your billing period. Your data is retained for 30 days. ## Lifetime Deals (AppSumo) If you redeemed an AppSumo code or another one-off purchase, the Billing page shows your plan type as **Lifetime Deal** next to your tier (AppSumo codes put the account on the **Unlimited** tier). - The deal never renews and never expires. There is nothing to pay and no subscription to manage. - You keep the features and limits of your lifetime tier, including the AI Agent integration. - You do not need to upgrade unless you want features that only Agency or Enterprise include, such as whitelabel branding, a custom portal domain, or unlimited team members. Those are added by subscribing from **Account → Billing → Upgrade**. If you are unsure how a subscription would combine with your lifetime deal, contact support via the chat bubble before upgrading. ## Trial Period New accounts start with a 14-day free trial with full access to all features. During the trial: - No credit card required - Full access to all features - Trial banner shows days remaining ### Does my trial automatically convert to a paid subscription? **No. The standard 14-day free trial does not automatically convert to a paid subscription, and you will not be charged when it ends.** No credit card is required, and there is no subscription to cancel. To continue using paid features, choose a plan under **Account → Billing → Upgrade** and complete checkout yourself. If you do not subscribe, the feedback widget pauses when the trial expires. **Exception: if you accepted the optional 14-day trial extension by adding a payment card and completing subscription checkout, billing starts automatically when that extension ends unless you cancel beforehand.** You can manage or cancel that subscription under **Account → Billing**. ## Next Steps - [View available plans](https://www.simplecommenter.com/pricing) - [Manage team members](https://www.simplecommenter.com/docs/dashboard/team) - [Configure your profile](https://www.simplecommenter.com/docs/dashboard/profile) --- # Branding & White-label Make Simple Commenter look like your own product. White-label branding applies your logo and brand name to the feedback widget, client invite emails, and the client login and portal pages, and can serve them from your own domain. Find it under **Account > Branding**. White-label branding and custom domains are available on the **Business**, **Unlimited**, and **Enterprise** plans. Only workspace admins can manage branding. ## Logo & Brand - **Logo**: the logo shown on the widget, client emails, and client login pages. - **Brand name**: the name used in place of "Simple Commenter" across client-facing surfaces. - **Hide Simple Commenter branding**: remove "Powered by Simple Commenter" from client-facing pages. ## Custom Domain Serve the branded client experience (login and portal) from a subdomain you own, for example feedback.youragency.com. 1. Enter the domain you want to use. 2. Simple Commenter shows the DNS record to add at your registrar. 3. Add the record, then click verify. Status moves from **Pending** to **Verified** once DNS propagates. DNS changes can take some time to propagate. If verification fails, double check the host and value against what the dashboard shows, then try again. ## Email Sender Domain Send client emails from your own domain instead of the default Simple Commenter sender. Configure: | Field | Purpose | | --- | --- | | Sender domain | The domain emails are sent from (requires DNS verification). | | From email | The address clients see in the From line. | | From name | The display name on outgoing emails. | | Reply-to | Where client replies are routed. | Until a sender domain is verified, emails continue to send from the default Simple Commenter address so nothing breaks while you set it up. ## What Clients See With branding configured, invited clients get a fully branded experience: - The **feedback widget** shows your logo and brand name. - **Invite and notification emails** come from your brand (and your sender domain, if set). - The **client login and portal** pages, served on your custom domain, carry your logo. See [Clients](https://www.simplecommenter.com/docs/dashboard/clients) for how to invite and manage clients. ## Next Steps - [Invite and manage clients](https://www.simplecommenter.com/docs/dashboard/clients) - [Control who can access the widget](https://www.simplecommenter.com/docs/dashboard/access) - [Configure notifications](https://www.simplecommenter.com/docs/dashboard/notifications) --- # Clients Manage external clients who can access and leave feedback on your project. View pending requests, approve new clients, and remove access when needed. ## Client List The clients page shows two sections: ### Pending Approval Clients who have requested access (when using Request Access mode). For each pending client you can: - **Approve** - Grant access to the project - **Reject** - Deny and remove the request ### Active Clients Approved clients who can access the widget. Shows: - Client name - Email address - Approval status ## Inviting Clients To invite a new client: 1. Click **Invite Client** 2. Enter their email address 3. Optionally add their name 4. Click **Add Client** The client is immediately added with approved status. They can sign in using their email. Invited clients receive access immediately. Send them the website URL where they can start leaving feedback. ## Removing Clients To remove a client's access: 1. Find the client in the Active Clients list 2. Click the **Remove** button 3. Confirm the action Removing a client revokes their access immediately. They will no longer be able to sign in or leave comments. ## Client Access Modes How clients can access your project depends on the [Access Settings](https://www.simplecommenter.com/docs/dashboard/access): | Mode | Description | | --- | --- | | Open | Anyone can sign up and comment | | Request Access | Clients request access, you approve | | Invite Only | Only clients you invite can access | ## Saving Changes Click **Save Changes** after making modifications to apply them. ## Next Steps - [Configure access modes](https://www.simplecommenter.com/docs/dashboard/access) - [Manage team members](https://www.simplecommenter.com/docs/dashboard/team) - [View client comments](https://www.simplecommenter.com/docs/dashboard/comments) - [Create clients from your backend with the REST API](https://www.simplecommenter.com/docs/rest-api/members-and-clients), or let the [JS API](https://www.simplecommenter.com/docs/js-api) create them automatically on first login --- # Managing Comments Use the comments workspace to review feedback page by page, keep work moving with statuses, and reply from the dashboard. ## Comments Workspace The website comments view is organized around the pages on your site that already have feedback. Select a page to see its thread and work through the comments for that page. ### Comment Information Each comment can include: - **Visitor info** - Name and email when provided - **Message** - The feedback content - **Page path** - Where the feedback was submitted - **Timestamp** - When it was submitted - **Screenshot or attachments** - Supporting context from the visitor - **Browser info** - Browser and OS details when available ## Adding a Comment from the Dashboard Most feedback arrives through the widget, where someone clicks an element on your site. When you already know what needs saying, you can skip that trip. The **Add comment** button sits in the header of both the comments view and the board, and opens a form where you choose the page, write the feedback, and set priority, status, tags, tagged teammates, and attachments. Pick the page from the list of pages that already have feedback, or type any path (`/pricing`) for a page that doesn't yet. A comment added this way belongs to the page rather than to an element on it, so the widget lists it as a **page comment** instead of showing a pin. If you later want it pinned, open it in the widget on your site and choose **Pin to element**. ## Statuses Organize your workflow with statuses: | Status | Description | | --- | --- | | To Do | New feedback, not yet started | | In Progress | Actively being worked on | | Review | Ready for review or awaiting approval | | Rework | Needs changes based on feedback | | On Hold | Paused, waiting for external input | | Blocked | Cannot proceed due to a dependency or issue | | Done | Completed and resolved | | Cancelled | No longer relevant or intentionally dismissed | ### Changing Status - Open a comment in the thread for the current page - Click the status control on the comment - Choose the next status for that item ### Configuring Available Statuses You can customize which statuses are available for your project in [Status Management](https://www.simplecommenter.com/docs/dashboard/statuses): 1. Open the project you want to configure 2. Go to **Workflow** in the project settings and select the **Statuses** tab 3. Choose which statuses are enabled and which roles can use them ## Filtering and Sorting Use the comments sidebar to narrow the current page view: - **Status filters** - Focus on the work that matters right now - **Sort options** - View comments by newest, oldest, or priority - **Page list** - Jump between pages that already have feedback The dashboard starts by focusing on active work first, so open and in-review items are easier to triage. These filters only affect the dashboard. To hide comments by status on the website itself (for example, hide **Done** comments on the page), use the status filter inside the widget's comment sidebar - see [Filtering Comments on the Page](https://www.simplecommenter.com/docs/widget/basic-setup#filtering-comments-on-the-page). ## Replying to Comments Keep the discussion in one place by replying directly inside a comment thread: 1. Open the comment you want to respond to 2. Click **Reply** 3. Write your response 4. Send it to add the reply to the thread ## Priority Use the priority control on a comment to mark it as low, normal, or high priority. You can then sort the current page by priority when you need to focus on the most urgent items first. ## Screenshots and Attachments Comments can include screenshots and supporting files. Open the relevant comment to review the attached context without leaving the thread. ## Export Comments to CSV In **Comments** or **Board**, click **Export CSV** beside **Add comment**: - **All website feedback** downloads every accessible website comment across all statuses, regardless of the current filters. - **Current filters** downloads the complete matching set, including comments below the fold or beyond the visible page. On Board, this becomes available after all statuses finish loading; reload if loading failed. Both choices exclude archived comments and asset feedback. The dashboard CSV includes comment text, status, priority, tags, page, author, dates, the reply thread, and available screenshot and attachment URLs. File URLs can expire; refresh the feedback and export again to obtain current links. Workspace owners and assigned team members can export their accessible feedback; client accounts do not see this control. For exports across projects, or to include assets and archived comments, open the separate **MCP** item in the project sidebar and connect an external AI tool. Ask it to use `export_comments` with the projects and filters you need. See [MCP exports and filters](https://www.simplecommenter.com/docs/integrations/ai-agent#filters-and-complete-results). ## Deleting Comments If a comment is spam, duplicated, or no longer needed, open the comment actions menu and delete it from the thread. ## Next Steps - [Manage team access](https://www.simplecommenter.com/docs/dashboard/team) - [Configure statuses](https://www.simplecommenter.com/docs/dashboard/statuses) - [Set up integrations](https://www.simplecommenter.com/docs/integrations/slack) --- # Company login Company login lets workspace owners and staff sign in with their company's SAML identity provider. Open **Workspace settings → Company login** to configure the connection, approve staff, test login, and manage the policy. Agency offers SSO for **€150 per workspace per month**, in addition to Agency and applicable tax. It covers one identity provider and all staff; Agency already includes unlimited team members. Pro can configure and test before upgrading to Agency. Enterprise activation is arranged through sales. ## Account creation and first login The owner first creates a workspace through normal signup. Staff do not need to create a separate workspace, complete registration, or set a Simple Commenter password when their membership already exists. 1. Add the employee under **Members** or use the [member-creation API](https://www.simplecommenter.com/docs/rest-api/members-and-clients#company-login-and-api-provisioning). Use the work email their identity provider supplies and assign their role and project access. 2. Under **Company login → Approve and test**, the owner approves that member for SSO. The owner must test the connection before activating it. 3. Once SSO is active, the employee opens the workspace's company-login link or selects **Sign in with SSO** and enters the workspace code. 4. The identity provider authenticates them. On first login, we match its signed email to an approved member in the selected workspace. Subsequent logins use the linked provider identity. The person keeps their existing membership and permissions. The identity provider determines who is signing in; the app does not let someone select another staff member's identity. Having the company's email domain alone does not grant access. | Situation | What happens | | --- | --- | | Approved member who has never logged in | Can use SSO without separate signup once the connection is active. | | Existing approved member | Signs into their existing membership with its current permissions. | | Unknown or unapproved person | Access is refused; the workspace owner must add and approve them. | | Same email in several workspaces | The company-login link chooses the workspace. Accounts are not merged. | | Switching to another workspace that requires SSO | That workspace's company login is required. | | External client | Uses the existing project invitation or client login flow. | SSO does not create unknown members automatically. Automatic creation on first login and SCIM directory synchronization are not implemented. ## Onboarding 100 employees through the API Your IT team can use the existing `POST /api/external/members` endpoint in an automation. It accepts one member per request, so a script can create 100 members without someone entering them one at a time in the dashboard. Agency's SSO price remains €150 per month for that workspace. Creation and SSO approval are separate. After the automation runs, the owner refreshes **Company login** and approves members under **Approve and test**. The API does not have an SSO-approval parameter. Share the workspace's company-login link with the approved staff. See the [member API guide](https://www.simplecommenter.com/docs/rest-api/members-and-clients#company-login-and-api-provisioning) for authentication, request examples, duplicate handling, and project assignment. API provisioning lives in the developer documentation; the workspace login policy lives under **Company login**. ## Optional and required SSO Optional SSO lets approved staff use company login while other supported login methods remain available. Requiring SSO is a separate owner action after activation, a recent successful owner test, and saving recovery codes. Password, Google, and email-link login then direct staff to company login before they can access the workspace. **Current API limitation:** required SSO blocks integration tokens, including member creation, listing, assignment, and removal through the REST API. Keep SSO optional if your workflow depends on API provisioning. With required SSO, the owner can manage membership in the dashboard after signing in with SSO. The extension, MCP, and other connected apps without SSO support also become unavailable. ## Removing access and owner recovery Removing a workspace member or revoking their SSO approval prevents that member's SSO sessions from continuing to access the workspace. Disabling someone at the identity provider does not by itself immediately revoke an existing Simple Commenter session; SSO sessions last up to eight hours. For immediate removal, remove their membership or SSO approval in Simple Commenter. The owner can also revoke all SSO sessions from Company login. If the identity provider becomes unavailable, the owner can sign in with their existing owner account and use a saved one-time recovery code. Recovery makes SSO optional and revokes the workspace's SSO sessions. --- # Project Template The project template holds default configurations that are automatically applied to new projects. Save time by configuring your preferences once instead of setting them up for each project. ## How the Template Works When you create a new project: 1. The template's settings are stamped onto the new project 2. The project starts with all your configured defaults 3. You can override any setting at the project level Changing the template only affects new projects. Existing projects keep their current settings. ## What You Can Configure The template mirrors the project settings structure, so you learn it once: ### Access Set default widget access configuration: - Parameter-based activation - Authentication requirements - Client access mode (Open, Request Access, Invite Only) [Learn more about Access settings](https://www.simplecommenter.com/docs/dashboard/access) ### Workflow Set default statuses and tags for organizing comments: - Enabled statuses and role visibility - Comment tags [Learn more about Statuses](https://www.simplecommenter.com/docs/dashboard/statuses) ### Notifications Configure default email notification preferences: - New comment notifications - Reply notifications - Status change notifications [Learn more about Notifications](https://www.simplecommenter.com/docs/dashboard/notifications) ### Widget Configure how the widget looks and behaves, split into three tabs: - **Appearance** - Primary color, background colors, modal alignment ([Theme](https://www.simplecommenter.com/docs/dashboard/theme)) - **Features** - Drawing annotations, screenshots, file uploads, metadata collection, tutorial ([Functionalities](https://www.simplecommenter.com/docs/dashboard/functionalities)) - **Language** - Custom labels and translations ([Localization](https://www.simplecommenter.com/docs/dashboard/localization)) ### Integrations Configure default integrations: - Slack - Trello - Webhooks [Learn more about Integrations](https://www.simplecommenter.com/docs/integrations/slack) ### Advanced Advanced default options for new projects. ## Accessing the Project Template 1. In the workspace sidebar (outside a project), click **Project template** 2. Choose the setting section to configure 3. Save your changes The project template is only visible to workspace admins. ## Overriding Defaults To customize settings for a specific project: 1. Go to your project 2. Open the relevant settings page 3. Make your changes 4. Save Project-level settings always override defaults. ## Next Steps - [Configure access defaults](https://www.simplecommenter.com/docs/dashboard/access) - [Set up theme defaults](https://www.simplecommenter.com/docs/dashboard/theme) - [Configure integration defaults](https://www.simplecommenter.com/docs/integrations/slack) --- # Assets The **Assets** section of a project allows you to upload images and PDFs to collect feedback through visual annotations. Upload design mockups, screenshots, or documents and let your team and clients add comments directly on them. New to asset commenting? See the [Asset Commenting guide](https://www.simplecommenter.com/docs/asset-commenting) for a complete walkthrough of uploading files, sharing with clients, and collecting feedback. If you are comparing workflows, see [Creative Asset Feedback](https://www.simplecommenter.com/creative-asset-feedback), [Image Feedback](https://www.simplecommenter.com/image-feedback), and [PDF Feedback](https://www.simplecommenter.com/pdf-feedback). ## Uploading Files ### Drag and Drop Drag files directly onto the page to upload them instantly. ### Upload Button Click **Upload Files** and select images or PDFs from your computer. ### Supported Formats - **Images**: PNG, JPG, GIF, WebP, SVG - **PDFs**: Standard PDF documents ## Viewing Files ### Grid View The default view displays files as visual cards with thumbnails, file names, and metadata. ### List View Switch to list view for a table layout showing: - File type - File name - Comment count - Upload date - File size Click the view toggle in the top-right to switch between views. ## Sorting & Filtering ### Sort Options - **Last uploaded** - Most recent first - **Name (A-Z)** - Alphabetical order - **Size (largest)** - Largest files first - **Most comments** - Files with most feedback first ### Filter by Type - **All files** - Show everything - **Images** - Only image files - **PDFs** - Only PDF documents ## File Actions ### View & Annotate Click any file to open it and view/add comments directly on the image or PDF. ### Delete Files Hover over a file card and click the trash icon to delete it. You can also select multiple files in list view for bulk deletion. Deleting a file also removes all comments attached to it. This action cannot be undone. ## Storage Limits File storage limits vary by plan: | Plan | Max File Size | Total Storage | | --- | --- | --- | | Trial/Pro | 5 MB | 100 MB | | Unlimited | 25 MB | 1 GB | | Business | 25 MB | 5 GB | | Enterprise | 100 MB | 50 GB | ## Next Steps - [Manage comments](https://www.simplecommenter.com/docs/dashboard/comments) - [Configure file upload settings](https://www.simplecommenter.com/docs/dashboard/functionalities) - [Upgrade your plan](https://www.simplecommenter.com/pricing) --- # Functionalities Control which features are available in the commenting widget. Enable or disable capabilities based on your project needs. You'll find these options in your project settings under **Widget**, in the **Features** tab. ## Feature Toggles ### Drawing Annotations Allow users to draw on screenshots when leaving feedback. - **Enabled**: Users can annotate screenshots with freehand drawing - **Disabled**: Screenshot capture only, no drawing tools ### Screenshots Enable automatic screenshot capture when users leave comments. - Captures the current viewport - Includes any visible content - Useful for visual bug reports Two switches control capture, and both must be on: - **Features → Screenshots** (this page) allows or prevents screenshot capture on your website. - **Project settings → Screenshots** turns capture on or off for this project. It defaults to your account-wide setting under **Default settings → Screenshots**, and you can override it per project. The same page has the **Chrome extension auto-capture** switch and shows whether the script or the Chrome extension is connected. Screenshots are on by default and included on all current plans, including the trial. If the Screenshots page says screenshots are not available on your plan, you are on a legacy plan; upgrade from **Account → Billing**. #### How capture works, and why it can be slow The web widget renders the screenshot inside the visitor's browser at the moment the comment is submitted. Pages with large images, many fonts, or embedded videos take longer to render, so the comment can take a few seconds to go through. There are no quality, resolution, or compression settings to tune. - If speed matters more than screenshots on a project, turn capture off on the project's **Screenshots** page. - The [Chrome extension](https://www.simplecommenter.com/docs/chrome-extension) captures the screen locally, which is faster and works on pages the widget cannot render. #### Screenshots are not being captured? 1. Check both switches above are on for the project. 2. Open the project's **Screenshots** page and confirm the script or the Chrome extension shows as connected. Capture needs one of them. 3. Embedded iframes and images served from other domains without CORS headers can appear blank in the capture. This is a browser restriction, not a setting. 4. If the page still says screenshots are unavailable on your plan, see above. ### File Uploads Allow users to attach files to their comments. - Images, documents, and other files - Subject to [storage limits](https://www.simplecommenter.com/docs/dashboard/files) based on your plan ### Public Share Links Generate shareable links for comments that can be viewed without logging in. - Useful for sharing feedback with external stakeholders - Links are read-only ### Comment Title Require users to add a title to each comment. - Helps organize and categorize feedback - Makes comments easier to scan in the dashboard ### Mentions / Tagging Let people @mention team members and clients in comments and replies. - Tagged users are notified about the comment - Works alongside [Mentions](https://www.simplecommenter.com/docs/widget/mentions) in the widget - Disable it to hide the tagging UI entirely ### Metadata Collection Collect browser and device information with each comment. - Browser name and version - Operating system - Screen resolution - Page URL Metadata helps debug issues and understand context without asking users for details. ### Tutorial Show an onboarding tutorial for new users. - Explains how to use the widget - Walks through leaving feedback - Can be skipped by users ### Hidden Comments Allow comments to be hidden from the main feed. - Hidden comments are still accessible via filters - Useful for archiving resolved feedback ### Comment Mode Banner Show a banner when the widget is in comment mode. - Reminds users they're in feedback mode - Can be hidden for a cleaner experience ## Saving Changes After adjusting settings, click **Save** in the bottom bar to apply changes. Click **Discard** to revert to the last saved state. ## Next Steps - [Configure access settings](https://www.simplecommenter.com/docs/dashboard/access) - [Customize widget appearance](https://www.simplecommenter.com/docs/dashboard/theme) - [Set default functionalities for all projects](https://www.simplecommenter.com/docs/dashboard/default-settings) --- # General Settings The General Settings page lets you configure your project, control the widget status, and manage installation. ## Widget Status ### Active Toggle Control whether the commenting widget is active on your website: - **Enabled**: Widget appears on your website (based on access settings) - **Disabled**: Widget is completely hidden Disabling the widget hides it from all users but preserves your existing comments and settings. ## Feedback Round Run feedback as a time-boxed round with a clear end date. This is useful for review cycles where clients should give input by a deadline. ### End Date Pick the date the round ends. Feedback closes at the end of that day (UTC). After it closes: - **Clients can no longer leave comments** on the project - **You and your team can still comment** as usual Clear the date at any time to reopen the round. ### Warn Before the End When an end date is set, the widget can show a "feedback ending soon" message to visitors a set number of days before the deadline. Choose 1, 2, 3, 5, 7, or 14 days. ### Email Notifications Turn this on to email you and your team when the round is ending soon and again when it has ended. - **Also notify clients**: when enabled, clients on the project receive the same emails. Add clients first, or there is no one to notify. The round-end emails are separate from your regular new-comment notifications. See [Notifications](https://www.simplecommenter.com/docs/dashboard/notifications) for those. ## Project Configuration ### Project Name & Domain Update your project's name and associated domain: 1. Click **Configure** 2. Update the project name 3. Update the domain URL 4. Click **Save** The project name appears in the dashboard navigation. The domain determines where the widget script will function. Only workspace admins can change the project name or domain. Team leads see a notice in place of these controls. See [Roles & Permissions](https://www.simplecommenter.com/docs/dashboard/team#roles--permissions). ### Export Feedback (CSV) Download website feedback as a spreadsheet directly from the project: 1. Open **Comments** or **Board**. 2. Click **Export CSV** beside **Add comment**. 3. Choose **All website feedback** or **Current filters**. All website feedback includes every visible status and all matching records, including comments below the fold. Current filters exports the complete filtered set; on Board, this option becomes available after background loading finishes. Both options exclude archived comments and asset feedback. The all-feedback export is also available in **General → Export Feedback**. The file downloads immediately and includes one row per comment with: comment ID and number, status and when it last changed, priority, tags, title, text, page URL, created date, author name and email, assignee, reply count, the full reply thread, attachment count and available attachment links, whether a screenshot exists and its available URL, and the task link for connected integrations (Asana, ClickUp, Trello, and others). Team leads can export feedback from the projects they are assigned to. Screenshot and attachment URLs may expire. Refresh the project data and export again when you need current links. To include asset feedback, archived comments, or several projects, use [MCP exports](https://www.simplecommenter.com/docs/integrations/ai-agent#export-csv-from-the-dashboard). Open **MCP** directly in the project sidebar to set up the external connection. There is no PDF export of feedback yet. For a shareable summary, ask the [AI Assistant](https://www.simplecommenter.com/docs/ai-assistant) for a report and download it as PDF. ### Archive Project Archiving is the way to hide a finished project without deleting anything. Archive a project when the work is done but you want to keep the feedback: 1. Click **Archive Project** 2. Confirm in the dialog The project leaves your project list and the project switcher. Comments, settings, clients, and integrations are all kept. Archived projects live in the **Archive**. Open it from the **Archived projects** link at the bottom of your project list, or go to `/app/archive`. Each row shows the project name, domain, comment count, and the date it was archived. To bring a project back, click **Unarchive** in the Archive, or open the project's General Settings and click **Unarchive**. An archived project's settings pages stay reachable by direct link. Archiving does not switch the widget off. The widget keeps loading on your website and visitors can still leave feedback. To stop collecting feedback, turn off the **Active** toggle under Widget Status before you archive. Only workspace admins can archive or unarchive a project. Team leads do not see these controls. Archived projects are hidden from team leads and clients too. ### Delete Project Remove a project and all its data: 1. Click **Delete Project** 2. Type the project name to confirm 3. Click **Delete** Deleting a project permanently removes all comments, files, and settings. This action cannot be undone. Only workspace admins can delete a project. Team leads do not see the Delete Project button; ask a workspace admin to delete it for you. ## Installation Script ### Adding to Your Website Copy the script snippet and paste it into your website's `` section: 1. Find the script in the "Add to your website" section 2. Click **Copy** to copy to clipboard 3. Paste into your website's HTML `` tag ### Script Loading Options Choose how the widget loads: | Option | Description | | --- | --- | | Param-based | Widget loads when ?feedback=true is in the URL | | Always | Widget loads on every page | Param-based loading is useful for staging environments or internal review. ## Saving Changes After adjusting settings, click **Save** in the bottom bar to apply changes. Click **Discard** to revert to the last saved state. ## Next Steps - [Configure access settings](https://www.simplecommenter.com/docs/dashboard/access) - [Customize widget appearance](https://www.simplecommenter.com/docs/dashboard/theme) - [Set up integrations](https://www.simplecommenter.com/docs/integrations/slack) --- # Localization Translate or customize all text in the commenting widget. Support multiple languages or simply adjust the wording to match your brand voice. ## Overview The localization settings allow you to customize every piece of text displayed in the widget, organized by category: - **Comment Form** - Text for creating comments - **Replies** - Reply-related text - **Comment List** - Comment viewing interface - **Statuses** - Status labels - **Priorities** - Priority labels - **User Identity** - Name and email fields - **Authentication** - Login and registration - **Attachments** - File upload text - **Filters & Sorting** - Filter options - **Settings** - User settings - **Alerts** - Success and error messages - **Help** - Help content - **Tutorial** - Onboarding steps - **Time** - Time-ago labels ## How to Customize Text 1. In your project settings, go to **Widget** and select the **Language** tab 2. Browse categories using the tabs 3. Check the box next to any text you want to customize 4. Enter your translation or custom text 5. Click **Save** to apply changes Only checked items will override the default text. Unchecked items use the built-in defaults. ## Copy from Other Projects Speed up localization by copying translations from another project: 1. Use the **Pick translations from other domains** dropdown 2. Select **Default Localization** or another project 3. Translations are copied to the current project 4. Customize as needed and save ## Link Placeholders Some text includes links (like Terms of Service). When customizing these: 1. Keep the placeholder format: `[Terms of Service]` 2. Enter the translated link text 3. The link URL is preserved automatically ## Auto-Save Changes auto-save every 60 seconds when you have unsaved modifications. A save bar appears at the bottom when there are pending changes. ## Restore Defaults Click **Restore Default** to clear all customizations and return to the built-in text. Restoring defaults removes all your translations for this project. This cannot be undone. ## Next Steps - [Set default localization for new projects](https://www.simplecommenter.com/docs/dashboard/default-settings) - [Configure widget appearance](https://www.simplecommenter.com/docs/dashboard/theme) - [Customize widget features](https://www.simplecommenter.com/docs/dashboard/functionalities) --- # Email Notifications SimpleCommenter sends email notifications to keep all stakeholders informed about comment activity on your projects. This guide explains how the notification system works, who receives emails, and how to customize your preferences. ## How Email Notifications Work Email notifications are sent as digest summaries based on your configured frequency. Rather than sending an email for every single comment, SimpleCommenter batches notifications together to prevent inbox overload. ### Notification Types SimpleCommenter tracks several types of activity and notifies the appropriate recipients: | Type | Description | Recipients | | --- | --- | --- | | New Comment | A new comment was posted on a page | Admins, Team Members | | New Reply | Someone replied to an existing comment thread | Admins, Team Members | | Status Change | A comment was marked as 'Done' or 'Review' | Original commenter (Client) | | Reply to Your Comment | Someone replied to a comment you made | Original commenter | | Feedback Round Ending / Ended | A project's feedback round is about to close or has closed | Admins, Team; clients if enabled | Feedback round emails are configured per project on the **General** tab, not here. See [Feedback Round](https://www.simplecommenter.com/docs/dashboard/general#feedback-round) to set an end date and turn on round reminders. ## Who Receives Notifications ### Admins & Team Members Workspace admins and team members receive notifications for project activity: - **New Comments** - All new comments on domains they manage (excluding their own comments if "Notify on Own Comments" is disabled) - **New Replies** - Replies added to any comment thread - **Thread Participation** - Replies to threads where they've previously commented Admins and team members can disable notifications for specific domains while still receiving updates for others. ### Clients Clients receive a more focused set of notifications: - **Status Changes** - When their comment is marked as "Done" or "Review", letting them know their feedback was addressed - **Replies to Their Comments** - When someone replies to a comment they submitted Clients must be signed in to the widget and have opted in to email notifications to receive emails. ## Configuring Notification Settings ### Team Settings (per project) Each project has team-wide notification settings. They apply to everyone on the project, including clients. To configure: 1. Go to your **Project** in the dashboard 2. Click the **Notifications** tab 3. Configure the following options under **Team Notifications**: | Setting | Description | Default | | --- | --- | --- | | Email Notifications | Enable or disable all email notifications for this project, for everyone | Off | | Email Frequency | How often notification digests are sent | Daily | | Notify on Own Comments | Include your own comments in notification emails | Off | ### Just for You (per project) Below the team settings, the **Your Notifications** section has a single switch, **Email me about this project**. Turning it off mutes the project for you only. Team members and clients keep receiving emails as configured above. This is the setting to use when you want clients to keep getting updates but don't want the emails yourself. ### Email Frequency Options Control how often you receive notification digests: | Frequency | When Emails Are Sent | Best For | | --- | --- | --- | | Every Minute | Near real-time (for testing) | Development/testing only | | 15 Minutes | Every 15 minutes | High-priority projects | | Hourly | Once per hour | Active projects | | Daily | Once per day | Most projects (recommended) | | Weekly | Once per week | Low-activity projects | | Monthly | Once per month | Archived or maintenance projects | The "Every Minute" frequency is intended for testing purposes. For production use, we recommend "Hourly" or "Daily" to avoid email fatigue. ## Managing Your Personal Preferences ### For Admins & Team Members You can manage your notification preferences in **Account Settings**: 1. Leave the project view (click **Projects** in the sidebar) 2. Go to **Notifications** in the workspace sidebar 3. Configure your preferences: **Global Opt-Out**: Disable all email notifications across all domains. **Per-Domain Opt-Out**: Disable notifications for specific domains while continuing to receive updates for others. This is the same switch as **Email me about this project** on each project's Notifications tab, shown for all projects at once. This is useful if you: - Are only actively working on certain projects - Want to reduce email volume without missing critical updates - Have delegated certain domains to other team members ### For Clients Clients can manage their notification preferences directly in the widget: 1. Click the **Settings** icon in the widget 2. Toggle **Email Notifications** on or off Alternatively, clients can click the **Unsubscribe** link at the bottom of any notification email. ## Email Content ### What's Included in Notification Emails Each notification email includes: - **Domain Name** - Which project the activity is from - **Comment Details** - The comment text, commenter name, and timestamp - **Status Badge** - Visual indicator of comment status (Done, Review, etc.) - **Replies** - Any replies in the thread, with new replies highlighted - **Attachments** - List of attached files (if any) - **Quick Links** - Direct links to the dashboard and the live domain ### Email Preview Example Notification emails show up to 2 items per email to keep them scannable. If there are more updates, you'll see a "...and more comments not shown" message with a link to view all activity in the dashboard. ### Magic Links Notification emails include **magic links** that automatically sign you in: - **Dashboard Link** - Takes admins/team members directly to the dashboard - **Domain Link** - Takes clients directly to the live website with the widget open Magic links expire after 30 days for security. If a link has expired, you'll be prompted to sign in normally. ## Troubleshooting ### Not Receiving Emails? If you're not receiving notification emails, check the following: 1. **Notifications Enabled** - Verify email notifications are enabled for the domain (Settings > Notifications) 2. **Notifications Enabled Date** - Only comments created after notifications were enabled will trigger emails 3. **Frequency Timing** - Emails are batched based on your frequency setting; wait for the next scheduled send 4. **Spam/Junk Folder** - Check your spam folder and add `noreply@simplecommenter.com` to your contacts 5. **Personal Opt-Out** - Ensure you haven't opted out in Account Settings 6. **Domain Opt-Out** - Check if the specific domain is in your disabled notifications list 7. **Valid Email** - Ensure your account has a valid email address ### Clients Not Receiving Emails? For clients to receive emails: 1. They must be **signed in** to the widget (not anonymous) 2. They must have **opted in** to notifications when signing up 3. They must not have **unsubscribed** via the email link 4. Their email must be a **valid format** ### Too Many Emails? If you're receiving too many emails: 1. **Increase frequency** - Change from "Hourly" to "Daily" or "Weekly" 2. **Disable specific domains** - Opt out of low-priority domains in Account Settings 3. **Disable "Notify on Own Comments"** - Avoid notifications for your own activity ## Technical Details ### Email Delivery - Emails are sent via **SendGrid** - Sender address: `noreply@simplecommenter.com` - All emails are logged for troubleshooting ### When Emails Are Triggered The notification system runs on a schedule and checks: 1. Which domains have `emailNotifications: true` and `hasPendingNotification: true` 2. Whether enough time has passed since the last email (based on frequency) 3. Which comments/replies haven't been marked as `notified` yet After sending, comments are marked as notified to prevent duplicate emails. ## Next Steps - [Configure domain settings](https://www.simplecommenter.com/docs/dashboard/general) - [Set up Slack notifications](https://www.simplecommenter.com/docs/integrations/slack) for real-time team alerts - [Manage team members](https://www.simplecommenter.com/docs/dashboard/team) --- # Dashboard Overview The SimpleCommenter dashboard is your central place for managing feedback, projects, members, and project settings. ## Navigation The sidebar changes depending on where you are. ### Workspace View Outside a project, the sidebar shows workspace-level areas: - **Projects** - All your websites and domains - **Project template** - Default settings stamped onto new projects at creation (workspace admins only) - **Members** - Invite teammates and manage workspace access (workspace admins only) - **Billing** - Subscription and payment details (workspace admins only) - **Branding** - White-label and branding options (workspace admins only) - **Notifications** - Your personal notification preferences - **MCP & AI connections** - Hosted ChatGPT/Claude setup, local API tokens, and connected app access **Workspace settings** remains visible while you are inside a project, so you can reach these account controls without leaving the project first. Client accounts do not see workspace settings. ### Project View Inside a project, the sidebar shows the project's work areas: - **Comments** - Review and respond to feedback, page by page - **Preview** - Open your live website inside the dashboard to leave and review comments ([Site Preview](https://www.simplecommenter.com/docs/dashboard/preview)) - **Board** - Kanban view of comments grouped by status - **Assets** - Files and designs shared for feedback - **MCP** - A separate, direct item for external AI connections; it is not nested under project settings or integrations Workspace owners authorize external connections. Team members can find the setup page and ask the owner to connect; client accounts do not see MCP. The sidebar's **AI Assistant** button opens the built-in dashboard chat and needs no MCP token. See [MCP setup](https://www.simplecommenter.com/docs/integrations/ai-agent) or [AI Assistant](https://www.simplecommenter.com/docs/ai-assistant) for the relevant workflow. ## Projects Each project represents a website or domain where you have installed the widget. ### Creating a Project 1. Click **+ New Project** in the dashboard 2. Enter your domain 3. Copy the installation code 4. Add it to your website ### Project Settings Each project has a flat settings list in the sidebar: - **General** - Project name, domain, and the installation snippet - **Access** - Visibility, sign-in requirements, and client access - **Workflow** - Statuses and tags used to organize comments - **Notifications** - How your team is alerted to new feedback - **Widget** - Theme, functionalities, screenshots, and localization - **Clients** - External stakeholders invited to leave feedback - **Integrations** - Slack, Trello, webhooks, and other connected tools - **Developers** - JavaScript API and REST API setup - **Advanced** - Advanced project options You can have multiple projects on a single account. Each project tracks feedback for one website or domain. ### Archiving a Project Workspace admins can archive a project that is finished. The project leaves the project list but keeps its comments and settings, and you can restore it at any time from the **Archived projects** link at the bottom of the list. See [Archive Project](https://www.simplecommenter.com/docs/dashboard/general#archive-project). ## Comments Workspace The comments workspace is designed for day-to-day review work: - **Page-by-page review** - Open a page and see the feedback collected there - **Status filters** - Narrow the current view to the statuses you care about - **Sorting** - Order comments by newest, oldest, or priority - **Thread actions** - Reply, change status, update priority, or delete a comment - **Attachments** - Review screenshots and other files attached to the thread - **Export CSV** - Download all website feedback or the complete current filtered set from Comments or Board; both exclude archived and asset feedback ## Mobile Access The dashboard is responsive, which makes it practical to: - Review new feedback on the go - Reply to urgent comments - Check project settings away from your desk ## Next Steps - [Managing comments](https://www.simplecommenter.com/docs/dashboard/comments) - [Team collaboration](https://www.simplecommenter.com/docs/dashboard/team) - [Project settings](https://www.simplecommenter.com/docs/dashboard/general) --- # Site Preview Site Preview opens your live website inside the SimpleCommenter dashboard so you and your team can leave and review comments without installing anything on the site. Open a project and click **Preview** in the sidebar. ## How It Works The preview does not load your site directly. SimpleCommenter's preview servers fetch the page for you, add the commenting tools, and display the result inside the dashboard. This is why the preview can work on sites that don't have the widget installed. Because the request comes from our servers instead of your browser, a few things behave differently than a normal visit: - Pages behind a login on your website cannot be previewed - Sites on private networks (localhost, internal tools) cannot be reached - Firewalls and bot protection on your site may block the preview servers ## Requirements - The project must have the **Public Website** setting enabled in its project settings - The website must be publicly reachable over http:// or https:// ## Troubleshooting When a page fails to load, the preview shows an error card explaining what went wrong and how to fix it. The most common cases are below. ### Access Forbidden (403) The preview shows **"Access Forbidden - The website denied access to this page"** even though the site opens fine in a normal browser tab. This means your website's firewall or bot protection is blocking requests from SimpleCommenter's preview servers. The block is not caused by SimpleCommenter; the site's security layer treats the preview request as automated traffic and rejects it. Common sources of the block: - **Cloudflare** or another WAF with bot protection enabled - **Hosting firewalls** (many managed WordPress hosts block datacenter traffic by default) - **WordPress security plugins** such as Wordfence, Sucuri, or Solid Security - **IP allowlists or password protection** on staging environments **How to fix it:** every preview request includes the HTTP header `X-SimpleCommenter-Proxy: 1` so you can safely allow it through: 1. **Cloudflare**: create a WAF custom rule that skips bot protection when the request contains the header `X-SimpleCommenter-Proxy` with value `1` 2. **WordPress security plugins**: add an allowlist/bypass rule for requests with that header, or temporarily disable the firewall to confirm it is the cause 3. **Other firewalls**: ask whoever manages the site's security to allow requests carrying this header If you can't change the site's security settings, you don't need the preview: install the widget snippet (or the WordPress plugin) on the site, or use the Chrome extension. Both run directly in your browser, so the site's firewall never sees a proxy request. ### Other Common Errors | Error | What it means | What to do | | --- | --- | --- | | Website Requires Login (401) | The page is behind a login on your website | Login-protected pages can't be previewed. Use the widget or Chrome extension instead. | | Page Not Found (404) | The path doesn't exist on your website | Check the URL for typos in the preview address bar. | | Enable Public Website | The project isn't marked as a public website | Open project settings, enable Public Website, and retry. | | Secure Session Expired | Preview sessions are short-lived for security | Refresh the preview page to start a new session. | | Private Network Blocked | The URL points to localhost or an internal network | Only public websites can be previewed. Use the widget snippet for local development. | | Connection Refused / Domain Not Found | The site is down or DNS is misconfigured | Open the site directly in a new tab to check it is online. | | Iframe Embedding Blocked | The site has strict anti-framing protections | View the site directly and use the widget or Chrome extension for commenting. | Preview limitations only affect the Site Preview feature. The embedded widget and the Chrome extension work independently of the preview servers. --- # Profile Settings Update your personal information and account settings. These settings apply to your user account across all workspaces. ## Workspace settings **Workspace settings** is visible in the sidebar, including while you are inside a project. It contains members, billing, branding, notification preferences, and **MCP & AI connections**. Membership, billing, and branding controls require a workspace admin; client accounts do not see workspace settings. To connect an external AI tool or generate an API token, click the separate **MCP** item directly in the project sidebar or [open MCP settings](https://www.simplecommenter.com/app/account/ai-agent). Workspace owners authorize these connections. In MCP settings, **Connected apps** shows hosted OAuth connections and lets you review their projects, permissions, and last use, or disconnect them. **Local API tokens** creates and revokes account-wide tokens for npm and REST clients. Hosted browser setup uses sign-in and project selection; you do not need to generate a local token for it. Follow the [MCP setup guide](https://www.simplecommenter.com/docs/integrations/ai-agent) and check hosted availability before connecting. ## Personal Information ### Name Your display name shown throughout the dashboard and in comments. ### Company Your organization or company name. This is displayed in the workspace header. ## Account Settings ### Change Password Update your account password: 1. Enter your current password 2. Enter your new password 3. Confirm the new password 4. Click **Save** Password must be at least 8 characters. Use a mix of letters, numbers, and symbols for better security. ## Account Information View details about your account: - **Created** - When your account was created - **Current Plan** - Your subscription tier - **Usage** - Current usage statistics ## Next Steps - [Manage your subscription](https://www.simplecommenter.com/docs/dashboard/billing) - [Configure notification preferences](https://www.simplecommenter.com/docs/dashboard/notifications) - [Manage team members](https://www.simplecommenter.com/docs/dashboard/team) --- # Status Management Customize which statuses are available for comments and control who can use them based on their role. You'll find these options in your project settings under **Workflow**, in the **Statuses** tab. ## Available Statuses Select which statuses are available in your project: | Status | Description | | --- | --- | | To Do | New comments that need attention (required) | | In Progress | Actively being worked on | | Review | Ready for review or approval | | Rework | Needs changes based on feedback | | On Hold | Paused, waiting for external input | | Blocked | Cannot proceed due to a dependency | | Done | Completed and resolved | | Cancelled | No longer relevant | **To Do** is a required status and cannot be disabled. Every other status, including Done, can be turned off per role. ## Default Active Statuses Configure which statuses are shown by default when viewing comments. This controls the initial filter when opening the comments page. Users can always change the filter to see other statuses. **Common configurations:** - Show only **To Do** and **Review** to focus on actionable items - Show all statuses for a complete overview - Hide **Cancelled** to reduce noise ## Role-Based Permissions Control which statuses each role can set on comments: ### Workspace Admin Full access to all enabled statuses. Can change any comment to any status. ### Team Lead Configure which statuses team leads can set. Useful for limiting them to certain workflow stages. ### Client Restrict clients to a subset of statuses. Typically clients might only be able to set: - **To Do** - Report new issues - **Review** - Mark something ready for review - **Done** - Confirm a fix works Role permissions only affect what users can set. All users can still view comments in any status. ## Workflow Example A typical client feedback workflow: 1. **Client** creates comment → Status: **To Do** 2. **Team Member** starts work → Status: **In Progress** 3. **Team Member** completes work → Status: **Review** 4. **Client** confirms fix → Status: **Done** ## Saving Changes After adjusting settings, click **Save** in the bottom bar to apply changes. ## Next Steps - [Filter comments by status](https://www.simplecommenter.com/docs/dashboard/comments) - [Configure client access](https://www.simplecommenter.com/docs/dashboard/access) --- # Team Collaboration Work together with your team by inviting members into the workspace and giving the right people access to each project. ## Inviting Team Members ### How to Invite 1. Go to **Members** 2. Click **Invite Members** 3. Enter their email address 4. Select their workspace role 5. Send the invite The invitee receives an email with a link to join your workspace. Team member limits depend on your plan. See [pricing](https://www.simplecommenter.com/pricing) for details. ## Roles & Permissions The Members page currently supports these assignable workspace roles: | Role | What it covers | | --- | --- | | Workspace Admin | Full workspace access, including members, projects, billing, and settings. | | Team Lead | Can add projects and manage day-to-day feedback on the projects they are assigned to: comments, replies, statuses, tags, widget settings, and CSV export. | Team leads cannot: - Delete a project, or change its name or domain - Manage billing or the subscription - Invite or remove members - Change account-level settings These actions are reserved for workspace admins. When a team lead opens a project's General settings, the configure and delete controls are replaced by a notice pointing to a workspace admin. Workspace owners appear separately in the members list and retain full workspace access. ## Managing Members Use the **Members** page to review who is in your workspace, see how many seats are in use, and keep member access up to date as your team changes. For larger teams, your backend can [create members through the REST API](https://www.simplecommenter.com/docs/rest-api/members-and-clients). An automation can send one request per employee, so you do not need to enter everyone manually. API-created members still need the owner's approval under **Workspace settings → Company login** before using SSO. See [Company login](https://www.simplecommenter.com/docs/dashboard/company-login) for account matching, first login, and the current restriction on API access when SSO is required. ## Project-Level Access Control access at the project level from the project's [Access Settings](https://www.simplecommenter.com/docs/dashboard/access): 1. Open the project you want to manage 2. Go to **Access** 3. Use the **Team Members** section to assign or remove project access This is useful when: - Different teams manage different websites - Clients should only see their own project - Contractors need a limited project scope ## Collaboration Tips ### For Agencies - Create separate projects per client - Use project-level access to keep client work isolated - Configure notifications per project so the right team gets alerted ### For Product Teams - Use statuses to reflect your review workflow - Connect Slack or webhooks for faster follow-up - Restrict project access when outside collaborators are involved ### For Support Teams - Use priorities and statuses to triage incoming feedback - Keep replies inside comment threads so context stays together - Review project access regularly as responsibilities change ## Next Steps - [Access settings](https://www.simplecommenter.com/docs/dashboard/access) - [Configure statuses](https://www.simplecommenter.com/docs/dashboard/statuses) - [Slack integration](https://www.simplecommenter.com/docs/integrations/slack) --- # Theme Configuration Customize how the SimpleCommenter widget looks on your website. Match your brand colors and choose the layout that works best for your users. ## Where to Configure Theme Theme settings are available in two locations: ### Default Theme (Account-wide) Set default theme settings that apply to all new projects: 1. Go to **Project template** in the sidebar 2. Click **Widget** 3. Select the **Appearance** tab All new projects will inherit these defaults. Existing projects are not affected. ### Project-Specific Theme Override the default theme for individual projects: 1. Go to **Projects** in the sidebar 2. Select your project 3. Go to **Widget** in the project settings and select the **Appearance** tab Project-level settings take priority over account defaults. If a project has no custom theme configured, it automatically uses your default theme settings. ## Color Settings ### Active Color (Primary) The primary accent color used throughout the widget: - Feedback button background - Active state indicators - Submit buttons and CTAs - Comment markers on the page Click the **Active** color swatch to open the color picker. Choose any color that matches your brand. | Default | Hex Code | | --- | --- | | Yellow | #F7D070 | ### Overlay Color The highlight color used for page overlays when users are selecting elements to comment on: - Selection overlay background - Element highlight indicators Click the **Overlay** color swatch to customize this color. | Default | Hex Code | | --- | --- | | Blue | #4098D7 | Choose an overlay color that contrasts well with your website's content. Semi-transparent overlays work best. ## Widget Position Control where the widget appears on the page: | Position | Description | | --- | --- | | Bottom left | Widget appears in the lower-left corner | | Bottom center | Widget appears centered along the bottom edge | | Bottom right | Widget appears in the lower-right corner | | Side right | Widget docks vertically on the right edge | | Side left | Widget docks vertically on the left edge | Select your preferred position using the theme controls in the dashboard. ## Compact Modal Enable a smaller, less intrusive feedback widget: | Mode | Description | | --- | --- | | Standard | Full-size modal with three-button interface (disable, view, comment) | | Compact | Minimized single-button design for a cleaner look | Toggle **Compact Modal** on or off based on your preference: - **Standard mode** — Shows a three-button interface letting users toggle between disabled, view-only, and comment modes - **Compact mode** — Shows a single floating button that's less visually intrusive Compact mode works well for websites where you want feedback collection without distracting from the main content. ## Live Preview As you adjust theme settings, the **Modal Preview** section shows a real-time preview of how your widget will appear: - See your color choices applied instantly - Preview the widget position - Toggle between standard and compact modes to compare ## Saving Changes After making changes: 1. The **Save All Settings** button appears when you have unsaved changes 2. Click to save your theme configuration 3. Changes apply to the widget immediately ### Restore Defaults Click **Restore Default** to reset all theme settings to the original values: - Active color: `#F7D070` (yellow) - Overlay color: `#4098D7` (blue) - Position: Bottom right - Compact mode: Off ## Theme Properties Reference Preferred widget position. Options: `bottom-right`, `bottom-center`, `bottom-left`, `side-right`, `side-left`. Default: `bottom-right` Hex color code for the primary/active color. Default: `#F7D070` Hex color code for the selection overlay. Default: `#4098D7` Hex color code for text. Default: `#000000` Hex color code for borders. Default: `#000000` Hex color code for backgrounds. Default: `#FFFFFF` Legacy numeric alignment fallback: `0` (bottom-right), `1` (bottom-center), `2` (bottom-left), `3` (side-right), `4` (side-left). Default: `0` Enable compact modal mode. Default: `false` ## Theme Inheritance SimpleCommenter uses a cascade system for themes: ``` Project Theme → Default Theme → System Defaults ``` 1. **Project Theme** — If set, this is used 2. **Default Theme** — Falls back to your account defaults 3. **System Defaults** — Uses SimpleCommenter's built-in theme This allows you to set once and apply everywhere, while still customizing individual projects when needed. The embed script identifies which project to load. The widget's color and placement come from the saved project theme and are not overridden by script tag attributes. ## Next Steps - [Widget Customization](https://www.simplecommenter.com/docs/widget/customization) — Learn how widget appearance is managed from the dashboard - [Project Settings](https://www.simplecommenter.com/docs/dashboard/general) — Other project configuration options - [Installation Guide](https://www.simplecommenter.com/docs/installation) — Add the widget to your website --- # Dev Briefs A client writes "this looks weird on mobile". A few seconds later, under their words, a short brief appears that a developer, a Jira card, or a coding agent can act on: a one-line title, two sentences naming the element and the likely cause, an optional fix, and the facts the widget captured. The client's words are never rewritten, and clients never see the brief. Dev briefs are on by default for every project. Turn them off, or tune them, per project under **Workflow → Dev briefs**. ## What a Brief Contains | Part | Example | | --- | --- | | Title | Hero heading overflows its container at 375px | | Summary | The `.hero h1` is a fixed 48px, so on phone widths the last word wraps under the CTA button. | | Likely fix | `font-size: clamp(28px, 7vw, 48px)` on the heading, or let the container wrap. | | Facts | The element selector, viewport, browser, and page, taken from the comment itself. | | Kind | layout, copy, link, visual, behavior, or other | | Confidence | high when the captured data confirms the problem, medium when it is consistent with it, low when inferred mostly from the words | ## Where It Comes From When someone clicks an element and leaves a comment, the widget already records the element (tag, id, classes, text), how it was rendered at that moment (computed style, its box and its parent's box), the device (viewport, screen, pixel ratio, browser, OS, language), the page, and a screenshot. The brief is written from that data plus the comment text. Nothing else goes to the model. Names, emails, replies, and other comments are never sent. ## Console Errors When a visitor leaves a comment, the widget also saves the JavaScript errors that happened on that page before the click: `console.error` calls, uncaught exceptions, and unhandled promise rejections. Never `console.log` or warnings. The last 10 errors are kept, each with its message, the script it came from with line and column, and how long after page load it happened. Developers see them under **Technical info** on the dashboard card, on the board, in the widget drawer, and in the WordPress plugin inbox, as a count that opens the full list with a **Copy all** button. The brief reads the five most recent and, for a behaviour report ("the button does nothing"), names the one error most likely behind it with its file and line instead of guessing at a cause. Before anything leaves the page, query strings and hashes are stripped from script URLs and anything that looks like a key, token or email address in the message is replaced with `[redacted]`. Errors from browser extensions and from the widget itself are dropped. Like briefs, console errors are for your team only: clients never receive them anywhere, including the REST API and MCP. The Chrome extension only sees errors from the moment it loads on a page, not the ones before. Turn capture off, or keep the errors out of the brief, per project under **Workflow → Dev briefs**. When capture is off the widget installs no hooks and nothing is collected. ## When a Brief Is Skipped Not every comment is a task. Approvals ("looks good"), thanks, questions aimed at a person, and comments too unclear to turn into work get no brief and show nothing. There is no empty box: if a comment has no brief, the card looks exactly as it did before. ## Who Sees It Briefs are for the people doing the work. Workspace admins and team leads see them on the dashboard, on the board, and in the widget. Clients never see a brief anywhere, including the REST API when called with a client scope, and MCP tools. ## Reading and Editing a Brief On the dashboard, the brief sits directly under the comment text. From there you can: - **Copy** the brief, with the element facts, for a ticket or a chat message. - **Rate** it helpful or not right. Ratings feed the quality review, nothing else. - **Edit** the title, summary, or fix. Once a person edits a brief the model never overwrites it, and the label shows who edited it. - **Write again** to regenerate an unedited brief, or **Remove** it. - **Write dev brief** from the card menu for a comment that has none, for example one posted before the setting was on. In the widget, the brief is a toggle beside **Tech info**. Right after you post a comment it opens on its own and fills in as the brief is written. It adds **Highlight element**, which pulses the element the brief is talking about on the live page, and the same helpful / not right thumbs as the dashboard. If your project is connected through the WordPress plugin, or runs on Shopify, the brief knows that and points fixes at the theme, block, or plugin setting where they live rather than at raw CSS. ## Settings Under **Workflow → Dev briefs** on a project: | Setting | What it does | | --- | --- | | Write a dev brief for new comments | The master switch. On by default. | | Include a suggested fix | Adds a likely CSS or copy change. Turn off if you'd rather the brief only describe the problem. | | Use the screenshot | Sends the comment's screenshot along with the element data. Better briefs for visual issues, a little slower. | | Capture console errors | Saves the page's last 10 JavaScript errors with each new comment and shows them under Technical info. On by default, and works even when briefs are off. | | Use them in the brief | Sends those errors to the model so the brief can cite the one behind the report. Turn off to keep errors visible to developers but out of the AI input. | | Brief language | Free text. Type the language or style your team reads, for example "English", "Estonian", or "German, formal". Clients can keep writing in any language. | | Use the brief title in integrations | Once the brief is written, connected tools retitle their card with it (see below). | The same settings live under **Default settings → Workflow → Dev briefs** for what new projects start with. ## Integrations The card or message for a new comment goes out immediately, as before. A few seconds later, when the brief is ready, the integration updates what it already created: | Integration | What happens | | --- | --- | | Slack, Discord | A threaded reply with the brief under the original message. The original headline is updated to the brief title. | | Jira, Linear, GitHub, Trello, ClickUp, Asana | The card or issue is retitled and a "Dev brief" section is added to its description. | | Monday | The item is renamed and an update with the brief is posted. | | Webhooks | A second `comment` payload with `event: "brief_ready"` and a `brief` object, so your receiver can update by `commentId`. | | Email | Unchanged. The new-comment email is sent before the brief exists. | Turn off **Use the brief title in integrations** to keep the original headline and only add the brief to the description. Console errors travel with the new-comment card itself, not the brief update: Jira, Linear, GitHub, ClickUp, Trello, Asana and Monday get a short "Console errors" block (at most three entries, oldest first), Slack and Discord get one line naming the count and the latest error, the email integration gets the same lines under the comment text, and webhook payloads carry the full list under `metadata.consoleErrors`. ## API and AI Agents Comments returned by the [REST API](https://www.simplecommenter.com/docs/rest-api) carry a `brief` object once one exists: ```json { "brief": { "status": "ready", "title": "Hero heading overflows its container at 375px", "summary": "The .hero h1 is a fixed 48px, so on phone widths the last word wraps under the CTA button.", "suggestedFix": "font-size: clamp(28px, 7vw, 48px) on .hero h1", "kind": "layout", "confidence": "medium", "generatedAt": "2026-09-02T09:41:12Z" } } ``` `status` is `pending` while the brief is being written, `ready` when it exists, `paused` when the account's allowance is used up, and `skipped` or `failed` otherwise. `editedBy` and `editedAt` appear when a person changed it. The [AI Agent (MCP)](https://www.simplecommenter.com/docs/integrations/ai-agent) tools return the same object: `list_comments` includes the brief title and kind, and `get_comment` the full brief. An agent should read the brief first, since it already names the element and the likely change. The dashboard [AI Assistant](https://www.simplecommenter.com/docs/ai-assistant) also sees briefs when answering questions about your feedback. Console errors come along the same way. The REST API returns `metadata.consoleErrors` with `include=metadata_full` (and `metadata.consoleErrorCount` always), `get_comment` includes the full list, and `list_comments` items carry `consoleErrorCount` so an agent knows which comments are worth opening: ```json { "metadata": { "consoleErrors": [ { "kind": "uncaught", "message": "TypeError: Cannot read properties of undefined (reading 'variantId')", "source": "https://example.com/assets/cart.js", "line": 120, "col": 14, "at": 4213 } ] } } ``` `kind` is `console`, `uncaught` or `rejection`; `at` is milliseconds since the page started loading. ## Plans and Allowance Briefs are included on every paid plan with no limit. Trials include 20 briefs. When the 20th is written, later comments show a small paused line with an upgrade link, and one email goes out. Briefs paused during the last week of a trial are written automatically once the account is on a plan. Only briefs that are actually written count. Skipped comments cost nothing. Briefs are written by Claude and can be wrong. Treat them as a strong first read of the comment, not as a verified diagnosis, and correct them where it matters. Every brief keeps the original comment intact right above it. --- # Bubble Installation Add Simple Commenter to your Bubble.io application using the SEO/metatags settings or an HTML element. ## Method 1: SEO/Metatags Settings (Recommended) This adds the script to all pages in your app. ### 1. Open App Settings 1. Open your Bubble app editor 2. Go to **Settings** in the left sidebar 3. Click the **SEO/metatags** tab ### 2. Add the Script 1. Scroll to the **Script/meta tags in header** section 2. Paste this code: ```html ``` 3. Click outside the field to save Replace `sc_your_project_key` with your project's public key from the Simple Commenter dashboard. ## Method 2: HTML Element For more control over where the script loads: 1. Add an **HTML** element to your page 2. Paste the script code 3. Position it at the bottom of your page (it won't be visible) 4. Preview or deploy ## Method 3: Page-Level Script To add to specific pages only: 1. Open the page in the editor 2. Click on the page background 3. In the property editor, find **SEO/metatags** 4. Add the script in the header tags section ## Verifying Installation 1. Preview your app or deploy to live 2. Visit the live URL (not the editor) 3. Look for the feedback widget button 4. Check browser Developer Tools (F12) for errors ## Troubleshooting ### Widget not appearing in editor The widget won't appear in the Bubble editor. Use Preview mode or view the deployed app. ### Widget not appearing on deployed app - Check you deployed after adding the code - Verify you're viewing the correct version (development vs live) - Ensure the public key matches your dashboard settings - Clear your browser cache ### Same key for dev and live The same public key works across both your development and production environments, so you only need one script tag: ```html ``` ### Single-page app behavior Bubble apps are SPAs. The widget loads once and persists across page navigation within the app. Need help? [Contact support](https://www.simplecommenter.com/support). --- # Django Installation Add Simple Commenter to your Django application by adding the script to your base template. **Important:** The public key in your script must match a project in your [Simple Commenter dashboard](https://www.simplecommenter.com/app). If it doesn't match, the widget won't load. ## Basic Installation Add the script to your base template that other templates extend: ```html {% block title %}My Django App{% endblock %} {% block extra_head %}{% endblock %} {% block content %}{% endblock %} ``` Replace `sc_your_public_key` with your project's public key from the Simple Commenter dashboard. ## Using Django Settings Store the public key in your settings for easier management: ```python # settings.py SIMPLE_COMMENTER_KEY = "sc_your_public_key" ``` Create a context processor: ```python # myapp/context_processors.py from django.conf import settings def simple_commenter(request): return { 'simple_commenter_key': getattr(settings, 'SIMPLE_COMMENTER_KEY', '') } ``` Add to settings: ```python # settings.py TEMPLATES = [ { 'OPTIONS': { 'context_processors': [ # ... other processors 'myapp.context_processors.simple_commenter', ], }, }, ] ``` Use in template: ```html {% if simple_commenter_key %} {% endif %} ``` ## Environment-Based Configuration Use environment variables for different environments: ```python # settings.py import os SIMPLE_COMMENTER_KEY = os.environ.get('SIMPLE_COMMENTER_KEY', '') ``` ```bash # .env or environment SIMPLE_COMMENTER_KEY=sc_your_public_key ``` ## Conditional Loading Only load on certain views or conditions: ```html {% if show_feedback_widget %} {% endif %} ``` In your view: ```python # views.py def my_view(request): return render(request, 'my_template.html', { 'show_feedback_widget': True # or some condition }) ``` ## Page-Specific Widget To only add to specific pages, use template blocks: ```html {% block extra_scripts %}{% endblock %} ``` ```html {% extends "base.html" %} {% block extra_scripts %} {% endblock %} ``` ## Django REST Framework / API-Only If your Django app is API-only with a separate frontend, add the script to your frontend instead. See the [React](https://www.simplecommenter.com/docs/installation/react), [Vue](https://www.simplecommenter.com/docs/installation/vue), or [General Installation](https://www.simplecommenter.com/docs/installation) guides. ## Verifying Installation 1. Run your development server (`python manage.py runserver`) 2. Open your app in the browser 3. Look for the feedback widget button 4. Check browser console (F12) for errors 5. Verify across different pages ## Troubleshooting ### Widget not appearing - Check that your template extends the base template correctly - Verify the public key matches your dashboard settings - Inspect the page source to confirm the script tag is present - Look for JavaScript errors in browser console ### Template inheritance issues - Ensure `{% extends "base.html" %}` is at the top of child templates - Check that the script is outside any blocks that might be overridden ### Static files / Production In production: - The script is hosted externally, so Django's static files settings don't affect it - Ensure your production domain is registered in your dashboard - Consider using different domains for staging vs production ### Admin panel The widget will appear in the Django admin by default if using the same base template. To exclude: ```html {% if not request.path|slice:":7" == "/admin/" %} {% endif %} ``` Need help? [Contact support](https://www.simplecommenter.com/support). --- # Flask Installation Add Simple Commenter to your Flask application by adding the script to your Jinja templates. **Important:** The public key in your script must match a project in your [Simple Commenter dashboard](https://www.simplecommenter.com/app). If it doesn't match, the widget won't load. ## Basic Installation Add the script to your base template: ```html {% block title %}My Flask App{% endblock %} {% block content %}{% endblock %} ``` Your other templates extend this: ```html {% extends "base.html" %} {% block title %}Home{% endblock %} {% block content %}

Welcome

{% endblock %} ``` Replace `sc_your_public_key` with your project's public key from the Simple Commenter dashboard. ## Using Flask Config Store the public key in your Flask configuration: ```python # config.py or app.py class Config: SIMPLE_COMMENTER_KEY = "sc_your_public_key" ``` Make it available to templates: ```python # app.py from flask import Flask app = Flask(__name__) app.config.from_object('config.Config') @app.context_processor def inject_simple_commenter(): return dict( simple_commenter_key=app.config.get('SIMPLE_COMMENTER_KEY', '') ) ``` Use in template: ```html {% if simple_commenter_key %} {% endif %} ``` ## Environment Variables Use environment variables for different environments: ```python # app.py import os app.config['SIMPLE_COMMENTER_KEY'] = os.environ.get( 'SIMPLE_COMMENTER_KEY', '' ) ``` ```bash # .env or environment SIMPLE_COMMENTER_KEY=sc_your_public_key ``` With python-dotenv: ```python # app.py from dotenv import load_dotenv load_dotenv() app.config['SIMPLE_COMMENTER_KEY'] = os.getenv('SIMPLE_COMMENTER_KEY') ``` ## Conditional Loading Only load on certain routes: ```python # app.py @app.context_processor def inject_simple_commenter(): from flask import request # Don't show on admin routes show_widget = not request.path.startswith('/admin') return dict( show_feedback_widget=show_widget, simple_commenter_key=app.config.get('SIMPLE_COMMENTER_KEY', '') ) ``` ```html {% if show_feedback_widget and simple_commenter_key %} {% endif %} ``` ## Page-Specific Widget Use template blocks: ```html {% block extra_scripts %}{% endblock %} ``` ```html {% extends "base.html" %} {% block extra_scripts %} {% endblock %} ``` ## Flask Blueprints If using blueprints, the context processor works across all blueprints when registered on the app: ```python # app.py app = Flask(__name__) @app.context_processor def inject_simple_commenter(): return dict(simple_commenter_key='sc_your_public_key') # Register blueprints from views import main_bp app.register_blueprint(main_bp) ``` ## Verifying Installation 1. Run your development server (`flask run`) 2. Open your app in the browser 3. Look for the feedback widget button 4. Check browser console (F12) for errors 5. Navigate to different routes ## Troubleshooting ### Widget not appearing - Check that your template extends base.html correctly - Verify the public key matches your dashboard settings - View page source to confirm the script is present - Look for JavaScript errors in browser console ### Template not extending correctly - Ensure `{% extends "base.html" %}` is at the top - Check the template file is in the correct directory - Verify Flask's template folder configuration ### Blueprint-specific issues - Context processors on the app work for all blueprints - Blueprint-specific context processors only work for that blueprint - Register app-wide for consistent behavior ### Production deployment - Ensure your production domain is registered in the dashboard - The script is hosted externally, unaffected by Flask's static file handling - Works with Gunicorn, uWSGI, etc. Need help? [Contact support](https://www.simplecommenter.com/support). --- # Framer Installation Add Simple Commenter to your Framer site using the custom code settings. ## Step-by-Step Installation ### 1. Open Site Settings 1. Open your project in Framer 2. Click the gear icon or go to **Site Settings** 3. Navigate to the **General** tab ### 2. Add Custom Code 1. Scroll down to **Custom Code** 2. In the **End of `` tag** section, paste: ```html ``` 3. Click **Save** or close the settings panel Replace `sc_your_project_key` with your project's public key from the Simple Commenter dashboard. ### 3. Publish Your Site 1. Click **Publish** in the top right 2. Your changes will go live ## Using a Code Component (Alternative) You can also create a code component: 1. Click the **+** button to add a new component 2. Select **Code** component 3. Add this code: ```jsx export default function SimpleCommenter() { React.useEffect(() => { const script = document.createElement("script"); script.src = "https://simplecommenter.com/js/comments.min.js"; script.dataset.id = "sc_your_project_key"; script.defer = true; document.body.appendChild(script); return () => { document.body.removeChild(script); }; }, []); return null; } ``` 4. Add the component to your page 5. Publish The Site Settings method is recommended as it applies to all pages automatically. ## Verifying Installation 1. Publish your site 2. Visit the live site (not the editor preview) 3. Look for the feedback widget button 4. Check browser Developer Tools (F12) for errors ## Troubleshooting ### Widget not appearing in editor The widget won't appear in the Framer editor. You must view the published site. ### Widget not appearing on published site - Ensure you published after adding the code - Check the code is in the "End of body" section - Verify the public key matches your dashboard settings - Clear your browser cache ### Staging vs Production The same public key works across both staging and production sites. Need help? [Contact support](https://www.simplecommenter.com/support). --- # Ghost Installation Add Simple Commenter to your Ghost blog using the built-in Code Injection feature. ## Step-by-Step Installation ### 1. Open Code Injection 1. Go to your Ghost Admin panel 2. Click **Settings** (gear icon) in the left sidebar 3. Scroll down and click **Code injection** ### 2. Add the Script 1. In the **Site Footer** section, paste: ```html ``` 2. Click **Save** Replace `sc_your_project_key` with your project's public key from the Simple Commenter dashboard. ## Ghost(Pro) vs Self-Hosted Both Ghost(Pro) and self-hosted Ghost installations support code injection. The process is the same, and the same public key works for either. ## Theme Integration (Advanced) For more control, edit your theme directly: 1. Download your theme from **Settings > Design > Change theme > Advanced** 2. Edit `default.hbs` 3. Add the script before `` 4. Zip and re-upload the theme ```handlebars {{! In default.hbs, before }} ``` Theme changes are overwritten when you update your theme. Code Injection is usually preferred. ## Page-Specific Installation To add the widget only to specific posts or pages, use the Code Injection field on individual posts: 1. Open the post/page in the editor 2. Click the gear icon for **Post settings** 3. Scroll to **Code injection** 4. Add the script in the **Post footer** section 5. Update the post ## Verifying Installation 1. Save your code injection 2. Visit your live blog (not the admin panel) 3. Look for the feedback widget button 4. Navigate to different posts to verify it appears ## Troubleshooting ### Widget not appearing - Ensure you're viewing the public site, not the admin panel - Check the code is in Site Footer, not Site Header - Verify the public key matches your dashboard settings - Clear any caching (Ghost, CDN, browser) ### Widget conflicts with Ghost comments Simple Commenter works alongside Ghost's native commenting system. They serve different purposes - Ghost comments are for blog discussions, while Simple Commenter is for general feedback. ### Members-only content The widget works on members-only posts. It loads after the content is accessible to the logged-in member. Need help? [Contact support](https://www.simplecommenter.com/support). --- # Google Tag Manager Installation Add Simple Commenter to your website using Google Tag Manager (GTM). This method uses the **data attribute** loading mode since GTM can modify query parameters in script URLs. GTM sometimes strips or modifies URL query parameters. Using the `data-id` data attribute ensures your public key is always passed correctly, even though GTM may strip query parameters. ## Prerequisites - A Google Tag Manager account - GTM container installed on your website - Your Simple Commenter project public key from the [dashboard](https://www.simplecommenter.com/app) ## Step-by-Step Installation ### 1. Open Google Tag Manager Go to [tagmanager.google.com](https://tagmanager.google.com) and select your container. ### 2. Create a New Tag 1. Click **Tags** in the left sidebar 2. Click **New** to create a new tag 3. Name it "Simple Commenter Widget" ### 3. Configure the Tag 1. Click **Tag Configuration** 2. Select **Custom HTML** 3. Paste this code: ```html ``` Replace `sc_your_project_key` with your project's public key from the Simple Commenter dashboard. ### 4. Set the Trigger 1. Click **Triggering** 2. Select **All Pages** (or choose specific pages) 3. Click **Save** ### 5. Publish 1. Click **Submit** in the top right 2. Add a version name (e.g., "Added Simple Commenter") 3. Click **Publish** ## Alternative: Function Call Method If the script still doesn't load, use the function call method which dynamically injects the script: ```html ``` ## Verifying Installation 1. Use GTM's **Preview** mode to test before publishing 2. Open your website and check for the feedback widget 3. Open Developer Tools (F12) and verify the script loaded in the Network tab 4. Check the Console for any errors ## Troubleshooting ### Widget not appearing - Ensure the GTM container is properly installed on your site - Check that the tag is firing (use GTM Preview mode) - Make sure the public key in your tag matches your project in the dashboard - Try the function call method above ### Tag fires but widget doesn't load - Check for Content Security Policy errors in the browser console - Ensure no other scripts are conflicting - Try triggering on `DOM Ready` instead of `All Pages` ### Multiple widgets appearing - Check you don't have the script added both via GTM and directly in your HTML - Ensure the tag only fires once per page ## Advanced: Conditional Loading Load the widget only on specific pages using GTM triggers: **Example: Only on blog pages** 1. Create a new trigger 2. Set type to **Page View** 3. Add condition: `Page Path` contains `/blog/` 4. Use this trigger for your Simple Commenter tag Need help? [Contact support](https://www.simplecommenter.com/support). --- # Kajabi Installation Add Simple Commenter to your Kajabi site using the Site Tracking Code feature. ## Step-by-Step Installation ### 1. Open Site Settings 1. Log in to your Kajabi admin 2. Go to **Settings** in the main menu 3. Click **Site Details** ### 2. Add the Script 1. Scroll down to **Tracking Code** 2. In the **Footer Tracking Code** field, paste: ```html ``` 3. Click **Save** Replace `sc_your_project_key` with your project's public key from the Simple Commenter dashboard. ## Page-Specific Installation To add to specific pages only: ### Landing Pages 1. Edit your landing page 2. Click **Settings** (gear icon) 3. Go to **Tracking** 4. Add the script in the footer tracking field 5. Save ### Product Pages For course or product pages, use the site-wide tracking code. The widget will appear on all accessible pages. ## Verifying Installation 1. Save your settings 2. Visit your live Kajabi site 3. Look for the feedback widget button 4. Test on different pages (home, products, checkout) ## Troubleshooting ### Widget not appearing - Ensure you saved the tracking code settings - Check you're viewing the live site, not the admin - Verify the public key matches your dashboard settings - Clear your browser cache ### Widget on checkout pages The widget will appear on Kajabi checkout pages by default. If you want to exclude them, contact support for custom configuration options. ### Members-only areas The widget works in members-only areas like course content. It loads after the user accesses the protected content. ### Multiple sites If you have multiple Kajabi sites, each needs its own Simple Commenter project with its own public key. Need help? [Contact support](https://www.simplecommenter.com/support). --- # Lovable Installation Add Simple Commenter to your Lovable application. Lovable generates React-based applications, so you can use AI prompts to add the integration. Replace `sc_your_project_key` in the snippets below with your project's public key from the [Simple Commenter dashboard](https://www.simplecommenter.com/app). ## Using AI Prompts The easiest way to add Simple Commenter to your Lovable project is to ask the AI: ### Simple Prompt ``` Add the Simple Commenter feedback widget to my app. Add this script tag to the index.html before the closing body tag: ``` Replace `sc_your_project_key` with your project's public key from the Simple Commenter dashboard. ### Alternative Prompt (React Component) ``` Add a Simple Commenter feedback widget to my app. Create a component that loads this script: const script = document.createElement("script"); script.src = "https://simplecommenter.com/js/comments.min.js"; script.dataset.id = "sc_your_project_key"; script.defer = true; document.body.appendChild(script); Add the component to the root App.tsx file. ``` ## Manual Installation If you prefer to edit the code directly: ### Method 1: index.html 1. Open your Lovable project 2. Find `index.html` in the file explorer 3. Add this before ``: ```html ``` ### Method 2: React Component Create a new component: ```tsx // src/components/SimpleCommenter.tsx import { useEffect } from "react"; export default function SimpleCommenter() { useEffect(() => { if (document.querySelector("script[data-simple-commenter]")) return; const script = document.createElement("script"); script.src = "https://simplecommenter.com/js/comments.min.js"; script.dataset.id = "sc_your_project_key"; script.dataset.simpleCommenter = "true"; script.defer = true; document.body.appendChild(script); return () => { const el = document.querySelector("script[data-simple-commenter]"); if (el) document.body.removeChild(el); }; }, []); return null; } ``` Add to your App.tsx: ```tsx // src/App.tsx import SimpleCommenter from "./components/SimpleCommenter"; function App() { return ( <> {/* Your app content */} ); } ``` ## Finding Your Public Key Your project's public key (format `sc_...`) is shown in your Simple Commenter dashboard. The same key works for both your preview URL (`project-name.lovable.app`) and any custom domain you configure. ## Verifying Installation 1. Preview your Lovable project 2. Look for the feedback widget button (usually bottom-right) 3. Click to open and submit a test comment 4. Check your Simple Commenter dashboard for the comment ## Troubleshooting ### Widget not appearing in preview - Lovable's preview might have restrictions - Try deploying to see the widget - Check browser console for errors ### Widget loads but comments don't show - Double-check the public key in your script matches the one in your dashboard - The same public key works across preview and production, so you don't need separate projects ### AI not understanding the request Try being more specific: ``` Edit the index.html file. Add this exact script tag on line X before the closing tag: [paste script] ``` ### Changes not persisting - Make sure changes are saved/committed - Lovable auto-saves but may need explicit confirmation - Check the file hasn't been overwritten by other AI changes Need help? [Contact support](https://www.simplecommenter.com/support). --- # Next.js Installation Add Simple Commenter to your Next.js application using the built-in Script component. This guide covers both the App Router and Pages Router. **Important:** The public key in your script must match a project in your [Simple Commenter dashboard](https://www.simplecommenter.com/app). If it doesn't match, the widget won't load. ## App Router (Next.js 13+) Add the Script component to your root layout: ```jsx // app/layout.jsx import Script from "next/script"; export default function RootLayout({ children }) { return ( {children} ``` ## Where to Add the Script Place the script in one of these locations: - **Before ``** (recommended) — The script loads after your page content - **In the ``** — Use the `defer` attribute to prevent blocking ```html My Website ``` ## Loading Modes Simple Commenter supports different script loading modes. You can switch between them in your dashboard if one doesn't work for your setup. ### Query Parameter (Default) The simplest method — your public key is passed as a URL parameter: ```html ``` **Best for:** Most websites, static HTML, general use. ### Data Attribute Your public key is passed as a data attribute on the script tag: ```html ``` **Best for:** Google Tag Manager, WordPress, tag managers that modify URLs. Use this method with [Google Tag Manager](https://www.simplecommenter.com/docs/installation/google-tag-manager) — GTM can strip query parameters from script URLs. ### Function Call Dynamically creates and injects the script: ```html ``` **Best for:** Platforms with strict script restrictions, SPAs that need dynamic loading. ### Next.js Script Component For Next.js projects using the built-in Script component: ```jsx import Script from "next/script"; ``` | Attribute | Description | | --- | --- | | data-id | Your project's public key | The embed script identifies the project. Theme settings such as color and widget placement are loaded from your saved dashboard theme and are not overridden by script tag attributes. See [Widget Configuration](https://www.simplecommenter.com/docs/widget/configuration) for all options. Building a SaaS where users are already logged in? The [JS API](https://www.simplecommenter.com/docs/js-api) logs them into the widget automatically and lets your code decide who sees feedback, no Simple Commenter login involved. --- ## Platform Guides Find step-by-step instructions for your platform: ### No-Code Platforms ### Code / Frameworks ### Special Cases --- ## Verifying Installation After adding the script: 1. Open your website in a browser 2. Look for the feedback button in the position configured in your project's Theme settings 3. Open Developer Tools (F12) and check for errors in the Console 4. Submit a test comment and verify it appears in your dashboard **Widget not loading?** Make sure the public key in your script matches your project in the dashboard. ## Troubleshooting ### Widget not appearing - Make sure the public key in your script matches your project in the dashboard - Check that the script isn't blocked by ad blockers - Look for JavaScript errors in the browser console - Try a different [loading mode](https://www.simplecommenter.com/docs/installation#loading-modes) ### Widget loads but submissions fail - Check the Network tab for failed API requests - Ensure your project is active in the dashboard - Verify you haven't exceeded your plan's comment limits ### Script blocked by CSP If your site uses Content Security Policy, add these to your policy: ``` script-src: https://simplecommenter.com connect-src: https://simplecommenter.com ``` Need help? [Contact support](https://www.simplecommenter.com/support). --- # PHP Installation Add Simple Commenter to any PHP website by including the script in your templates. **Important:** The public key in your script must match a project in your [Simple Commenter dashboard](https://www.simplecommenter.com/app). If it doesn't match, the widget won't load. ## Basic Installation Add the script before the closing `` tag: ```php My PHP Site ``` Replace `sc_your_project_key` with your project's public key from the Simple Commenter dashboard. ## Using a Config File Store configuration separately: ```php ``` ## Environment-Based Configuration Use environment variables: ```php load(); $simpleCommenterKey = $_ENV['SIMPLE_COMMENTER_KEY'] ?? ''; ``` ## Include Pattern Create a reusable include file: ```php ``` Include in your pages: ```php ``` ## Conditional Loading Only show on certain pages: ```php ``` ## Laravel For Laravel applications, add to your blade layout: ```php @yield('title') @yield('content') ``` ```php // config/services.php return [ 'simple_commenter' => [ 'key' => env('SIMPLE_COMMENTER_KEY'), ], ]; ``` ## Symfony For Symfony applications, add to your twig base template: ```twig {# templates/base.html.twig #} {% block title %}{% endblock %} {% block body %}{% endblock %} ``` ## Verifying Installation 1. Access your PHP site in a browser 2. Look for the feedback widget button 3. Check browser Developer Tools (F12) for errors 4. View page source to confirm script is present ## Troubleshooting ### Widget not appearing - Verify the script is in the HTML output (view page source) - Check the public key matches your dashboard settings exactly - Look for PHP errors that might prevent output - Check browser console for JavaScript errors ### Output buffering issues If using output buffering, ensure the script is included before `ob_end_flush()`: ```php # Podia Installation Add Simple Commenter to your Podia site using the Third-party Code feature. ## Step-by-Step Installation ### 1. Open Site Settings 1. Log in to your Podia dashboard 2. Click **Settings** in the left sidebar 3. Select **Third-party code** ### 2. Add the Script 1. In the **Footer code** section, paste: ```html ``` 2. Click **Save changes** Replace `sc_your_project_key` with your project's public key from the Simple Commenter dashboard. ## Verifying Installation 1. Save your third-party code settings 2. Visit your live Podia site 3. Look for the feedback widget button 4. Test on different pages (home, products, checkout) ## Where the Widget Appears The widget will appear on: - Your storefront/home page - Product sales pages - Course content pages (for members) - Community pages (if enabled) - Digital download pages ## Troubleshooting ### Widget not appearing - Ensure you saved the settings - Check you're viewing the live site - Verify the public key matches your dashboard settings exactly - Try clearing your browser cache ### Widget on checkout pages The widget appears on checkout pages by default. This can be useful for capturing feedback during the purchase process. ### Members-only content The widget works on members-only content like course pages. It loads after the user logs in and accesses the content. ### Different behavior on sales pages vs content Both public sales pages and member content pages will show the widget, using the same public key regardless of which page type you're viewing. Need help? [Contact support](https://www.simplecommenter.com/support). --- # React Installation Add Simple Commenter to your React application. This guide covers Create React App, Vite, and custom React setups. **Important:** The public key in your script must match a project in your [Simple Commenter dashboard](https://www.simplecommenter.com/app). If it doesn't match, the widget won't load. ## Method 1: index.html (Simplest) Add the script to your HTML file. This works for any React setup. ### Create React App Edit `public/index.html`: ```html My App
``` ### Vite Edit `index.html` in your project root: ```html My App
``` Replace `sc_your_project_key` with your project's public key from the Simple Commenter dashboard. ## Method 2: React Component Create a component that loads the script dynamically. Useful for conditional loading. ```jsx // src/components/SimpleCommenter.jsx import { useEffect } from "react"; export default function SimpleCommenter() { useEffect(() => { // Check if script already exists if (document.querySelector("script[data-id]")) return; const script = document.createElement("script"); script.src = "https://simplecommenter.com/js/comments.min.js"; script.dataset.id = "sc_your_project_key"; script.defer = true; document.body.appendChild(script); return () => { // Cleanup on unmount (optional) const existingScript = document.querySelector("script[data-id]"); if (existingScript) { document.body.removeChild(existingScript); } }; }, []); return null; } ``` Then add it to your app: ```jsx // src/App.jsx import SimpleCommenter from "./components/SimpleCommenter"; function App() { return ( <> {/* Your app content */} ); } ``` ## Method 3: Custom Hook For more flexibility: ```jsx // src/hooks/useSimpleCommenter.js import { useEffect } from "react"; export function useSimpleCommenter(publicKey) { useEffect(() => { if (!publicKey) return; if (document.querySelector("script[data-simple-commenter]")) return; const script = document.createElement("script"); script.src = "https://simplecommenter.com/js/comments.min.js"; script.dataset.id = publicKey; script.dataset.simpleCommenter = "true"; script.defer = true; document.body.appendChild(script); return () => { const el = document.querySelector("script[data-simple-commenter]"); if (el) document.body.removeChild(el); }; }, [publicKey]); } ``` Usage: ```jsx // src/App.jsx import { useSimpleCommenter } from "./hooks/useSimpleCommenter"; function App() { useSimpleCommenter("sc_your_project_key"); return
Your app
; } ``` ## Environment Variables Use environment variables for the public key: ```jsx // .env REACT_APP_SC_KEY = sc_your_project_key; // CRA VITE_SC_KEY = sc_your_project_key; // Vite ``` ```jsx // In your component const publicKey = process.env.REACT_APP_SC_KEY; // CRA const publicKey = import.meta.env.VITE_SC_KEY; // Vite ``` ## Conditional Loading Only load on certain routes: ```jsx import { useLocation } from "react-router-dom"; import { useEffect } from "react"; function App() { const location = useLocation(); useEffect(() => { // Only load on specific paths const enabledPaths = ["/", "/about", "/contact"]; if (!enabledPaths.includes(location.pathname)) return; // Load script... }, [location]); } ``` ## Verifying Installation 1. Run your development server (`npm start` or `npm run dev`) 2. Open your app in the browser 3. Look for the feedback widget button 4. Check browser console (F12) for errors ## Troubleshooting ### Widget not appearing - Check the public key matches your dashboard settings - Verify the script isn't being blocked by browser extensions - Look for JavaScript errors in the console - Ensure the script is actually in the DOM (inspect Elements) ### Widget appears multiple times - The component is mounting multiple times - Add a check for existing script before creating a new one - Use the cleanup function in useEffect ### Hot reload issues During development with hot reload, the widget may need a full page refresh to appear correctly after code changes. ### React Router / Client-side routing The widget persists across route changes. It loads once and stays active throughout the session. Need help? [Contact support](https://www.simplecommenter.com/support). --- # Shopify Installation Add Simple Commenter through the Shopify app and enable its app embed in your theme. Shopify manages the installation for you. ## Step-by-Step Installation ### 1. Install and open the app 1. Install **Simple Commenter** from the Shopify App Store and approve the installation in Shopify. 2. In your Shopify admin, open **Apps > Simple Commenter**. 3. Sign in to your Simple Commenter account, or create an account from the app. 4. Choose the project for this store, or create one using the store details shown in the app. ### 2. Choose who can leave feedback The setup wizard lets you choose **Only with the link** or **Everyone who visits**. Use **Only with the link** for a review round with your team or clients. You can change this later under **Access**. ### 3. Enable the app embed 1. In the app's **App embed** setup step, click **Open theme editor**. This opens the app embed controls for your current theme. 2. In **App embeds**, switch on **Simple Commenter**. 3. Click **Save** in the theme editor. 4. Return to the Simple Commenter app. You can also open **Online Store > Themes > Customize > App embeds** from Shopify admin. The connected project is selected automatically; leave the optional project key override empty unless you intend to use another project. ### 4. Check your storefront 1. Click **Open review link** in the Simple Commenter app. 2. Look for the feedback button on your storefront. 3. Leave a test comment, then return to **Feedback** in Shopify admin to see it. 4. On the setup screen, click **Check connection** to refresh the widget activity status, then continue through the remaining steps. A widget activity badge records activity from the connected project. Opening the storefront and leaving a comment confirms that the widget works on the theme you are reviewing. ## Changing themes App embeds are configured per theme. After changing or publishing a theme, open that theme's **App embeds**, enable **Simple Commenter**, and click **Save**. Open your review link again to check the feedback button. ## Troubleshooting ### Simple Commenter is missing from App embeds Confirm that the app is installed in this store, then reopen **Apps > Simple Commenter** and use **Open theme editor** in setup. ### The feedback button is not appearing - Confirm that your store is connected to a project in the app. - Check that the embed is enabled and saved on the theme you are viewing. - If visibility is set to **Only with the link**, use **Open review link** from the app. - If you require sign-in, use an account with access to the connected project. - If the storefront is password protected, enter the storefront password before checking the widget. ### The app reports activity, but the button is missing Activity may come from an earlier visit or a different theme. Recheck the current theme's embed setting, save it, and open your review link again. ### Checkout pages The app embed runs on your online store's theme pages. It does not add a feedback widget to Shopify checkout or thank-you pages. ## Turn off the widget Open the theme editor's **App embeds**, switch off **Simple Commenter**, and click **Save**. You can uninstall the app through Shopify's app settings when you no longer need it. Need help? [Contact support](https://www.simplecommenter.com/support). --- # Squarespace Installation Add Simple Commenter to your Squarespace site using the Code Injection feature. Code Injection is available on Squarespace Business and Commerce plans. ## Step-by-Step Installation ### 1. Open Code Injection 1. Go to your Squarespace Dashboard 2. Click **Settings** in the left menu 3. Click **Advanced** 4. Select **Code Injection** ### 2. Add the Script 1. In the **Footer** field, paste: ```html ``` 2. Click **Save** Replace `sc_your_project_key` with your project's public key from the Simple Commenter dashboard. ## Adding to Specific Pages Squarespace allows page-level code injection: 1. Open the page you want to modify 2. Click the gear icon for **Page Settings** 3. Click **Advanced** 4. Add the script in the **Page Header Code Injection** field 5. Save For footer placement on specific pages, you may need to use a Code Block instead. ## Using a Code Block (Alternative) For more control over placement: 1. Edit your page 2. Add a **Code Block** at the bottom 3. Paste the script 4. Uncheck "Display Source" if visible 5. Save ## Verifying Installation 1. Save your changes 2. View your live site (not the editor) 3. Look for the feedback widget button 4. Check browser Developer Tools (F12) for errors ## Troubleshooting ### Widget not appearing - Verify Code Injection is available on your plan (Business or higher) - Ensure you saved the changes - Clear your browser cache - Check you're viewing the live site, not editor preview ### Code Injection not available - Upgrade to a Business or Commerce plan - Personal plans don't have Code Injection ### Widget conflicts with Squarespace elements - Try adding the script to the Header instead of Footer - Check for other scripts that might conflict - Ensure no duplicate widgets are installed ### Member-only pages The widget works on member-protected pages. It will load after the user accesses the protected content. Need help? [Contact support](https://www.simplecommenter.com/support). --- # Vue / Nuxt Installation Add Simple Commenter to your Vue.js or Nuxt application. **Important:** The public key in your script must match a project in your [Simple Commenter dashboard](https://www.simplecommenter.com/app). If it doesn't match, the widget won't load. ## Vue 3 ### Method 1: index.html The simplest approach - add to your HTML file: ```html My Vue App
``` ### Method 2: App.vue Load dynamically using the Composition API: ```vue ``` Replace `sc_your_project_key` with your project's public key from the Simple Commenter dashboard. ### Method 3: Composable Create a reusable composable: ```javascript // composables/useSimpleCommenter.js import { onMounted, onUnmounted } from "vue"; export function useSimpleCommenter(publicKey) { onMounted(() => { if (!publicKey) return; if (document.querySelector("script[data-simple-commenter]")) return; const script = document.createElement("script"); script.src = "https://simplecommenter.com/js/comments.min.js"; script.dataset.id = publicKey; script.dataset.simpleCommenter = "true"; script.defer = true; document.body.appendChild(script); }); onUnmounted(() => { const script = document.querySelector("script[data-simple-commenter]"); if (script) script.remove(); }); } ``` Usage: ```vue ``` ## Vue 2 ### Options API ```vue ``` --- ## Nuxt 3 ### Method 1: nuxt.config.ts (Recommended) ```typescript // nuxt.config.ts export default defineNuxtConfig({ app: { head: { script: [ { src: "https://simplecommenter.com/js/comments.min.js?id=sc_your_project_key", defer: true, }, ], }, }, }); ``` ### Method 2: useHead Composable ```vue ``` ### Method 3: Plugin Create a Nuxt plugin: ```typescript // plugins/simple-commenter.client.ts export default defineNuxtPlugin(() => { if (document.querySelector("script[data-simple-commenter]")) return; const script = document.createElement("script"); script.src = "https://simplecommenter.com/js/comments.min.js"; script.dataset.id = "sc_your_project_key"; script.dataset.simpleCommenter = "true"; script.defer = true; document.body.appendChild(script); }); ``` The `.client.ts` suffix ensures the plugin only runs on the client side. ## Nuxt 2 Add to `nuxt.config.js`: ```javascript // nuxt.config.js export default { head: { script: [ { src: "https://simplecommenter.com/js/comments.min.js?id=sc_your_project_key", defer: true, body: true, }, ], }, }; ``` ## Environment Variables ### Vue (Vite) ```bash # .env VITE_SC_KEY=sc_your_project_key ``` ```javascript script.dataset.id = import.meta.env.VITE_SC_KEY; ``` ### Nuxt ```bash # .env NUXT_PUBLIC_SC_KEY=sc_your_project_key ``` ```typescript // nuxt.config.ts export default defineNuxtConfig({ runtimeConfig: { public: { scKey: process.env.NUXT_PUBLIC_SC_KEY, }, }, }); ``` ## Verifying Installation 1. Run your development server 2. Open your app in the browser 3. Look for the feedback widget button 4. Navigate between routes to verify persistence 5. Check browser console for errors ## Troubleshooting ### Widget not appearing - Verify the public key matches your dashboard settings - Check browser console for errors - Ensure the script is loading (Network tab in DevTools) - For Nuxt SSR, ensure the script runs client-side ### SSR considerations The widget is client-side only. In Nuxt: - Use `.client.ts` suffix for plugins - Use `` wrapper if needed - The script naturally only runs in the browser ### Vue Router / Nuxt routing The widget persists across route changes. It loads once and stays active throughout the session. Need help? [Contact support](https://www.simplecommenter.com/support). --- # Webflow Installation Add Simple Commenter to your Webflow site using the Custom Code feature in Project Settings. ## Step-by-Step Installation ### 1. Open Project Settings 1. Open your project in the Webflow Designer 2. Click the **W** menu in the top left 3. Select **Project Settings** ### 2. Add Custom Code 1. Click the **Custom Code** tab 2. In the **Footer Code** section, paste: ```html ``` 3. Click **Save Changes** Replace `sc_your_project_key` with your project's public key from the Simple Commenter dashboard. ### 3. Publish Your Site 1. Click **Publish** in the top right 2. Select your staging and/or production domains 3. Click **Publish to Selected Domains** ## Adding to Specific Pages Webflow allows page-level custom code: 1. Open the page in the Designer 2. Click the gear icon for **Page Settings** 3. Scroll to **Custom Code** 4. Add the script in the **Before `` tag** section 5. Publish This method lets you have the widget only on certain pages. ## Using an Embed Element (Alternative) You can also use a custom code embed: 1. Add an **Embed** element to your page 2. Paste the script code 3. Position it at the bottom of your page 4. Publish The Project Settings method is recommended as it applies to all pages automatically. ## Verifying Installation 1. Publish your site 2. Visit the live site (not the Designer preview) 3. Look for the feedback widget button 4. Check browser console (F12) for errors ## Troubleshooting ### Widget not appearing in Designer The widget won't appear in the Webflow Designer. You must view the published site. ### Widget not appearing on published site - Ensure you clicked **Publish** after adding the code - Check you're viewing the correct published domain - Verify the code is in the Footer section, not Header - Clear your browser cache ### Different behavior on staging vs production - Check that both domains have the same custom code - The same public key works across staging and production ### Webflow membership pages The widget works on membership-protected pages. Logged-in users will see the widget after accessing the protected content. Need help? [Contact support](https://www.simplecommenter.com/support). --- # Wix Installation Add Simple Commenter to your Wix website using the Custom Code feature. Custom code injection requires a **Wix Premium plan** (any paid plan). ## Step-by-Step Installation ### 1. Open Site Settings 1. Go to your Wix Dashboard 2. Click **Settings** in the left menu 3. Select **Custom Code** (under Advanced) ### 2. Add the Script 1. Click **+ Add Custom Code** 2. Paste this code: ```html ``` 3. Configure the settings: - **Name**: Simple Commenter - **Add Code to Pages**: All pages (or choose specific pages) - **Place Code in**: Body - end 4. Click **Apply** Replace `sc_your_project_key` with your project's public key from the Simple Commenter dashboard. ## Adding to Specific Pages Only 1. When adding custom code, select **Choose specific pages** 2. Select the pages where you want the widget 3. Click **Apply** ## Using Wix Velo (Advanced) If you're using Wix Velo (formerly Corvid): ```javascript // In your page code or masterPage.js $w.onReady(function () { const script = document.createElement("script"); script.src = "https://simplecommenter.com/js/comments.min.js"; script.dataset.id = "sc_your_project_key"; script.defer = true; document.body.appendChild(script); }); ``` ## Verifying Installation 1. Publish your site 2. Open your live site (not the editor preview) 3. Look for the feedback button 4. Check browser Developer Tools (F12) for errors ## Troubleshooting ### Widget not appearing - Ensure you've published your site after adding the code - Check that you're viewing the live site, not the editor - Verify your Wix plan includes custom code - Clear your browser cache ### Custom Code option not available - Upgrade to any Wix Premium plan - The free plan doesn't support custom code injection ### Widget appears in editor but not live site - Make sure to publish changes - Check if the code is set to apply to the correct pages Need help? [Contact support](https://www.simplecommenter.com/support). --- # WordPress Installation Add Simple Commenter to your WordPress website. Choose the method that works best for your setup. ## Method 1: Simple Commenter Plugin (Recommended) The official plugin handles everything automatically — no code needed. It also gives you full comment management directly inside WordPress admin. The plugin may still be pending approval on WordPress.org. You can [download it here](https://wordpress.org/plugins/simple-commenter/) if it's not yet available in the plugin directory. ### Installation 1. Search **"Simple Commenter"** in your WordPress plugin directory, or download from [WordPress.org](https://wordpress.org/plugins/simple-commenter/). Click **Install**, then **Activate**. 2. Go to the **Commenter** menu in your WordPress admin and connect your account. Sign in with Google or enter your email for a verification code. ![Connect your account from the plugin settings page](https://www.simplecommenter.com/images/wordpress-plugin/login.webp) 3. Choose an existing project or create a new one. The widget automatically appears on your site. ![Select which project to use for your WordPress site](https://www.simplecommenter.com/images/wordpress-plugin/select-project.webp) ### Comment Management Once connected, you can manage all feedback directly from WordPress admin: - View, filter, and search comments - Update status (To Do, In Progress, Done) without leaving WordPress - Set priority levels (Low, Normal, High) - Reply to comments with file attachments - Track unread comments with badge notifications in your admin menu ![The plugin dashboard with comments, settings, and access tabs](https://www.simplecommenter.com/images/wordpress-plugin/dashboard.webp) ### Automatic User Sync The plugin automatically syncs your WordPress users: - **Team members** (admins, editors) sync as collaborators - **Clients** with WordPress accounts sync as commenters - Role mapping is automatic — no manual setup - Daily sync keeps everything up to date ### Role-Based Widget Visibility Control who sees the feedback widget: - **Everyone** (including guests) - **Logged-in users only** - **Specific WordPress roles** (Administrators, Editors, Authors, etc.) - **Conditional loading** via `?feedback=true` URL parameter for testing. The check runs in the visitor's browser, so it works on sites with full page caching (LiteSpeed, WP Rocket, Cloudflare) This is useful for keeping the widget visible on staging but hidden from public visitors on production. ## Method 2: Code Snippet Plugins If you prefer to embed the script manually using a code snippet plugin, this keeps your code safe when updating themes. ### Using WPCode (Free) 1. Install and activate the **WPCode** plugin (or "Insert Headers and Footers") 2. Go to **Code Snippets > Header & Footer** 3. Paste this in the **Footer** section: ```html ``` 4. Click **Save Changes** Use your project public key (`sc_...`) from the dashboard with `?id=`. ### Using Insert Headers and Footers 1. Install **Insert Headers and Footers** by WPBeginner 2. Go to **Settings > Insert Headers and Footers** 3. Paste the script in the **Scripts in Footer** box 4. Save ## Method 3: Theme Editor Changes in the theme editor are lost when you update your theme. Consider using a plugin or child theme instead. 1. Go to **Appearance > Theme File Editor** 2. Select your active theme 3. Open `footer.php` (or your theme's footer template) 4. Add this code before ``: ```html ``` 5. Click **Update File** ## Method 4: Child Theme The safest method for theme modifications. Add this to your child theme's `functions.php`: ```php function add_simplecommenter_widget() { ?> Custom Code** 2. Click **Add New** 3. Set location to **Body - End** 4. Paste the script: ```html ``` 5. Set display conditions and publish ## Verifying Installation 1. Clear any caching plugins (WP Super Cache, W3 Total Cache, etc.) 2. Visit your site in an incognito/private window 3. Look for the feedback widget button 4. Check browser console (F12) for any errors ## Troubleshooting ### Widget not appearing - Clear your WordPress cache - Clear any CDN cache (Cloudflare, etc.) - Check that the script wasn't removed by a security plugin - Verify the embed identifier matches your dashboard project (`sc_...` preferred) ### Widget shows when logged in, but not in incognito If the widget appears while you are logged into WordPress but is missing for logged-out visitors or in an incognito window, a JavaScript optimization plugin is almost always the cause. These plugins skip optimization for logged-in administrators, which is exactly why the problem stays invisible to you and only affects real visitors. The feature responsible is usually called **Combine JavaScript**, **JS Combine External and Inline**, or **Merge JS**. It merges external scripts into a single file hosted on your own domain. That rewrite drops the `?id=sc_...` project key from the widget's script URL, and without that key the widget cannot tell which project it belongs to, so it stops silently with no console error. Plugins known to do this: **LiteSpeed Cache**, **WP Rocket**, **Autoptimize**, **W3 Total Cache**, **SG Optimizer**, and **Jetpack Boost**. ### Excluding the widget from LiteSpeed Cache, WP Rocket, and Autoptimize The fix is to exclude `simplecommenter.com` from JavaScript combining, so the widget script keeps its own tag and its `?id=` project key. This is standard practice for third-party widgets and has a negligible effect on page speed scores, since the script is a 3KB loader. - **LiteSpeed Cache** — Page Optimization > Tuning > **JS Excludes**, add `simplecommenter.com` on its own line. If **JS Delay** is enabled, add the same line to **JS Delayed Excludes**. - **WP Rocket** — File Optimization > **Excluded JavaScript Files**, add `simplecommenter.com`. - **Autoptimize** — JavaScript Options > **Exclude scripts from Autoptimize**, append `simplecommenter.com` to the list. - **W3 Total Cache** — Performance > Minify > **Never minify the following JS files**. - **SG Optimizer** and **Jetpack Boost** — turn off JavaScript combining, or add the same exclusion where the plugin allows one. After adding the exclusion, purge the **CSS/JS cache**, not just the page cache. The combined file is stored on your own server, so a page-only purge leaves the old merged copy in place and the widget stays broken. In LiteSpeed Cache, use Toolbox > Purge > **Purge All**. To confirm the fix, open your site in a fresh incognito window and view the page source. You should see the script tag with the project key intact: ```html ``` If that tag is missing, or the `?id=` is gone, the optimizer is still absorbing it. ### Conflicts with other plugins - Try disabling other JavaScript optimization plugins temporarily (see the section above for the usual culprit) - Check if a security plugin is blocking external scripts - Ensure no duplicate scripts are loaded ### WooCommerce sites The widget works on WooCommerce pages. If you only want it on certain pages: ```php function add_simplecommenter_widget() { // Only load on non-cart/checkout pages if (is_cart() || is_checkout()) return; ?> # MCP & AI Connections MCP (Model Context Protocol) connects your feedback to an external AI tool. Use a hosted HTTPS connection for browser clients, or the local npm server for coding tools. The built-in [AI Assistant](https://www.simplecommenter.com/docs/ai-assistant) is a separate dashboard chat. ## Find MCP settings and your token Open any project and click **MCP** directly in the project sidebar. It is a separate item beside Comments, Board, and Assets. From the workspace, use **Workspace settings → MCP & AI connections**. You can also [open MCP settings directly](https://www.simplecommenter.com/app/account/ai-agent). Workspace owners and team members can authorize hosted connections. Members can grant read and optional write access only to their currently assigned projects, including members with the Workspace Admin dashboard role. Only owners can grant settings or workspace-wide access and generate account API tokens. Project access is selected during browser authorization; opening setup from a project does not grant access automatically. Each hosted connection belongs to one company. If you own one company and are a member of another, select the intended company before starting the connection. Authorization shows the company, your email, and your role. Switching companies in the dashboard does not move an existing MCP connection; connect each company separately. Removing a membership or project assignment ends the member connection’s access to that data, including saved downloads and job results. For a token or API key, find **Local API tokens**, give the token a name, and click **Generate token**. Copy it immediately: the full value is shown once. Local tokens have account-wide read, write, and settings access. Use hosted OAuth authorization for read-only or selected-project access. ## Availability and Pricing MCP is included on supported paid plans, including Solo, Team, Pro, Agency, Enterprise, and Unlimited lifetime plans, and during the 14-day trial. It is not available on the free plan after the trial. Use `get_connection_info` to check the connected account's current plan and access. There is no separate MCP subscription or per-request fee. Hosted MCP allows 120 authenticated requests per minute per connection. The local server's MCP API allows 120 requests per minute per integration token. These are MCP limits, not a plan-specific allowance; your AI provider's usage limits apply separately. See [Troubleshooting](https://www.simplecommenter.com/docs/integrations/ai-agent#troubleshooting) for rate-limit recovery. ## Hosted connection: ChatGPT and Claude The hosted MCP route uses your existing Simple Commenter domain: ```text https://www.simplecommenter.com/api/mcp ``` Hosted MCP is enabled by default after deployment. Deployment operators can optionally disable it with `MCP_ENABLED=false`. Check the server status in [MCP settings](https://www.simplecommenter.com/app/account/ai-agent) before connecting. **Hosted connection unavailable** means that hosted access is disabled or unavailable on that deployment; use the local setup below while it is unavailable. The URL by itself does not establish a working connection. The hosted URL uses Streamable HTTP. It is the address to paste into a remote MCP client. The npm package runs locally over stdio and does not provide a URL to paste into ChatGPT. Browser setup uses **OAuth sign-in**; it does not require you to generate or paste a local API token. ### ChatGPT 1. Open **MCP** in the project sidebar and select **ChatGPT**. 2. In ChatGPT, enable **Developer mode** under **Settings → Security and login**. 3. Open **Plugins**, choose **+**, and create a developer-mode app using the hosted server URL. Choose OAuth authentication and dynamic client registration when offered. 4. Sign in to Simple Commenter. Select the permitted projects and allowed actions, then authorize the connection. 5. In a chat, select the app from **Developer mode** in the plus menu. Ask: “List my projects and show unresolved feedback.” Custom app access depends on the ChatGPT account and workspace policy. This server supports dynamic client registration (DCR), rather than Client ID Metadata Documents (CIMD). See [OpenAI's developer-mode guide](https://developers.openai.com/api/docs/guides/developer-mode) for current client requirements. ### Claude 1. Open **Customize → Connectors** in Claude. 2. Choose **+ → Add custom connector**, paste the hosted URL, and add the connector. 3. Connect and sign in to Simple Commenter, then select projects and approve the allowed actions. 4. Enable the connector for the conversation from **+ → Connectors**, then ask Claude to list your feedback. Organization owners may need to add the connector first. See [Claude's custom connector guide](https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp). ### Choose access and disconnect Browser authorization starts with read access and selected projects. Enable write access only when the client should create comments, reply, or triage feedback. Settings access permits administrative operations. Workspace-wide access, including future projects, is a separate explicit choice; creating projects and managing the workspace team require it as well as settings access. | Access | Permitted actions | Project scope | | --- | --- | --- | | Read | Read feedback, search, export, report, and manage this connection's report/export jobs. | Selected projects, or explicitly approved workspace access. | | Write | Create website comments, reply, upload reply files, change status/priority/tags/visibility, and archive or restore feedback. | Only projects included in the connection. | | Settings | Read and change supported project settings; inspect the selected project's assigned team. | Only projects included in the connection. | | Settings + all current and future projects | Create projects, list the workspace team, add members, change project assignments, and remove team members. | Workspace-wide administrative access. | Read access is always included. Write and settings access are optional and independent; enabling one does not enable the other. A client's tool approval dialog cannot expand the access granted in Simple Commenter. In **MCP → Connected apps**, review allowed actions, permitted projects, and last use. Members see and disconnect their own connections; owners can manage all connections in their company. Click **Disconnect** to revoke a connection. To add projects or change permissions, reconnect from the AI client and complete authorization again. Revocation also invalidates that connection's saved downloads and job results. ## What your AI can do Read feedback with project context, screenshot references, replies, tags, current statuses, and direct dashboard links. Search, export, and reporting apply the connection's project permissions. Changes require the appropriate granted access. The connection gives your AI access to feedback. Editing website code also requires access to the relevant code repository and development tools. ### Try a workflow - “List my projects and show the current statuses for my website.” - “Find urgent feedback created this week, including feedback on assets.” - “Export all feedback from this project to CSV, including archived comments.” - “Create a report of feedback by project, status, and priority.” - “Show me the proposed changes before moving these three comments to review.” ### Tool reference The hosted and local servers share these 27 tools. Your client discovers their JSON input schemas automatically. The tables below use their exact parameter names. Supply `project_id` from `list_projects` for a single-project tool; a local configured default can supply it when omitted. Hosted setup does not set a default project. Tool availability follows the connected server version; refresh discovery after upgrading and check hosted availability in settings. | Tool | Access | Inputs and behavior | | --- | --- | --- | | `get_connection_info` | Read | No inputs. Account plan, permissions, project grant, and connection details. | | `list_projects` | Read | No inputs. Authorized projects, stable IDs, and dashboard links. | | `get_project_context` | Read | `project_id`. Live statuses, custom status labels, tags, and project features. | | `list_comments` | Read | `project_id`, optional feedback filters, `limit`, `offset`. One project's feedback. | | `get_comment` | Read | `project_id`, `comment_id`, optional `asset_id`. Full detail, replies, file references, element context, and developer brief when available. | | `search_comments` | Read | Optional feedback filters, `limit`, `offset`. Search across authorized projects. | | `search` | Read | `query`. Up to 100 citable sources; `truncated` signals more matches. Use `search_comments` for paginated retrieval. | | `fetch` | Read | `id` returned by `search`. Full source content and citation URL; arbitrary URLs are not fetched. | | `export_comments` | Read | Optional feedback filters. Complete matching set as a downloadable CSV. | | `feedback_report` | Read | Optional feedback filters. Complete totals and breakdowns, with a Markdown download. | | `update_comment_status` | Write | `project_id`, `comment_id`, and `status` and/or `priority`; optional `asset_id`, `idempotency_key`. | | `update_comment` | Write | `project_id`, `comment_id`, and at least one of `status`, `priority`, `tags`, `visibility`, `archived`; optional `asset_id`, `idempotency_key`. | | `create_comment` | Write | `project_id`, `page`, `text`; optional `title`, `status`, `priority`, comma-separated `tags`, `anchor_selector`, `anchor_text`, `anchor_tag`, `idempotency_key`. Creates website feedback. | | `reply_to_comment` | Write | `project_id`, `comment_id`, `text`; optional `asset_id`, `attachments` containing `upload_id`, `idempotency_key`. | | `prepare_attachment_upload` | Write | `project_id`, `filename`, `mime_type`, exact byte `size`. Returns a signed PUT URL and `upload_id`. | | `bulk_update_comments` | Write | `items` and `idempotency_key`. Each item specifies `project_id`, `comment_id`, optional `asset_id`, and one or more update fields. Maximum 100 distinct items; returns each outcome. | | `get_project_settings` | Settings | `project_id`. Supported non-secret settings. | | `update_project_settings` | Settings | `project_id` and `settings`. Changes only the supplied supported settings. | | `create_project` | Settings + workspace | `name`, `idempotency_key`, optional `domain`. Creates a website project within plan limits. | | `list_team_members` | Settings | Optional `project_id`. Required for a selected-project grant; omitting it lists the workspace team only with workspace-wide access. | | `add_team_member` | Settings + workspace | `email`, `idempotency_key`; optional `name`, `project_id`, `role` (only `team`). Adds access without sending an invitation email. | | `assign_team_member` | Settings + workspace | `project_id`, `member_id`, `assigned` (`true` to assign, `false` to unassign). | | `remove_team_member` | Settings + workspace | `member_id`. Removes the member from the workspace and its projects; cannot remove the owner. | | `start_task` | Read | `operation` (`export_comments` or `feedback_report`), `arguments` containing feedback filters, and `idempotency_key`. Starts a background job. | | `get_task` | Read | `task_id`. Progress or final result for this connection's job. | | `list_tasks` | Read | Optional `limit`, `offset`. This connection's jobs. | | `cancel_task` | Read | `task_id`. Cancels an unfinished job; completed results remain available until expiry. | ### Filters and complete results Feedback filters are `project_id` **or** `project_ids` (up to 50), `query` (`search` is an alias), comma-separated `status`, `priority`, and `tags`, exact page `slug`, `author`, `created_after`, `created_before`, `include_archived`, `source`, and `asset_id`. `list_comments` uses one `project_id` rather than `project_ids`. Dates use ISO timestamps with a timezone; both endpoints are inclusive. Tags match any supplied tag. Text search matches titles and comment text, not the reply thread. `source` accepts `all`, `website`, or `asset` and defaults to `all`. `include_archived` defaults to `false`. Deleted feedback is always excluded. Without project filters, search, exports, and reports cover every project in the connection's grant, including when the local setup has a default project. `list_comments`, `search_comments`, and `list_tasks` return `total` and `next_offset`. Use that offset until it is `null`; each page defaults to 50 records and accepts a `limit` of 1–100 and `offset` of 0–1,000,000. Search text is limited to 1,000 characters. An export or report processes the entire matching set without `limit` or `offset`. Both have a maximum of 50,000 comments and an 8 MiB generated file limit; narrow the project or date range if exceeded. Dashboard links require sign-in and the viewer's own access. Website feedback links open the Board item when it is available in the active view; asset links open the asset viewer. Archived feedback may not open in the active Board; retrieve its detail with `get_comment` or restore it when appropriate. For example, call `search_comments` with these arguments, then use the returned `next_offset` to continue: ```json { "project_ids": ["PROJECT_ID"], "created_after": "2026-09-01T00:00:00Z", "created_before": "2026-09-06T23:59:59Z", "priority": "high,urgent", "source": "all", "include_archived": false, "limit": 100, "offset": 0 } ``` ### Export CSV from the dashboard Open a project → **Comments** or **Board** → **Export CSV**, beside **Add comment**. Choose **All website feedback** for all accessible statuses or **Current filters** for the complete filtered set, including records below the fold. On Board, filtered export waits for all statuses to finish loading. Both dashboard choices exclude archived and asset feedback. **General → Export Feedback** also exports all website feedback. Use MCP `export_comments` with `source: "all"` and `include_archived: true` when you need assets and archived feedback, or cross-project exports. MCP CSV rows include project, comment, status, priority, tags, author, creation date, source, page or asset, archive state, dashboard URL, screenshot URL, and comment and reply attachment URLs. Dashboard CSV also includes the reply thread; the MCP CSV does not include reply text. ### Updating feedback safely Read `get_project_context` before choosing a status; custom and enabled statuses vary by project. Priorities are `low`, `normal`, `high`, and `urgent`. For updates, `tags` is a replacement array (up to 30 tags); `[]` clears tags. `visibility` is `all` or `team`, and changing it can change client visibility. `archived: true` archives feedback; `false` restores it. Restore archived feedback before replying or making other changes. There is no permanent-delete tool. New comments and replies accept up to 30,000 text characters; a new comment's optional title accepts up to 500. Tags contain 1–40 letters, numbers, underscores, or hyphens. Use an `idempotency_key` for create/reply retries. It is required for bulk updates, project/member creation, and background jobs: 8–128 letters, digits, underscores, periods, colons, or hyphens. Reuse exactly the same key and arguments when retrying the same action; receipts last seven days. If the earlier outcome is uncertain, inspect the affected item before sending a new key. Bulk results can contain successful and failed items, so review each outcome. ### Project and team administration `get_project_settings` and `update_project_settings` support `projectName`, `domain`, `active`, `enabledStatuses`, `emailNotifications`, `emailFrequency`, `notifyOnOwnComments`, `drawing`, `screenshots`, `uploads`, `commentTitle`, `metaData`, `minimized`, `clientAccess`, and `tokenAccess`. Read the current settings before changing access controls. `clientAccess` is `open`, `request`, or `invite`; `tokenAccess` is a boolean. Status names must already exist in the project. `emailFrequency` accepts `minute`, `15minutes`, `hourly`, `daily`, `weekly`, or `monthly`. Other settings and credentials are not exposed by these tools. Adding a team member through MCP does not send an invitation email. Ask the workspace owner to arrange access through the dashboard when an invitation is needed. ### Reports, tasks, and reusable workflows Use `start_task` for an export or report that takes longer to produce. For example, these arguments start a CSV of website and asset feedback: ```json { "operation": "export_comments", "arguments": { "project_id": "PROJECT_ID", "source": "all", "include_archived": true }, "idempotency_key": "feedback-export-2026-09-06" } ``` Save the returned `task_id`. Call `get_task` with `{"task_id":"TASK_ID"}` no sooner than the returned `poll_interval_ms` (currently 3,000 ms). Status is `queued`, `running`, `completed`, `failed`, or `cancelled`; a completed task includes `result` and its download artifact. `cancel_task` stops an unfinished job. Jobs are private to the connection that started them and expire 24 hours after creation. New starts are rejected when the connection already has five unfinished jobs. Background processing uses the same data and file-size limits as direct exports. Download links last 15 minutes. While a completed job and its stored artifact remain available, retrieving the job renews an expired download link. Artifact content is retained for 24 hours after creation; renewal does not extend that retention. Regenerate a direct export after its link expires, or start a new job after the old one expires. Screenshot and attachment links inside a CSV expire separately; generate a fresh export when you need new file links. These are regular MCP tools; support for experimental protocol task APIs is not required. Compatible clients can browse connection, project, comment, and job resources, or use the `triage_feedback`, `release_report`, and `investigate_comment` prompts. Hosts that support MCP Apps can display a read-only feedback browser. Other clients receive ordinary tool results and links. ### Reply attachments Attachment uploads require a client capable of uploading files to a signed URL. Call `prepare_attachment_upload` with these arguments (the size is the actual file size in bytes): ```json { "project_id": "PROJECT_ID", "filename": "review.png", "mime_type": "image/png", "size": 12345 } ``` Upload those bytes with HTTP **PUT** to the returned `upload_url`, using its `headers`, before the returned `expires_at` (15 minutes). Then call `reply_to_comment`: ```json { "project_id": "PROJECT_ID", "comment_id": "COMMENT_ID", "text": "Here is the updated screenshot.", "attachments": [{ "upload_id": "UPLOAD_ID" }], "idempotency_key": "review-reply-2026-09-06" } ``` Each upload is usable once, in the same project and connection. Its declared type and size must match the uploaded object. MCP accepts files up to 100 MiB and at most 10 files per reply; plan file-size, file-count, type, storage, and retention limits may be lower. Uploads must be enabled for the project. Arbitrary remote URLs and local file paths are not imported as attachments. ### Local workflow preferences Local setup can disable AI-created comments or replies. These preferences are enforced for local tool calls. Status choices are read for the selected project; use `get_project_context` after changing projects to inspect its current workflow. ## Local setup: Cursor and Claude Code ### Step 1: Run the setup wizard From your project's root directory, run: ```bash npx @simple-commenter/mcp-server init ``` Alternatively, install the command globally and run it: ```bash npm install -g @simple-commenter/mcp-server simple-commenter-mcp init ``` ### Step 2: Choose the project and preferences The wizard will: 1. Authenticate with your email and a 6-digit code 2. Let you pick a default project 3. Configure status preferences for AI workflows 4. Ask whether the agent may write replies and create comments 5. Create a `.mcp.json` in your project root if one does not already exist #### Email code didn't arrive? Generate an API key in [MCP settings](https://www.simplecommenter.com/app/account/ai-agent) (**MCP → Local API tokens → Generate token**) and pass it directly to skip the email step: ```bash npx @simple-commenter/mcp-server init --token "$SIMPLE_COMMENTER_API_TOKEN" ``` Set `SIMPLE_COMMENTER_API_TOKEN` to your token in your local shell or secret manager first. The quotes pass its value as one argument. The wizard's `--token` option skips email verification; `init` does not automatically read the environment variable unless you pass it this way. Never include a real token in shared instructions or screenshots. ### Step 3: Restart Your AI Tool Restart Claude Code, Cursor, or whichever AI tool you use. The MCP server will be available automatically. ### Verify Your Setup ```bash simple-commenter-mcp doctor ``` This checks Node.js version, config file and its permissions, token, API connectivity, default project, and `.mcp.json` — reports pass/fail for each. Without a global installation, run `npx @simple-commenter/mcp-server doctor` instead. ## Configuration ### `.mcp.json` The wizard writes a `node` command pointing to its installed `index.js` and leaves any existing `.mcp.json` unchanged. For a manual, portable setup, merge this entry into your client's MCP configuration: ```json { "mcpServers": { "simple-commenter": { "command": "npx", "args": ["-y", "@simple-commenter/mcp-server", "serve"] } } } ``` ### Environment Variable (CI / Docker) For automated environments, pass the token as an environment variable instead of using the config file: ```json { "mcpServers": { "simple-commenter": { "command": "npx", "args": ["-y", "@simple-commenter/mcp-server", "serve"], "env": { "SIMPLE_COMMENTER_API_TOKEN": "REPLACE_WITH_API_TOKEN" } } } } ``` You can generate a token from the [MCP settings](https://www.simplecommenter.com/app/account/ai-agent) or via CLI login. ### Authentication Priority The server checks for credentials in this order: 1. `--token ` CLI flag 2. `SIMPLE_COMMENTER_API_TOKEN` environment variable 3. `~/.simple-commenter/config.json` (from `init` command) ## Managing local tokens Open **MCP → Local API tokens** or [go directly to MCP settings](https://www.simplecommenter.com/app/account/ai-agent) to generate named tokens, inspect last use, and revoke credentials you no longer need. Revoking an API token disconnects every local tool using that token. Browser-authorized apps have separate credentials and are managed under Connected apps. ## CLI Commands | Command | Description | | --- | --- | | simple-commenter-mcp init | Setup wizard — login + pick project | | simple-commenter-mcp serve | Start MCP server (default, used by AI tools) | | simple-commenter-mcp doctor | Health check — verify setup + connectivity | | simple-commenter-mcp status | Show account info + projects | | simple-commenter-mcp reset | Remove config + .mcp.json (clean slate) | `login` and `logout` still work as aliases for `init` and `reset`. ## Security - Credentials are stored in `~/.simple-commenter/config.json` with `chmod 600` (owner-only) - The server warns if file permissions are too open - For shared machines, use environment variables instead of the config file - Add `.simple-commenter/` to your `.gitignore` Never commit your API token to version control. Use environment variables in CI/CD pipelines. ## Troubleshooting ### Hosted connection and permissions | Problem | Recovery | | --- | --- | | Hosted connection unavailable | Check the status in MCP settings. Hosted MCP defaults to on, but the deployment can disable it with MCP_ENABLED=false or be unavailable. Use local setup while the deployment issue is resolved. | | No MCP URL in the npm instructions | Use `https://www.simplecommenter.com/api/mcp` for a remote connection. npm/stdio is the local setup. | | Cannot authorize or manage connections | Sign in as the workspace owner. Team members and clients cannot create owner credentials. | | Authorization request expired or invalid | Restart Connect in the AI client. Old consent URLs and authorization codes cannot be reused. | | OAuth registration fails | Use supported DCR, or client credentials supplied for a configured static client. This server does not advertise CIMD. Check the AI client's workspace restrictions. | | Connection revoked, expired, or invalid token | Reconnect through the AI client and authorize again. For local tools, generate a replacement token and update the local configuration. | | A project is missing or project not found | Call `list_projects` and `get_connection_info`. Use a returned ID; reconnect to add missing projects. Opening MCP from a project does not grant it automatically. | | A write or settings permission is required | Reconnect and approve the needed scope. Read-only access permits queries, reports, and exports. Project/team administration may also require all current and future projects. | | MCP unavailable on current plan | Inspect `get_connection_info` and the account's plan. A trial may have ended; open the returned upgrade link if needed. | | Too many requests / 429 | Wait for the HTTP `Retry-After` interval when supplied, then retry with backoff. Hosted requests are limited to 120/minute per connection, local MCP API requests to 120/minute per token. | | New tools missing in the AI client | Refresh the app's discovered tools or reconnect. Update the installed local package when using npm. | ### Feedback, exports, and uploads | Problem | Recovery | | --- | --- | | Only 50 or 100 comments were returned | Follow `next_offset` until `null`, or use `export_comments` for the complete matching set. | | Assets or archived comments are absent from dashboard CSV | Dashboard export covers active website feedback. Use MCP with `source: "all"` and `include_archived: true` for broader exports. | | Current filters export is disabled on Board | Wait for all statuses to load. Reload if background loading failed. | | Export exceeds size limits / 413 | Narrow project or date filters. Jobs have the same 50,000-comment and 8 MiB limits as direct exports. | | Download link expired | Retrieve the original job again while it is available, or generate a new export. Fresh embedded screenshot/file links require a new export. | | Job result says original access is unavailable | The original grant, project, connection, or plan changed. Reconnect with the appropriate access and start new work. | | Five unfinished jobs / 429 | Wait for a job to finish or cancel an unfinished job before starting another. | | Status is invalid or feedback is archived | Read current project statuses. Restore archived feedback before replying or updating it. | | Duplicate key or operation already running | Reuse the same arguments for the same idempotency key. Inspect the earlier outcome before issuing a new key. | | Upload incomplete or expired | PUT the exact file bytes before replying. For an expired reference, prepare a new upload in the same project and connection. | | File type, size, or storage limit rejected | Check the project's upload setting and account storage/file limits; choose a permitted file. | | Client cannot upload bytes to a signed URL | Attach the file through the dashboard instead. A local path or web URL in tool arguments is not an upload. | ### Local setup | Check | Fix | | --- | --- | | Config file not found | Run simple-commenter-mcp init | | No authentication token | Run init or set SIMPLE_COMMENTER_API_TOKEN | | API connection failed | Check your internet connection; verify the API URL | | No default project set | Run init and select a project | | .mcp.json not found | Run init from your project root (where package.json or .git is) | ### Still having issues? Run `simple-commenter-mcp doctor` for local diagnostics. For hosted issues, include the client name, MCP settings status, tool name, and error code when contacting [support](https://www.simplecommenter.com/support). Leave out tokens, authorization codes, signed download URLs, and private feedback. ## Next Steps - [Set up Slack notifications](https://www.simplecommenter.com/docs/integrations/slack) - [Connect Trello for task management](https://www.simplecommenter.com/docs/integrations/trello) - [Configure webhooks for custom integrations](https://www.simplecommenter.com/docs/integrations/webhooks) --- # Asana Integration Turn feedback into Asana tasks. When someone submits feedback, a task is created in your chosen project and section with the message, screenshots, priority, and a link back to your site. ## Setup ### Step 1: Connect Asana 1. Go to **Project Settings > Integrations > Asana** 2. Click **Connect to Asana** 3. Authorize SimpleCommenter in the popup 4. Grant access to your Asana account ### Step 2: Choose a Workspace After connecting, select which Asana workspace to use. The workspace selector appears above the routing mode toggle — it applies to both Simple and Advanced mode. ### Step 3: Choose a Destination Select where tasks should be created: 1. **Project** — pick which Asana project will receive tasks (required) 2. **Section** — optionally place tasks in a specific section like "To do" or "Backlog" Sections are optional. If you don't select one, tasks are added to the project's default section. ### Step 4: Choose a Routing Mode #### Simple Mode All feedback goes to one project and section. Select from the dropdowns. Good for small teams or projects where all feedback goes to the same place. #### Advanced Mode Create routing rules that send feedback to different projects and sections based on conditions. For example, route design feedback to one project and bugs to another. See [Routing Rules](https://www.simplecommenter.com/docs/integrations/asana#routing-rules) below for the full list of options. New projects default to Simple mode. You can switch between modes at any time without losing your configuration. ### Step 5: Enable the Integration Use the toggle in the header to turn the integration on. You can disable it at any time to pause syncing without disconnecting or losing your settings. ## Where to Configure You can set up Asana in two places: ### Project Settings Go to **Project > Settings > Integrations > Asana** - Applies only to this specific project - Overrides any default settings ### Project Template Go to **Project template > Integrations > Asana** - Applies to all new projects automatically - Useful if you want every project to create tasks in the same Asana project Project-level settings always take priority. If you configure Asana for a specific project, that configuration is used instead of the defaults. ## Routing Rules In Advanced mode, each rule has four parts: ### Triggers Choose which events fire the rule: | Trigger | When it fires | | --- | --- | | New comment | Someone submits feedback | | Reply | Someone replies to existing feedback | | Status update | A comment's status or priority changes | New rules default to **New comment** and **Reply** enabled. ### Conditions Filter which feedback matches the rule. No conditions means the rule matches everything. Multiple conditions use AND logic — all must match. | Field | Operators | Values | | --- | --- | --- | | Priority | is, is not | Low, Normal, High, Urgent | | Status | is, is not | To Do, In Progress, Review, Rework, On Hold, Blocked, Done, Cancelled, Won't Fix | | Commenter role | is, is not | Client, Team Lead, Workspace Admin | | Tagged user | includes | Any team member | | Page URL | is, contains, starts with | Text (e.g. /blog, /pricing) | ### Destination Each rule sends matching feedback to a specific Asana project and section. ### Examples - **Client feedback to a dedicated project**: Condition = "Commenter role is Client" → Project: Client Reviews / Section: Incoming - **Bugs to development**: Condition = "Page URL contains /app" → Project: Development / Section: Backlog - **High priority alerts**: Condition = "Priority is High or Urgent" → Project: Urgent / Section: To do ## What Gets Synced ### New Feedback → Asana Task When someone submits feedback, a task is created with: **Task name:** ``` #123 | Button not working on checkout page ``` **Task description includes:** - The feedback message - Who submitted it (name, email) - Date and time - Page URL - Link back to the comment **Attachments:** - Screenshot (uploaded to the task) - Any files the user uploaded **Priority (custom field):** If your Asana project has a "Priority" custom field, it's set automatically: Low priority Normal priority High priority **Status (custom field):** If your Asana project has a "Status" custom field, new tasks are set to **On track** by default. Priority and Status custom fields are auto-detected by name. If your project has fields named "Priority" and "Status" with enum options, SimpleCommenter will map to them automatically. ### Replies → Task Comments When you reply to feedback in SimpleCommenter, a comment (story) is added to the Asana task with the reply text and any attachment links. ### Status & Priority Updates When you change status or priority in SimpleCommenter: 1. The task's priority custom field is updated (if mapped) 2. If status changes to **Done** or **Cancelled**, the task is marked complete in Asana 3. If status changes back from Done/Cancelled, the task is marked incomplete 4. A comment is added to the task describing the change ## Enabling and Disabling The toggle in the integration header lets you pause syncing without disconnecting. Your workspace, project, section, and routing rules are preserved. - **Enabled**: Feedback syncs to Asana as configured - **Disabled**: No tasks are created or updated. Settings stay intact ## Troubleshooting ### Tasks Not Creating? 1. **Check the toggle** — Make sure the integration is enabled (not just connected) 2. **Check authorization** — Verify Asana shows as connected 3. **Verify workspace and project** — A workspace and project must be selected 4. **Check routing rules** — In Advanced mode, at least one rule must be active with matching conditions 5. **Re-authorize** — Click Disconnect, then Connect again to refresh the token ### Priority or Status Not Showing? Asana uses custom fields for priority and status. SimpleCommenter auto-detects fields named "Priority" and "Status" with enum options. Make sure: - Your Asana project has these custom fields added - The fields are **enum type** (dropdown) - Priority options include "Low", "Medium", and "High" - Status options include "On track" ### Token Expired? Asana access tokens expire after about an hour. SimpleCommenter automatically refreshes them using the refresh token. If you see authorization errors, try disconnecting and reconnecting. ## Disconnecting 1. Go to **Integrations > Asana** 2. Click **Disconnect** 3. Confirm the disconnection Existing Asana tasks are not deleted when you disconnect. They remain in your project. ## Next Steps - [Connect Monday.com for board-based tracking](https://www.simplecommenter.com/docs/integrations/monday) - [Set up Slack notifications](https://www.simplecommenter.com/docs/integrations/slack) - [Configure webhooks for custom workflows](https://www.simplecommenter.com/docs/integrations/webhooks) --- # ClickUp Integration Turn feedback into ClickUp tasks. When someone submits feedback, a task is created in your chosen list with the message, screenshots, priority, and a link back to your site. ## Setup ### Step 1: Connect ClickUp 1. Go to **Project Settings > Integrations > ClickUp** 2. Click **Connect to ClickUp** 3. Authorize SimpleCommenter in the popup 4. Select the workspace(s) to grant access to ### Step 2: Choose a Destination After connecting, select where tasks should be created: 1. **Workspace** — pick your ClickUp workspace 2. **Space** — choose a space within the workspace 3. **Folder** — select a folder, or choose "Folderless" for lists outside folders 4. **List** — pick the list where tasks will land ### Step 3: Choose a Routing Mode #### Simple Mode All feedback goes to one list. Select your workspace, space, folder, and list from the dropdowns. Good for small teams or projects where all feedback goes to the same place. #### Advanced Mode Create routing rules that send feedback to different lists based on conditions. For example, route high-priority feedback to an "Urgent" list or client feedback to a separate list. See [Routing Rules](https://www.simplecommenter.com/docs/integrations/clickup#routing-rules) below for the full list of options. New projects default to Simple mode. You can switch between modes at any time without losing your configuration. ### Step 4: Enable the Integration Use the toggle in the header to turn the integration on. You can disable it at any time to pause syncing without disconnecting or losing your settings. ## Where to Configure You can set up ClickUp in two places: ### Project Settings Go to **Project > Settings > Integrations > ClickUp** - Applies only to this specific project - Overrides any default settings ### Project Template Go to **Project template > Integrations > ClickUp** - Applies to all new projects automatically - Useful if you want every project to create tasks in the same list Project-level settings always take priority. If you configure ClickUp for a specific project, that configuration is used instead of the defaults. ## Routing Rules In Advanced mode, each rule has four parts: ### Triggers Choose which events fire the rule: | Trigger | When it fires | | --- | --- | | New comment | Someone submits feedback | | Reply | Someone replies to existing feedback | | Status update | A comment's status or priority changes | New rules default to **New comment** and **Reply** enabled. ### Conditions Filter which feedback matches the rule. No conditions means the rule matches everything. Multiple conditions use AND logic — all must match. | Field | Operators | Values | | --- | --- | --- | | Priority | is, is not | Low, Normal, High, Urgent | | Status | is, is not | To Do, In Progress, Review, Rework, On Hold, Blocked, Done, Cancelled, Won't Fix | | Commenter role | is, is not | Client, Team Lead, Workspace Admin | | Tagged user | includes | Any team member | | Page URL | is, contains, starts with | Text (e.g. /blog, /pricing) | ### Destination Each rule sends matching feedback to a specific ClickUp list. ### Examples - **Client feedback to a dedicated list**: Condition = "Commenter role is Client" → List: Client Feedback - **High priority to urgent list**: Condition = "Priority is High or Urgent" → List: Urgent - **Blog feedback separate**: Condition = "Page URL starts with /blog" → List: Content Feedback ## What Gets Synced ### New Feedback → ClickUp Task When someone submits feedback, a task is created with: **Task title:** ``` #123 | Button not working on checkout page ``` **Task description includes:** - The feedback message - Who submitted it (name, email) - Date and time - Page URL - Status and priority - Link back to the comment **Attachments:** - Screenshot (if captured) - Any files the user uploaded **Priority:** ClickUp's built-in priority field is set automatically: Low priority Normal priority High priority Urgent priority **Tags:** Each task is tagged with `simplecommenter` for easy filtering. ### Replies → Task Comments When you reply to feedback in SimpleCommenter, a comment is added to the ClickUp task with the reply text. Any attachments are uploaded to the task. ### Status & Priority Updates When you change status or priority in SimpleCommenter: 1. The task's priority field is updated in ClickUp 2. The task's status is updated to match (mapped to your list's status names) 3. A comment is added to the task describing the change Status mapping depends on your ClickUp list's status names. SimpleCommenter maps to common defaults like "to do", "in progress", "in review", and "complete". If your list uses different names, the status update will be logged as a comment instead. ## Enabling and Disabling The toggle in the integration header lets you pause syncing without disconnecting. Your list selection and routing rules are preserved. - **Enabled**: Feedback syncs to ClickUp as configured - **Disabled**: No tasks are created or updated. Settings stay intact ## Troubleshooting ### Tasks Not Creating? 1. **Check the toggle** — Make sure the integration is enabled (not just connected) 2. **Check authorization** — Verify ClickUp shows as connected 3. **Verify list selection** — The selected workspace, space, and list must still exist in ClickUp 4. **Check routing rules** — In Advanced mode, at least one rule must be active with matching conditions 5. **Re-authorize** — Click Disconnect, then Connect again to refresh ### Status Not Updating on Tasks? ClickUp requires the status name to match exactly. If your list uses custom status names (e.g., "Todo" instead of "to do"), the PUT update may not apply. The change will still be recorded as a task comment. ## Disconnecting 1. Go to **Integrations > ClickUp** 2. Click **Disconnect** 3. Confirm the disconnection Existing ClickUp tasks are not deleted when you disconnect. They remain in your workspace. ## Next Steps - [Connect GitHub for issue tracking](https://www.simplecommenter.com/docs/integrations/github) - [Set up Slack notifications](https://www.simplecommenter.com/docs/integrations/slack) - [Configure webhooks for custom workflows](https://www.simplecommenter.com/docs/integrations/webhooks) --- # Discord Integration Send feedback straight to Discord. When someone submits feedback, SimpleCommenter posts a rich embed to your chosen channel, with the screenshot, submitter, page, status, and priority, plus a button to open it in the dashboard. Replies and status changes stay in sync. ## Setup ### Step 1: Install the Bot 1. Go to **Project Settings > Integrations > Discord** 2. Click **Add to Discord** 3. Choose the server (guild) to install the SimpleCommenter bot into 4. Authorize the requested permissions You need the **Manage Server** permission in Discord to add a bot to a server. ### Step 2: Choose a Channel After the bot is installed, pick the server and channel that feedback should post to. Both channel types are supported: | Channel type | Behavior | | --- | --- | | Text channel | Each comment posts as a message, and replies are added to a thread created on that message. | | Forum channel | Each comment opens a new forum thread. Status is reflected with a forum tag if you map one. | The bot only sees channels it has access to. If a channel is missing from the dropdown, make sure the bot role can **View Channel** there. ### Step 3: Enable the Integration Use the toggle in the header to turn notifications on. You can disable them at any time to pause without removing the bot. ## Where to Configure ### Project Settings Go to **Project > Settings > Integrations > Discord** - Applies only to this specific project - Overrides any default settings ### Project Template Go to **Project template > Integrations > Discord** - Applies to all new projects automatically Project-level settings always take priority over defaults. ## What Gets Posted Discord notifications include: - The comment title or message text - Comment number and a color-coded status - Priority, page, and who submitted it - Tagged team members, if any - Screenshot and file attachments, when present - An **Open in Dashboard** button linking to the exact comment Replies are posted into the comment's thread, so each piece of feedback keeps its own conversation. ### Status Updates When a comment's status or priority changes, SimpleCommenter: - Updates the original embed's color to match the new status - Posts a short change note in the thread (for example, `Status: To Do → Done`) - Adds a status reaction on the original message - Updates the forum tag, if the channel is a forum and you mapped tags to statuses ## Enabling and Disabling The toggle in the integration header pauses notifications without removing the bot. Your server, channel, and tag settings are preserved. - **Enabled**: Feedback posts to Discord as configured - **Disabled**: No messages are sent. Settings stay intact ## Troubleshooting ### Not Receiving Notifications? 1. **Check the toggle** — Make sure the integration is enabled, not just installed 2. **Check bot access** — The bot needs **View Channel** and **Send Messages** in the target channel 3. **Check the channel** — Verify the selected channel still exists 4. **Forum channels** — The bot also needs permission to create posts in the forum ### Replies or Status Updates Not Showing? Replies and status edits attach to the original message's thread. If the thread was deleted or archived, or the bot lost access to the channel, updates are skipped. ## Removing the Integration 1. Go to **Integrations > Discord** 2. Disable the toggle, or remove the SimpleCommenter bot from your Discord server settings Removing the bot from your server stops all Discord notifications immediately. ## Next Steps - [Connect Slack for channel notifications](https://www.simplecommenter.com/docs/integrations/slack) - [Connect Trello for task management](https://www.simplecommenter.com/docs/integrations/trello) - [Set up webhooks for custom integrations](https://www.simplecommenter.com/docs/integrations/webhooks) --- # Email Integration Send feedback notifications to specific email addresses when comments are created, replied to, or have their status changed. Works with help desk inboxes like HelpScout, Zendesk, and Freshdesk. ## Setup ### Step 1: Add Recipients 1. Go to **Project Settings > Integrations > Email** 2. Enter the email addresses you want to receive notifications 3. Click **Add** for each address No external account connection is needed — the integration uses SimpleCommenter's built-in email delivery. ### Step 2: Choose a Routing Mode #### Simple Mode All feedback notifications go to the same recipients. Good for small teams or single help desk inboxes. #### Advanced Mode Create routing rules that send notifications to different recipients based on conditions. For example, route high-priority feedback to `urgent@yourteam.com` and everything else to `feedback@yourteam.com`. See [Routing Rules](https://www.simplecommenter.com/docs/integrations/email#routing-rules) below for the full list of options. ### Step 3: Configure Options #### Reply-To Header Control where replies go when someone responds to a notification email: - **No Reply-To** — Default. Replies go nowhere specific. - **Commenter's email** — Replies go to the person who left feedback. Ideal for help desk inboxes so tickets are associated with the right customer. - **Custom email** — Replies go to a specific address you choose. When using "Commenter's email", the From address stays as SimpleCommenter's verified sender. Only the Reply-To header changes — this avoids SPF/DKIM deliverability issues. #### Include Screenshot Toggle whether to include the feedback screenshot in notification emails. Enabled by default. #### Include Link Toggle whether to include a link back to the comment in the SimpleCommenter dashboard. Enabled by default. ### Step 4: Enable the Integration Use the toggle in the header to turn the integration on. You can disable it at any time to pause notifications without losing your settings. ## Where to Configure ### Project Settings Go to **Project > Settings > Integrations > Email** - Applies only to this specific project - Overrides any default settings ### Project Template Go to **Project template > Integrations > Email** - Applies to all new projects - Existing projects keep their own settings ## Help Desk Use Case Forward feedback to your help desk inbox with the commenter's email in the Reply-To header: 1. Add your help desk inbox (e.g., `support@yourcompany.com`) as a recipient 2. Set Reply-To to **Commenter's email** 3. When feedback arrives, your help desk creates a ticket associated with the customer 4. Your team replies through the help desk — the reply goes directly to the customer Compatible with HelpScout, Zendesk, Freshdesk, Intercom, Front, and any inbox that reads Reply-To headers. ## Routing Rules In Advanced mode, you can create rules with these conditions: Route based on feedback priority (low, normal, high). Route based on feedback status (todo, in progress, review, etc.). Route based on who left the feedback (client, team, admin). Route based on which team member is tagged. Route based on the page where feedback was left. Each rule specifies its own set of recipients. Rules can be ordered and matched using "first match" or "all matches" mode. ## Existing Email Notifications This integration is separate from the built-in email notification system (configured under Project Settings > Notifications). The built-in system sends digest emails to project members. This integration sends real-time notifications to any email address based on routing rules. --- # GitHub Integration Turn feedback into GitHub issues. When users submit feedback, an issue is created in your chosen repository with the details, screenshots, and colored labels for status and priority. ## Setup ### Step 1: Connect GitHub 1. Go to **Project Settings > Integrations > GitHub** 2. Click **Connect to GitHub** 3. Authorize SimpleCommenter in the popup 4. Click **Authorize** to grant repository access You need access to the repositories you want to sync feedback to. The integration requests the `repo` scope to create issues in both public and private repositories. ### Step 2: Choose a Routing Mode After connecting, pick how feedback reaches your repositories. #### Simple Mode One repository for all feedback. Select the repository from the dropdown. Good for single-project teams or when all feedback maps to one repo. #### Advanced Mode Create routing rules that send feedback to different repositories based on conditions. For example, route frontend bugs to `acme/web-app` and API issues to `acme/backend`. See [Routing Rules](https://www.simplecommenter.com/docs/integrations/github#routing-rules) below for the full list of options. New projects default to Simple mode. You can switch between modes at any time without losing your configuration. ### Step 3: Enable the Integration Use the toggle in the header to turn the integration on. You can disable it at any time to pause syncing without disconnecting or losing your settings. ## Where to Configure You can set up GitHub in two places: ### Project Settings Go to **Project > Settings > Integrations > GitHub** - Applies only to this specific project - Overrides any default settings ### Project Template Go to **Project template > Integrations > GitHub** - Applies to all new projects automatically - Useful if you want every project to create issues in the same repository Project-level settings always take priority. If you configure GitHub for a specific project, that configuration is used instead of the defaults. ## Routing Rules In Advanced mode, each rule has four parts: ### Triggers Choose which events fire the rule: | Trigger | When it fires | | --- | --- | | New comment | Someone submits feedback | | Reply | Someone replies to existing feedback | | Status update | A comment's status or priority changes | New rules default to **New comment** and **Reply** enabled. ### Conditions Filter which feedback matches the rule. No conditions means the rule matches everything. Multiple conditions use AND logic — all must match. | Field | Operators | Values | | --- | --- | --- | | Priority | is, is not | Low, Normal, High, Urgent | | Status | is, is not | To Do, In Progress, Review, Rework, On Hold, Blocked, Done, Cancelled, Won't Fix | | Commenter role | is, is not | Client, Team Lead, Workspace Admin | | Tagged user | includes | Any team member | | Page URL | is, contains, starts with | Text (e.g. /blog, /pricing) | ### Destination Each rule sends matching feedback to a specific GitHub repository. ### Examples - **Frontend bugs to the web repo**: Condition = "Page URL starts with /app" → Repository: acme/web-app - **High priority to a dedicated repo**: Condition = "Priority is High or Urgent" → Repository: acme/urgent-fixes - **Client feedback separate**: Condition = "Commenter role is Client" → Repository: acme/client-feedback ## What Gets Synced ### New Feedback → GitHub Issue When someone submits feedback, an issue is created with: **Issue title:** ``` #123 | Button not working on checkout page ``` **Issue body includes:** - The feedback message - Who submitted it (name, email) - Date and time - Page URL where feedback was left - Current status and priority - Link back to the comment **Screenshots:** Screenshots are embedded directly in the issue body as Markdown images. Other file attachments are included as download links. GitHub does not support file uploads via the API. Screenshots and attachments appear as linked images and files in the issue body. **Labels:** - A `simplecommenter` identifier label (purple) - Status label (e.g., `sc:status:todo`) - Priority label (e.g., `sc:priority:high`) ### Replies → Issue Comments When you reply to feedback in SimpleCommenter, a comment is added to the GitHub issue with the reply text and any attachment links. ### Status & Priority Updates When you change status or priority: 1. A comment is added to the issue describing the change 2. Labels are automatically swapped (old label removed, new label added) 3. If the new status is **Done** or **Cancelled**, the issue is closed 4. If a closed issue is moved back to an open status, the issue is reopened ## Status Labels SimpleCommenter creates and manages labels automatically on your repository: #2563eb — Blue #2563eb — Blue #f97316 — Orange #eab308 — Yellow #6b7280 — Gray #ef4444 — Red #22c55e — Green (closes the issue) #6b7280 — Gray (closes the issue) ## Priority Labels #0ea5e9 — Sky blue #2563eb — Blue #ef4444 — Red Labels are created automatically on your repository the first time they are needed. A purple `simplecommenter` label is also added to every issue for easy filtering. ## Enabling and Disabling The toggle in the integration header lets you pause syncing without disconnecting. Your repository selection and routing rules are preserved. - **Enabled**: Feedback syncs to GitHub as configured - **Disabled**: No issues are created or updated. Settings stay intact ## Troubleshooting ### Issues Not Creating? 1. **Check the toggle** — Make sure the integration is enabled (not just connected) 2. **Check authorization** — Verify GitHub shows as connected with your username 3. **Verify repository** — The selected repository must still exist and you must have write access 4. **Check routing rules** — In Advanced mode, at least one rule must be active with matching conditions 5. **Re-authorize** — Click Disconnect, then Connect again to refresh your access token ### Labels Not Appearing? - Make sure you have permission to create labels on the repository - Try disconnecting and reconnecting ### Issue Closed Unexpectedly? Setting a comment's status to **Done** or **Cancelled** closes the GitHub issue. Change the status back to any open status to reopen it. ## Disconnecting 1. Go to **Project Settings > Integrations > GitHub** 2. Click **Disconnect** 3. Confirm the disconnection Existing GitHub issues are not deleted when you disconnect. They remain in your repository. You can also revoke access from your GitHub settings under **Settings > Applications > Authorized OAuth Apps**. ## Next Steps - [Set up Slack notifications](https://www.simplecommenter.com/docs/integrations/slack) - [Connect Trello for task management](https://www.simplecommenter.com/docs/integrations/trello) - [Configure webhooks for custom workflows](https://www.simplecommenter.com/docs/integrations/webhooks) --- # Jira Integration The Jira integration is currently in development. Check back soon for full documentation. Turn feedback into Jira issues. When someone submits feedback, an issue is created in your chosen Jira project with the message, screenshots, priority labels, and a link back to your site. ## Coming Soon - OAuth 2.0 (3LO) connection to Jira Cloud - Project and issue type selection - Status and priority label mapping - Screenshot and file attachments - Reply threading via issue comments - Routing rules for Advanced mode ## Next Steps - [Connect Asana for task tracking](https://www.simplecommenter.com/docs/integrations/asana) - [Connect Linear for issue tracking](https://www.simplecommenter.com/docs/integrations/linear) - [Set up Slack notifications](https://www.simplecommenter.com/docs/integrations/slack) --- # Linear Integration Turn feedback into Linear issues. When someone submits feedback, an issue is created in your chosen team with the message, screenshots, priority, and a link back to your site. ## Setup ### Step 1: Connect Linear 1. Go to **Project Settings > Integrations > Linear** 2. Click **Connect to Linear** 3. Authorize SimpleCommenter in the popup 4. Grant access to your Linear workspace ### Step 2: Choose a Destination After connecting, select where issues should be created: 1. **Team** — pick which Linear team will receive issues (required) 2. **Project** — optionally assign issues to a project (cross-team grouping) In Linear, every issue belongs to a team. Projects are optional groupings that can span multiple teams — useful for initiatives like "Q1 Launch" or "Website Redesign". ### Step 3: Choose a Routing Mode #### Simple Mode All feedback goes to one team (and optionally one project). Select from the dropdowns. Good for small teams or projects where all feedback goes to the same place. #### Advanced Mode Create routing rules that send feedback to different teams based on conditions. For example, route design feedback to the Design team and bugs to Engineering. See [Routing Rules](https://www.simplecommenter.com/docs/integrations/linear#routing-rules) below for the full list of options. New projects default to Simple mode. You can switch between modes at any time without losing your configuration. ### Step 4: Enable the Integration Use the toggle in the header to turn the integration on. You can disable it at any time to pause syncing without disconnecting or losing your settings. ## Where to Configure You can set up Linear in two places: ### Project Settings Go to **Project > Settings > Integrations > Linear** - Applies only to this specific project - Overrides any default settings ### Project Template Go to **Project template > Integrations > Linear** - Applies to all new projects automatically - Useful if you want every project to create issues in the same team Project-level settings always take priority. If you configure Linear for a specific project, that configuration is used instead of the defaults. ## Routing Rules In Advanced mode, each rule has four parts: ### Triggers Choose which events fire the rule: Someone submits feedback Someone replies to existing feedback A comment's status or priority changes New rules default to **New comment** and **Reply** enabled. ### Conditions Filter which feedback matches the rule. No conditions means the rule matches everything. Multiple conditions use AND logic — all must match. Low, Normal, High, Urgent To Do, In Progress, Review, Rework, On Hold, Blocked, Done, Cancelled, Won't Fix Client, Team Lead, Workspace Admin Any team member Text (e.g. `/blog`, `/pricing`) ### Destination Each rule sends matching feedback to a specific Linear team. ### Examples - **Client feedback to a dedicated team**: Condition = "Commenter role is Client" → Team: Client Support - **Bugs to engineering**: Condition = "Page URL contains /app" → Team: Engineering - **High priority alerts**: Condition = "Priority is High or Urgent" → Team: Urgent Triage ## What Gets Synced ### New Feedback → Linear Issue When someone submits feedback, an issue is created with: **Issue title:** ``` #123 | Button not working on checkout page ``` **Issue description includes:** - The feedback message - Who submitted it (name, email) - Date and time - Page URL - Status and priority - Link back to the comment **Screenshot:** If the user captured a screenshot, it's attached to the issue via Linear's attachment system and embedded in the description as an image. **Priority:** Linear's built-in priority field is set automatically: Low priority Normal priority High priority **Workflow state:** New issues are created in the team's default workflow state (typically "Backlog" or "Triage"), matching the feedback's current status. ### Replies → Issue Comments When you reply to feedback in SimpleCommenter, a comment is added to the Linear issue with the reply text and any attachment links. ### Status & Priority Updates When you change status or priority in SimpleCommenter: 1. The issue's workflow state is updated to match (mapped to the closest state type) 2. The issue's priority level is updated 3. A comment is added to the issue describing the change **Status mapping:** SimpleCommenter statuses are mapped to Linear workflow state types: Maps to the team's unstarted state Maps to the team's started state Maps to the team's started state Maps to the team's completed state Maps to the team's cancelled state ## Enabling and Disabling The toggle in the integration header lets you pause syncing without disconnecting. Your team selection and routing rules are preserved. - **Enabled**: Feedback syncs to Linear as configured - **Disabled**: No issues are created or updated. Settings stay intact ## Troubleshooting ### Issues Not Creating? 1. **Check the toggle** — Make sure the integration is enabled (not just connected) 2. **Check authorization** — Verify Linear shows as connected 3. **Verify team selection** — A team must be selected 4. **Check routing rules** — In Advanced mode, at least one rule must be active with matching conditions 5. **Re-authorize** — Click Disconnect, then Connect again to refresh the token ### Priority Not Mapping? Linear uses a numeric priority scale (1=Urgent, 2=High, 3=Medium, 4=Low). SimpleCommenter maps automatically: Low→4, Normal→3, High→2. ## Disconnecting 1. Go to **Integrations > Linear** 2. Click **Disconnect** 3. Confirm the disconnection Existing Linear issues are not deleted when you disconnect. They remain in your workspace. ## Next Steps - [Connect GitHub for issue tracking](https://www.simplecommenter.com/docs/integrations/github) - [Set up Slack notifications](https://www.simplecommenter.com/docs/integrations/slack) - [Configure webhooks for custom workflows](https://www.simplecommenter.com/docs/integrations/webhooks) --- # Monday.com Integration Turn feedback into Monday.com items. When someone submits feedback, an item is created in your chosen board and group with the message, screenshots, priority, and a link back to your site. ## Setup ### Step 1: Connect Monday.com 1. Go to **Project Settings > Integrations > Monday.com** 2. Click **Connect to Monday.com** 3. Authorize SimpleCommenter in the popup 4. Grant access to your Monday.com account ### Step 2: Choose a Destination After connecting, select where items should be created: 1. **Board** — pick which Monday.com board will receive items (required) 2. **Group** — choose a group within the board (required) In Monday.com, every item lives in a group on a board. Groups are the rows sections like "This Week", "Backlog", or "Done" that organize your items. ### Step 3: Map Columns After selecting a board and group, map your Monday.com columns to SimpleCommenter fields: 1. **Status Column** — which status-type column tracks the feedback status (optional) 2. **Priority Column** — which status-type column tracks priority (optional) 3. **Files Column** — which file column receives screenshots and attachments (optional) Column mapping is shown below the routing section regardless of whether you use Simple or Advanced mode. If you skip column mapping, items will still be created — status, priority, and files just won't sync to columns. The information is always included in the item's update text. ### Step 4: Choose a Routing Mode #### Simple Mode All feedback goes to one board and group. Select from the dropdowns. Good for small teams or projects where all feedback goes to the same place. #### Advanced Mode Create routing rules that send feedback to different boards and groups based on conditions. For example, route design feedback to the Design board and bugs to the Development board. See [Routing Rules](https://www.simplecommenter.com/docs/integrations/monday#routing-rules) below for the full list of options. New projects default to Simple mode. You can switch between modes at any time without losing your configuration. ### Step 5: Enable the Integration Use the toggle in the header to turn the integration on. You can disable it at any time to pause syncing without disconnecting or losing your settings. ## Where to Configure You can set up Monday.com in two places: ### Project Settings Go to **Project > Settings > Integrations > Monday.com** - Applies only to this specific project - Overrides any default settings ### Project Template Go to **Project template > Integrations > Monday.com** - Applies to all new projects automatically - Useful if you want every project to create items on the same board Project-level settings always take priority. If you configure Monday.com for a specific project, that configuration is used instead of the defaults. ## Routing Rules In Advanced mode, each rule has four parts: ### Triggers Choose which events fire the rule: | Trigger | When it fires | | --- | --- | | New comment | Someone submits feedback | | Reply | Someone replies to existing feedback | | Status update | A comment's status or priority changes | New rules default to **New comment** and **Reply** enabled. ### Conditions Filter which feedback matches the rule. No conditions means the rule matches everything. Multiple conditions use AND logic — all must match. | Field | Operators | Values | | --- | --- | --- | | Priority | is, is not | Low, Normal, High, Urgent | | Status | is, is not | To Do, In Progress, Review, Rework, On Hold, Blocked, Done, Cancelled, Won't Fix | | Commenter role | is, is not | Client, Team Lead, Workspace Admin | | Tagged user | includes | Any team member | | Page URL | is, contains, starts with | Text (e.g. /blog, /pricing) | ### Destination Each rule sends matching feedback to a specific Monday.com board and group. ### Examples - **Client feedback to a dedicated board**: Condition = "Commenter role is Client" → Board: Client Reviews / Group: Incoming - **Bugs to development**: Condition = "Page URL contains /app" → Board: Development / Group: Backlog - **High priority alerts**: Condition = "Priority is High or Urgent" → Board: Urgent / Group: This Week ## What Gets Synced ### New Feedback → Monday.com Item When someone submits feedback, an item is created with: **Item name:** ``` #123 | Button not working on checkout page ``` **Item update includes:** - The feedback message - Who submitted it (name, email) - Date and time - Page URL - Link back to the comment **Attachments:** - Screenshot (uploaded to the files column if mapped) - Any files the user uploaded **Status column:** If a status column is mapped, it's set automatically based on the feedback status: New feedback starts here Actively being worked on Awaiting review Cannot proceed Completed Status mapping uses label names. If your board's status column doesn't have a matching label (e.g., "Ready to Start"), the status will remain blank. You can add these labels to your column settings in Monday.com. **Priority column:** If a priority column is mapped, it's set automatically: Low priority Normal priority High priority ### Replies → Item Updates When you reply to feedback in SimpleCommenter, an update (comment) is added to the Monday.com item with the reply text and any attachment links. ### Status & Priority Updates When you change status or priority in SimpleCommenter: 1. The item's status column is updated to the matching label 2. The item's priority column is updated 3. An update is added to the item describing the change ## Enabling and Disabling The toggle in the integration header lets you pause syncing without disconnecting. Your board selection, column mapping, and routing rules are preserved. - **Enabled**: Feedback syncs to Monday.com as configured - **Disabled**: No items are created or updated. Settings stay intact ## Troubleshooting ### Items Not Creating? 1. **Check the toggle** — Make sure the integration is enabled (not just connected) 2. **Check authorization** — Verify Monday.com shows as connected 3. **Verify board and group** — A board and group must be selected 4. **Check routing rules** — In Advanced mode, at least one rule must be active with matching conditions 5. **Re-authorize** — Click Disconnect, then Connect again to refresh the token ### Status Not Updating on Items? Monday.com status columns use label names. SimpleCommenter sends labels like "Ready to Start", "Working on it", and "Done". If your column uses different labels, add the matching ones in your Monday.com board settings under the status column configuration. ### Files Not Uploading? Make sure a **Files Column** is mapped in the Column Mapping section. Without it, screenshots and attachments won't upload (but they'll still be linked in the item's update text). ## Disconnecting 1. Go to **Integrations > Monday.com** 2. Click **Disconnect** 3. Confirm the disconnection Existing Monday.com items are not deleted when you disconnect. They remain on your board. ## Next Steps - [Connect Linear for issue tracking](https://www.simplecommenter.com/docs/integrations/linear) - [Set up Slack notifications](https://www.simplecommenter.com/docs/integrations/slack) - [Configure webhooks for custom workflows](https://www.simplecommenter.com/docs/integrations/webhooks) --- # Slack Integration Get feedback notifications directly in Slack. When someone submits feedback, your team sees it in the channel with rich formatting, screenshots, and a link back to the dashboard. ## Setup ### Step 1: Connect Slack 1. Go to **Project Settings > Integrations > Slack** 2. Click **Add to Slack** 3. Authorize SimpleCommenter in your Slack workspace 4. Select the workspace to install to You need Slack admin permissions to install apps in your workspace. ### Step 2: Choose a Routing Mode After connecting, pick how notifications reach your channels. #### Simple Mode All feedback goes to one channel. Select the channel from the dropdown. Good for small teams or when all feedback should land in the same place (e.g., `#feedback` or `#product`). #### Advanced Mode Create routing rules that post to different channels based on conditions. For example, send client feedback to `#client-reviews` and high-priority issues to `#urgent`. See [Routing Rules](https://www.simplecommenter.com/docs/integrations/slack#routing-rules) below for all options. New projects default to Simple mode. You can switch between modes at any time without losing your configuration. ### Step 3: Enable the Integration Use the toggle in the header to turn notifications on. You can disable them at any time to pause without disconnecting. ## Where to Configure ### Project Settings Go to **Project > Settings > Integrations > Slack** - Applies only to this specific project - Overrides any default settings ### Project Template Go to **Project template > Integrations > Slack** - Applies to all new projects automatically - Useful if you want every project to post to the same channel Project-level settings always take priority. If you configure Slack for a specific project, that configuration is used instead of the defaults. ## Routing Rules In Advanced mode, each rule has four parts: ### Triggers Choose which events fire the rule: | Trigger | When it fires | | --- | --- | | New comment | Someone submits feedback | | Reply | Someone replies to existing feedback | | Status update | A comment's status or priority changes | New rules default to **New comment** and **Reply** enabled. ### Conditions Filter which feedback matches the rule. No conditions means the rule matches everything. Multiple conditions use AND logic — all must match. | Field | Operators | Values | | --- | --- | --- | | Priority | is, is not | Low, Normal, High, Urgent | | Status | is, is not | To Do, In Progress, Review, Rework, On Hold, Blocked, Done, Cancelled, Won't Fix | | Commenter role | is, is not | Client, Team Lead, Workspace Admin | | Tagged user | includes | Any team member | | Page URL | is, contains, starts with | Text (e.g. /blog, /pricing) | ### Destination Each rule sends matching feedback to a specific Slack channel. ### Examples - **Client feedback to a dedicated channel**: Condition = "Commenter role is Client" → Channel: #client-feedback - **High priority alerts**: Condition = "Priority is High or Urgent" → Channel: #urgent - **Blog feedback separate**: Condition = "Page URL starts with /blog" → Channel: #content-team ## Message Format Slack notifications include: - Feedback message content - Who submitted it (name, email) - Link to the page where feedback was left - Screenshot thumbnail (if attached) - Status and priority Replies to feedback are posted as threaded messages under the original notification, keeping conversations organized. ## Enabling and Disabling The toggle in the integration header lets you pause notifications without disconnecting. Your channel selection and routing rules are preserved. - **Enabled**: Feedback posts to Slack as configured - **Disabled**: No messages are sent. Settings stay intact ## Troubleshooting ### Not Receiving Notifications? 1. **Check the toggle** — Make sure the integration is enabled (not just connected) 2. **Check the channel** — Verify the selected channel still exists 3. **Check bot access** — The SimpleCommenter bot must be invited to private channels 4. **Check routing rules** — In Advanced mode, at least one rule must be active with matching conditions 5. **Re-authorize** — Click Disconnect, then Add to Slack again ### Bot Not Posting to a Private Channel? Invite the SimpleCommenter bot to the channel first: ``` /invite @SimpleCommenter ``` ## Disconnecting 1. Go to **Integrations > Slack** 2. Click **Disconnect** 3. Optionally, remove the app from your Slack workspace settings Disconnecting stops all Slack notifications immediately. ## Next Steps - [Connect Trello for task management](https://www.simplecommenter.com/docs/integrations/trello) - [Sync feedback to GitHub Issues](https://www.simplecommenter.com/docs/integrations/github) - [Set up webhooks for custom integrations](https://www.simplecommenter.com/docs/integrations/webhooks) --- # Trello Integration Turn feedback into actionable Trello cards. When users submit feedback, a card is created in your chosen board with the details, screenshots, and attachments included. ## Setup ### Step 1: Connect Trello 1. Go to **Project Settings > Integrations > Trello** 2. Click **Connect to Trello** 3. Authorize SimpleCommenter in the popup 4. Click **Allow** to grant access ### Step 2: Choose a Routing Mode After connecting, pick how feedback reaches your Trello board. #### Simple Mode One board and one list for all feedback. Select a board from the dropdown, then pick a list. Good for small teams or projects where all feedback goes to the same place. #### Advanced Mode Create routing rules that send feedback to different boards and lists based on conditions. For example, route high-priority feedback to an "Urgent" board or client feedback to a separate list. See [Routing Rules](https://www.simplecommenter.com/docs/integrations/trello#routing-rules) below for the full list of options. New projects default to Simple mode. You can switch between modes at any time without losing your configuration. ### Step 3: Enable the Integration Use the toggle in the header to turn the integration on. You can disable it at any time to pause syncing without disconnecting or losing your settings. ## Where to Configure You can set up Trello in two places: ### Project Settings Go to **Project > Settings > Integrations > Trello** - Applies only to this specific project - Overrides any default settings ### Project Template Go to **Project template > Integrations > Trello** - Applies to all new projects automatically - Useful if you want every project to use the same Trello board Project-level settings always take priority. If you configure Trello for a specific project, that configuration is used instead of the defaults. ## Routing Rules In Advanced mode, each rule has four parts: ### Triggers Choose which events fire the rule: | Trigger | When it fires | | --- | --- | | New comment | Someone submits feedback | | Reply | Someone replies to existing feedback | | Status update | A comment's status or priority changes | New rules default to **New comment** and **Reply** enabled. ### Conditions Filter which feedback matches the rule. No conditions means the rule matches everything. Multiple conditions use AND logic — all must match. | Field | Operators | Values | | --- | --- | --- | | Priority | is, is not | Low, Normal, High, Urgent | | Status | is, is not | To Do, In Progress, Review, Rework, On Hold, Blocked, Done, Cancelled, Won't Fix | | Commenter role | is, is not | Client, Team Lead, Workspace Admin | | Tagged user | includes | Any team member | | Page URL | is, contains, starts with | Text (e.g. /blog, /pricing) | ### Destination Each rule sends matching feedback to a specific board and list. ### Examples - **Client feedback to a dedicated list**: Condition = "Commenter role is Client" → Board: Support, List: Client Feedback - **High priority to urgent board**: Condition = "Priority is High or Urgent" → Board: Engineering, List: Urgent - **Blog feedback separate**: Condition = "Page URL starts with /blog" → Board: Content, List: Feedback ## What Gets Synced ### New Feedback → Trello Card When someone submits feedback, a card is created with: **Card title:** ``` #123 | Button not working on checkout page ``` **Card description includes:** - The feedback message - Who submitted it (name, email) - Date and time - Page URL - Status and priority - Link back to the comment **Attachments:** - Screenshot (if captured) - Any files the user uploaded **Labels:** - Status label (e.g., "Status: To Do") - Priority label if not Normal (e.g., "Priority: High") ### Replies → Trello Comments When you reply to feedback in SimpleCommenter, a comment is added to the Trello card with the reply text and any attachments. ### Status & Priority Updates When you change status or priority: 1. A comment is added to the card showing the change 2. Labels are automatically updated (old label removed, new label added) ## Status Labels SimpleCommenter creates and manages labels automatically: Status: To Do Status: In Progress Status: Review Status: Rework Status: On Hold Status: Blocked Status: Done Status: Cancelled Status: Won't Fix ## Priority Labels Priority labels are added when priority is not "Normal": Priority: Low Priority: High Priority: Urgent Labels are created automatically on your board the first time they're needed. ## Enabling and Disabling The toggle in the integration header lets you pause syncing without disconnecting. Your board selection, list, and routing rules are preserved. - **Enabled**: Feedback syncs to Trello as configured - **Disabled**: No cards are created or updated. Settings stay intact ## Troubleshooting ### Cards Not Creating? 1. **Check the toggle** — Make sure the integration is enabled (not just connected) 2. **Check authorization** — Verify Trello shows as connected 3. **Verify board/list** — The selected board and list must still exist in Trello 4. **Check routing rules** — In Advanced mode, at least one rule must be active with matching conditions 5. **Re-authorize** — Click Disconnect, then Connect again to refresh ### Labels Not Appearing? - Check you have permission to create labels on the board - Try disconnecting and reconnecting ## Disconnecting 1. Go to **Project Settings > Integrations > Trello** 2. Click **Disconnect** 3. Confirm the disconnection Existing Trello cards are not deleted when you disconnect. They remain in your board. ## Next Steps - [Connect ClickUp for task management](https://www.simplecommenter.com/docs/integrations/clickup) - [Set up Slack notifications](https://www.simplecommenter.com/docs/integrations/slack) - [Sync feedback to GitHub Issues](https://www.simplecommenter.com/docs/integrations/github) - [Configure webhooks for custom workflows](https://www.simplecommenter.com/docs/integrations/webhooks) --- # Webhooks Webhooks let you connect SimpleCommenter with any external service. Send data out when events happen, or receive updates back to sync changes from other systems. ## Two Types of Webhooks SimpleCommenter supports two webhook directions: When events happen in SimpleCommenter (new comment, reply, status change), we send data to your URL. External systems can call our API to update comments in SimpleCommenter (add replies, change status/priority). --- ## Outbound Webhooks Send data to your servers when events occur in SimpleCommenter. ### Setup 1. Go to **Project Settings > Integrations** 2. Click **Webhook** 3. Click **New Webhook** 4. Configure your webhook: - **Name** - A friendly identifier - **Trigger Event** - When to fire the webhook - **URL** - Your endpoint - **Authentication** - Optional auth for your endpoint 5. Enable the webhook with the toggle 6. Click **Save** ### Trigger Events You can create separate webhooks for each event type: Fires when a visitor submits new feedback. Fires when someone replies to a comment. Fires when a comment's status or priority changes. ### Endpoint Requirements Your webhook endpoint must: - Accept `POST` or `PUT` requests (configurable) - Accept `application/json` content type - Return a `2xx` status code - Be publicly accessible (no localhost in production) --- ## Payload Reference All outbound webhooks send JSON. The `type` field tells you which event triggered the webhook. ### New Comment Payload ```json { "type": "comment", "commentId": "507f1f77bcf86cd799439011", "commentNumber": 42, "projectId": "my-site", "projectName": "My Site", "publicKey": "sc_abc123", "title": "Bug Report", "text": "The checkout button doesn't work on mobile", "textFormat": "markdown-lite", "status": "todo", "priority": "normal", "date": "2024-01-15T10:30:00.000Z", "by": "John Doe", "userData": { "name": "John Doe", "email": "john@example.com" }, "domain": "https://example.com", "slug": "/checkout", "link": "https://example.com#simple-comment=507f1f77bcf86cd799439011", "metadata": { "browser": "Chrome 120", "os": "iOS 17" }, "mentions": [], "attachedUsers": [], "attachments": [ { "type": "image", "url": "https://s3.amazonaws.com/...", "name": "Screenshot" }, { "type": "file", "url": "https://s3.amazonaws.com/...", "name": "error-log.txt" } ] } ``` Always `"comment"` for new comments. The same `type` is reused when the comment's [dev brief](https://www.simplecommenter.com/docs/dev-briefs) is written a few seconds later, with `event: "brief_ready"` and a `brief` object added (see below). Unique identifier for the comment. Human-readable comment number (e.g., #42). Your friendly project ID, if set. The project's display name. The project's public key (`sc_...`). Comment title if provided. The feedback message content. Always `"markdown-lite"`. `text` keeps its `**bold**`, `` `code` `` and `- ` bullet markers as written; see [Formatting](https://www.simplecommenter.com/docs/widget/formatting). The same field sits beside `replyText` on reply payloads. Current status: `todo`, `in_progress`, `review`, `rework`, `on_hold`, `blocked`, `done`, `cancelled`, `wont_fix`. Priority level: `low`, `normal`, `high`, `urgent`. ISO 8601 timestamp when submitted. Name or email of person who submitted. The submitter's details (name, email) when available. The website domain. Page path where feedback was submitted. Direct link to view the comment. Additional context (browser, OS, viewport). Includes `consoleErrors`, the JavaScript errors captured on the page before the comment was left: an array of `{ kind, message, source, line, col, at }` where `kind` is `console`, `uncaught` or `rejection` and `at` is milliseconds since page load. Absent when none were captured or the project turned capture off. See [Dev briefs](https://www.simplecommenter.com/docs/dev-briefs#console-errors). Users mentioned in the comment text. Users tagged on the comment (notified about it). Screenshots and uploaded files with presigned URLs. ### Brief Ready Payload Sent to the same **New Comment** webhook a few seconds after the comment, once its [dev brief](https://www.simplecommenter.com/docs/dev-briefs) has been written. Only comments that get a brief trigger it; update your copy by `commentId`. ```json { "type": "comment", "event": "brief_ready", "commentId": "507f1f77bcf86cd799439011", "commentNumber": 42, "projectId": "my-site", "projectName": "My Site", "publicKey": "sc_abc123", "title": "Bug Report", "text": "The checkout button doesn't work on mobile", "status": "todo", "priority": "normal", "date": "2024-01-15T10:30:00.000Z", "domain": "https://example.com", "slug": "/checkout", "link": "https://example.com#simple-comment=507f1f77bcf86cd799439011", "brief": { "status": "ready", "title": "Checkout button unresponsive on mobile", "summary": "The `button.checkout-submit` is covered by the sticky cart bar below 420px, so taps land on the bar.", "suggestedFix": "Add bottom padding to the checkout form equal to the bar height, or lower the bar's z-index.", "kind": "behavior", "confidence": "medium", "generatedAt": "2024-01-15T10:30:09.000Z" } } ``` Always `"brief_ready"` for this payload. Absent on the initial comment payload. `status`, `title`, `summary`, optional `suggestedFix`, `kind` (`layout` | `copy` | `link` | `visual` | `behavior` | `other`), `confidence` (`low` | `medium` | `high`), `generatedAt`, and `editedBy` / `editedAt` when a person changed it. ### Reply Payload ```json { "type": "reply", "commentId": "507f1f77bcf86cd799439011", "commentNumber": 42, "replyText": "Thanks for reporting! We're looking into this.", "date": "2024-01-15T11:00:00.000Z", "by": "Support Team", "domain": "https://example.com", "slug": "/checkout", "link": "https://example.com#simple-comment=507f1f77bcf86cd799439011", "metadata": {}, "attachments": [] } ``` Always `"reply"` for replies. The reply message content. Name of the person who replied. ### Status Update Payload ```json { "type": "status_update", "commentId": "507f1f77bcf86cd799439011", "commentNumber": 42, "status": "in_progress", "priority": "high", "previousStatus": "todo", "previousPriority": "normal", "updatedFields": ["status", "priority"], "date": "2024-01-15T11:30:00.000Z", "by": "Jane Smith", "domain": "https://example.com", "slug": "/checkout", "link": "https://example.com#simple-comment=507f1f77bcf86cd799439011" } ``` Always `"status_update"` for status/priority changes. New status value. New priority value. Status before the change. Priority before the change. Which fields changed: `["status"]`, `["priority"]`, or `["status", "priority"]`. --- ## Authentication ### Outbound Authentication Protect your endpoint by requiring authentication. SimpleCommenter supports: No authentication header sent. Sends `Authorization: Bearer your-token`. For endpoints that strip the `Authorization` header, the same token is also sent as `X-Webhook-Token`. Sends `Authorization: Basic base64(username:password)`. The same value is also sent as `X-Webhook-Auth`. --- ## Inbound Webhooks (Two-Way Sync) Allow external systems to update SimpleCommenter by calling our API. ### Generate an Integration Token 1. Go to **Project Settings > Integrations > Webhook** 2. In the **Inbound Actions** section, select which actions to allow: - **Reply to comments** - Add replies from external systems - **Update status/priority** - Change comment status or priority - **Delete comments** - Archive comments from external systems 3. Click **Generate Token** 4. Copy the token immediately (it won't be shown again) Store your integration token securely. Anyone with this token can perform the allowed actions on your comments. ### API Endpoint ``` POST https://www.simplecommenter.com/api/integrations/action ``` ### Request Format ```json { "token": "your-integration-token", "action": "reply", "payload": { "commentId": "507f1f77bcf86cd799439011", "text": "This has been fixed in version 2.1", "name": "Bot", "email": "bot@example.com" } } ``` If your token is scoped to a single project, the domain is inferred automatically. If it is an account-level token (not tied to one project), you must also include a `domain` field in the `payload` (the project's website URL), or the request returns `400 Domain is required for user-level tokens`. ### Available Actions #### Reply Action Add a reply to a comment from an external system. ```json { "token": "your-integration-token", "action": "reply", "payload": { "commentId": "507f1f77bcf86cd799439011", "text": "Thanks for your feedback!", "name": "Support Bot", "email": "support@example.com" } } ``` The ID of the comment to reply to. The reply message. Display name for the reply author. Email for the reply author. #### Status Update Action Change a comment's status or priority. ```json { "token": "your-integration-token", "action": "status_update", "payload": { "commentId": "507f1f77bcf86cd799439011", "status": "done", "priority": "high" } } ``` The ID of the comment to update. New status. Must be one of: `todo`, `in_progress`, `review`, `rework`, `on_hold`, `blocked`, `done`, `cancelled`, `wont_fix`. New priority. Must be one of: `low`, `normal`, `high`, `urgent`. At least one of `status` or `priority` is required for status_update action. #### Delete Action Archive a comment from an external system. Comments are soft-deleted (archived), not permanently removed. ```json { "token": "your-integration-token", "action": "delete", "payload": { "commentId": "507f1f77bcf86cd799439011" } } ``` The ID of the comment to archive. The `delete` action must be allowed by your integration token's scope, the same way `reply` and `status_update` are. ### Response Format #### Success Response ```json { "success": true, "message": "Integration action completed successfully", "result": { "_id": "507f1f77bcf86cd799439011", "oldStatus": "todo", "newStatus": "done" } } ``` #### Error Responses **Invalid Token (403)** ```json { "error": "Invalid token" } ``` **Action Not Allowed (403)** ```json { "error": "Action not allowed" } ``` **Comment Not Found (500)** ```json { "error": "Comment with ID xyz not found" } ``` **Invalid Status (500)** ```json { "error": "Invalid status: invalid. Must be one of: todo, in_progress, ..." } ``` --- ## Example: Node.js Webhook Handler ```javascript const express = require("express"); const app = express(); app.use(express.json()); app.post("/webhook", (req, res) => { const { type, commentId, commentNumber } = req.body; switch (type) { case "comment": console.log(`New comment #${commentNumber}: ${req.body.text}`); // Create ticket in your system, send to Slack, etc. break; case "reply": console.log(`Reply to #${commentNumber}: ${req.body.replyText}`); break; case "status_update": console.log( `#${commentNumber} status: ${req.body.previousStatus} → ${req.body.status}`, ); break; } res.status(200).json({ received: true }); }); app.listen(3000); ``` ## Example: Calling Inbound API ```javascript const response = await fetch( "https://simplecommenter.com/api/integrations/action", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ token: process.env.SIMPLECOMMENTER_TOKEN, action: "status_update", payload: { commentId: "507f1f77bcf86cd799439011", status: "done", }, }), }, ); const result = await response.json(); console.log(result.success ? "Updated!" : result.error); ``` --- ## Use Cases ### Sync with Project Management Tools When a new comment comes in, create a task in your project management tool. When the task is completed there, call the inbound API to update the status in SimpleCommenter. ### Custom Notifications Send new comments to Discord, Slack, or email using your own formatting and routing logic. ### Analytics & Reporting Forward all webhook events to your data warehouse to build custom dashboards and reports. ### Automated Responses Use the inbound API to automatically reply to comments that match certain criteria (e.g., auto-acknowledge bug reports). --- ## Next Steps - [Trello Integration](https://www.simplecommenter.com/docs/integrations/trello) - Push feedback, replies, and status updates into Trello - [Slack Integration](https://www.simplecommenter.com/docs/integrations/slack) - Real-time team notifications --- # Identity Verification When your page says "this visitor is jane@acme.com", Simple Commenter needs proof that the claim came from you and not from someone typing in the browser console. The proof is `userHash`: an HMAC signature of the user's identity, computed with a secret only your backend knows. This is the same pattern used by Intercom and similar embedded products. If you have set up identity verification anywhere before, this will look familiar. ## The contract - With an `externalId`: `userHash = HMAC_SHA256(secret, externalId + ":" + email)` - Without one: `userHash = HMAC_SHA256(secret, email)` Hex-encoded, lowercase. The strings must exactly match what the page sends, including case: sign the same values you put in the `user` object. **The signature covers the email on purpose.** A signature over only a user id would let anyone who obtained one valid pair claim any email address they like. Simple Commenter rejects hashes that do not bind the email. ## Where the secret lives **Project settings, Developers.** Each project has its own secret. Store it like any other API credential: environment variable or secrets manager, never in client-side code, never in your repository. ## Backend examples ### Node.js ```js const crypto = require("crypto"); const userHash = crypto .createHmac("sha256", process.env.SC_PROJECT_SECRET) .update(`${user.id}:${user.email}`) .digest("hex"); ``` ### PHP ```php $userHash = hash_hmac( 'sha256', $user->id . ':' . $user->email, getenv('SC_PROJECT_SECRET') ); ``` ### Python ```python import hashlib, hmac, os user_hash = hmac.new( os.environ["SC_PROJECT_SECRET"].encode(), f"{user.id}:{user.email}".encode(), hashlib.sha256, ).hexdigest() ``` ### Ruby ```ruby require "openssl" user_hash = OpenSSL::HMAC.hexdigest( "sha256", ENV["SC_PROJECT_SECRET"], "#{user.id}:#{user.email}" ) ``` Render the result into your page (a template variable, a JSON endpoint your SPA calls after login, a meta tag: anything works) and pass it as `userHash`. ## What happens on our side A verified identify creates or reuses a client on your project, visible in **Project settings, Clients** with the channel "JS API". If the email matches one of your workspace members or the account owner, they keep their real role instead. When an `externalId` is present, it is the stable key: if that user later changes their email in your app, the same client record follows them. ## Rotating the secret Rotate from the Developers page. The old secret keeps verifying for 24 hours so you can deploy the new one without logging anyone out mid-session. Users already identified stay logged in through a rotation either way; rotation only affects new identify calls. ## Testing without a backend (unverified mode) For local development you can flip on **Allow unverified identities** on the Developers page. The widget then accepts `user` without a `userHash`. **Warning:** Unverified mode means anyone can claim any email on that project. Use it on staging projects only, and turn it off before real users touch the site. ## Troubleshooting | Symptom | Likely cause | | --- | --- | | 401 from `/api/js/identify` | Hash mismatch: wrong secret, wrong field order, or email case differs between hash and `user` object | | 403 "JS API not enabled" | Enable it on the Developers page for this project | | 403 "pending approval" | The client exists but is not approved; approve them under Clients | | Works locally, fails in production | Different project (and secret) per environment; check which public key the script tag uses | | Widget never appears | The project is login-protected and no `boot`/identify happened, or the account is on the free plan | --- # JS API The JS API lets your application control Simple Commenter directly. The two things most teams use it for: 1. **Log your users in automatically.** If someone is already signed into your product, they should never see a Simple Commenter login. Your backend vouches for them with a signed hash, and the widget treats them as logged in. 2. **Decide who sees the widget.** Keep the widget invisible for everyone, then enable it from your own code for exactly the accounts that should give feedback: a beta cohort, a specific customer, an internal flag. ## The 60-second version Enable the JS API under **Project settings, Developers**, copy your secret, and add this to your page: ```html ``` The hash is one line on your backend: ```js // Node.js const crypto = require("crypto"); const userHash = crypto .createHmac("sha256", process.env.SC_PROJECT_SECRET) .update(`${user.id}:${user.email}`) // or just user.email if you skip externalId .digest("hex"); ``` That is the whole integration. The visitor is now a recognized commenter: no magic link, no login popup, comments attributed to their name. **Important:** The hash must be computed on your server. Never put your project secret in frontend code, and never compute the hash in the browser. See [Identity verification](https://www.simplecommenter.com/docs/js-api/identity-verification) for why this matters and for examples in other languages. ## Calling the widget at any time Everything the settings object does is also available as a function call, which is what you want in a SPA or when the decision happens after page load: ```js SimpleCommenter("boot", { user: { email: "jane@acme.com", name: "Jane Cooper", externalId: "usr_123" }, userHash: hashFromYourBackend, }); ``` `SimpleCommenter(...)` is safe to call before the script has loaded. Calls are queued and run in order once it arrives. There is nothing to await and no race condition to think about. ## When to use it | Situation | Use | | --- | --- | | Your users are already logged into your product | JS API with identity verification | | You want feedback from a subset of accounts only | Login-required visibility + JS API, see [SaaS setup](https://www.simplecommenter.com/docs/js-api/saas-setup) | | External clients review a site, no account system | Regular [magic link login](https://www.simplecommenter.com/docs/dashboard/access), no JS API needed | | WordPress site | The [WordPress plugin](https://www.simplecommenter.com/docs/installation/wordpress) does this for you already | | Provisioning users from your backend, server-to-server | The [REST API](https://www.simplecommenter.com/docs/rest-api), which composes with everything here | ## Next steps - [API reference](https://www.simplecommenter.com/docs/js-api/reference): every command and event - [Identity verification](https://www.simplecommenter.com/docs/js-api/identity-verification): the hash contract, all languages - [SaaS setup guide](https://www.simplecommenter.com/docs/js-api/saas-setup): the "enable feedback for this account" recipe --- # JS API Reference All interaction goes through one global function: ```js SimpleCommenter("command", ...args); ``` The function exists as soon as our loader script runs, and calls made even earlier are queued automatically. You never need to wait for a ready state before calling anything. ## The settings object `window.simpleCommenterSettings` is read once when the widget starts. Setting it before the script tag is equivalent to calling `boot` with the same values. ```js window.simpleCommenterSettings = { user: { email: "jane@acme.com", // required for identification name: "Jane Cooper", // shown on comments externalId: "usr_123", // optional, your stable user id }, userHash: "...", // required unless unverified mode is on }; ``` ## Commands ### boot Starts the widget and identifies the user in one call. This is the main entry point, and it is idempotent: booting with the same user twice does nothing. ```js SimpleCommenter("boot", { user: { email, name, externalId }, userHash }); ``` On a login-protected project, `boot` is also what makes the widget appear at all: without it (or another activation, like a magic link), visitors get nothing, not even a script download. ### identify Identifies or switches the user without touching visibility. Booting with user A and later identifying user B switches the session to B. ```js SimpleCommenter("identify", { user: { email, name, externalId }, userHash }); ``` ### update Updates attributes of the current user, for example after they change their display name in your app. Requires a hash covering the new values. ```js SimpleCommenter("update", { user: { email: "jane@acme.com", name: "Jane C." }, userHash: "...", }); ``` ### show / hide Controls widget visibility for this visitor. Both persist across pageviews in this browser until the opposite call is made, so calling `hide` once in your "feedback off" code path is enough. ```js SimpleCommenter("show"); SimpleCommenter("hide"); ``` ### mode Sets the widget mode directly: `"view"` (see comments), `"active"` (leave comments), `"disabled"` (hidden). ```js SimpleCommenter("mode", "active"); ``` ### open / close Opens or closes the comment drawer, for example from your own "Give feedback" button: ```js document .querySelector("#feedback-btn") .addEventListener("click", () => SimpleCommenter("open")); ``` ### on / off Subscribe to widget events. Unsubscribe with `off` and the same function reference. ```js function onComment(payload) { analytics.track("feedback_left", payload); } SimpleCommenter("on", "comment:created", onComment); SimpleCommenter("off", "comment:created", onComment); ``` ### logout Ends the widget session for the current user. The widget stays on the page in its anonymous state (which on a login-protected project means it disappears). ```js SimpleCommenter("logout"); ``` ### shutdown Logs out and removes the widget from the page entirely. Call this when the user logs out of your app, so the next person on a shared machine cannot comment as them. ```js SimpleCommenter("shutdown"); ``` ## Events | Event | Fires when | Payload | | --- | --- | --- | | `ready` | The widget finished initializing | `{}` | | `identified` | A user was successfully identified | `{ email, name, role }` | | `opened` | The comment drawer opened | `{}` | | `closed` | The comment drawer closed | `{}` | | `mode:changed` | The mode changed (by the user or by API) | `{ mode }` | | `comment:created` | The current user posted a comment | `{ commentNumber, slug }` | Payloads only ever describe the current visitor's own actions. Errors thrown inside your listeners are caught and logged; they cannot break the widget. ## SPA notes - The script tag loads once; you do not need to re-add it on route changes. - Call `boot` after your auth state resolves. Calling it in a React `useEffect`, a Vue `onMounted`, or after your login redirect all work. - On logout in your app, call `SimpleCommenter("shutdown")`. Server-side rendering: the settings object and script tag are plain HTML and work in any SSR framework. `SimpleCommenter(...)` calls belong in browser-only code paths, same as any other window API. --- # SaaS Setup The recipe this page builds: the widget is installed on your whole app, is invisible to everyone by default, and your own code decides, per user, who gets it. "This account should see feedback, enable it for them" becomes one `if` statement in your codebase. ## 1. Protect the project In **Project settings, Access**, set widget visibility to require login. From this point, anonymous visitors never load the widget: not the UI, not even the script. Your other users notice nothing. ## 2. Enable the JS API In **Project settings, Developers**: enable the JS API and copy the project secret into your backend environment as `SC_PROJECT_SECRET`. ## 3. Compute the hash at login Wherever you build the signed-in page context (session endpoint, template globals, JWT claims), add the hash: ```js // Node/Express example: whatever you already use to expose session data app.get("/api/session", (req, res) => { const user = req.user; res.json({ // ...your existing session fields scUserHash: crypto .createHmac("sha256", process.env.SC_PROJECT_SECRET) .update(`${user.id}:${user.email}`) .digest("hex"), }); }); ``` ## 4. Boot for the users you choose ```js // After your auth state resolves: if (session.plan === "enterprise" || session.flags.includes("feedback")) { SimpleCommenter("boot", { user: { email: session.email, name: session.name, externalId: session.userId, }, userHash: session.scUserHash, }); } ``` The condition is yours: a feature flag, a plan check, an admin toggle, a beta cohort table. Simple Commenter does not need to know why; a user you boot can comment, a user you do not boot has no widget at all. ## 5. Clean up on logout ```js function onAppLogout() { SimpleCommenter("shutdown"); } ``` ## Optional touches - **Your own feedback button:** hide the floating pill via widget settings and call `SimpleCommenter("open")` from a button in your product UI. - **Track engagement:** `SimpleCommenter("on", "comment:created", ...)` into your analytics, so you can see which accounts actually use it. - **Roles:** teammates whose email matches a workspace member automatically get their member role, so your own team sees internal statuses while customers see the reduced client view. See [Clients](https://www.simplecommenter.com/docs/dashboard/clients). - **Pre-provisioning:** if you would rather create clients ahead of time from your backend (or sync your whole user base), use the [REST API](https://www.simplecommenter.com/docs/rest-api/members-and-clients). With the JS API alone, a verified identify creates the client automatically on first sight. Feedback from these users lands in the same place as everything else: the dashboard, the board, your Slack/Trello integrations, and the MCP server your AI agent uses. Nothing else about your setup changes. --- # MDX Components Guide This guide covers all the MDX components and features available for writing documentation. ## I swear to never use emojies. ## Basic Markdown All standard Markdown syntax works: ### Headings ```markdown # H1 Heading ## H2 Heading (auto-generates anchor links) ### H3 Heading #### H4 Heading ``` ### Text Formatting **Bold text** with `**bold**` _Italic text_ with `*italic*` `Inline code` with backticks ### Links Links automatically use Next.js Link component for fast navigation: ```markdown [Link text](/docs/quick-start) [External link](https://example.com) ``` ### Lists Unordered lists: - Item one - Item two - Item three Ordered lists: 1. First item 2. Second item 3. Third item ### Blockquotes > This is a blockquote. Use it for important quotes or callouts. --- ## Code Blocks Code blocks have syntax highlighting powered by Prism.js: ```javascript // JavaScript example const greeting = "Hello, World!"; console.log(greeting); ``` ```python # Python example def hello(): print("Hello, World!") ``` ```jsx // React/JSX example export function MyComponent() { return
Hello!
; } ``` Supported languages include: `javascript`, `typescript`, `python`, `jsx`, `tsx`, `css`, `html`, `json`, `bash`, `markdown`, and more. --- ## Custom Components ### Note Use `Note` for important information (styled with green): ```jsx This is important information that users should pay attention to. ``` This is important information that users should pay attention to. ### Button Buttons for calls-to-action: ```jsx ``` Get Started Button variants: - `primary` - Blue filled button (default) - `secondary` - Gray filled button - `filled` - Same as primary - `outline` - Outlined button - `text` - Text-only link style Add arrows with `arrow="left"` or `arrow="right"`. ### Row and Col Create two-column layouts: ```jsx Left column content here. Right column content here. ``` **Left Column** This is the left side of a two-column layout. Great for showing examples alongside explanations. **Right Column** This is the right side. Use `sticky` prop to make content stick while scrolling. ### Properties Document API properties or configuration options: ```jsx Your API key for authentication. The domain where the widget is installed. Color theme for the widget. ``` Your API key for authentication. Found in your dashboard settings. The domain where the widget is installed. Color theme for the widget. Defaults to `'light'`. ### CardGrid and Card Create grid layouts of clickable cards for navigation or feature showcases: ```jsx ``` #### With Icons (no links) Cards without `href` become static display cards - great for feature lists: ```jsx ``` #### Props Number of columns on larger screens. Defaults to `2`. Optional. Link destination. Without it, card is static. Card heading. Shows arrow (→) when card is a link. Card description text. Optional. Emoji or text icon displayed above the title. --- ## Page Structure ### Metadata Every MDX page should export metadata at the top: ```jsx export const metadata = { title: "Page Title", description: "Page description for SEO.", }; ``` ### Headings with Anchors All `## H2` headings automatically get anchor links. Users can click the link icon to copy the URL to that section. --- ## Tips 1. **Keep paragraphs short** - Documentation is easier to scan with shorter paragraphs. 2. **Use code examples** - Show don't tell. Code examples are clearer than descriptions. 3. **Use Notes sparingly** - Too many highlighted boxes reduce their impact. 4. **Link between pages** - Help users navigate to related content. 5. **Test on mobile** - Documentation should be readable on all devices. --- # Simple Commenter Documentation Learn how to integrate Simple Commenter into your website and start collecting valuable feedback from your users in minutes. --- ## What is Simple Commenter? Simple Commenter is a feedback widget that you can embed on any website. It allows your users, clients, and team members to leave comments and feedback directly on your pages. ### For Website Owners - Collect feedback without disrupting user experience - See exactly which page and URL users are commenting on - Control who can see the widget (public, token-only, or login required) - Organize feedback with statuses and board view - Get notified via email, Slack, or Trello ### For Your Users - Leave feedback in seconds without leaving your site - Attach screenshots and files to comments - Login with email or magic link for tracked feedback - View and reply to existing comments - Simple, non-intrusive interface --- ## Key Features --- ## Platform Installation Guides Find step-by-step guides for your platform: ### No-Code Platforms ### Code / Frameworks --- ## Getting Started Ready to add Simple Commenter to your website? Start the Quick Start Guide **Already have an account?** Jump straight to the [General Installation](https://www.simplecommenter.com/docs/installation) guide to add Simple Commenter to a new site. --- ## Getting Help If you need assistance or have questions: - [Contact Support](https://www.simplecommenter.com/support) — Get help from our team - [Webhooks Guide](https://www.simplecommenter.com/docs/integrations/webhooks) — Set up custom integrations --- # Quick Start Get Simple Commenter up and running on your website in under 5 minutes. This guide walks you through creating an account, setting up your project, choosing access settings, and installing the widget. ## What You'll Need Before you begin, make sure you have: - Access to your website's HTML or CMS - Your website domain (e.g., `example.com`) Don't have an account yet? Create Free Account **Time to complete:** ~5 minutes **Difficulty:** Beginner No coding experience required! --- ## Step 1: Create an Account 1. Go to the [registration page](https://www.simplecommenter.com/account/register) 2. Enter your **email address** and **company/project name** 3. Choose your login method: - **Magic Link** (recommended) — We'll email you a login link - **Password** — Create a password for your account 4. Check your email and click the link to sign in You can also sign up with **Google** for quick access. --- ## Step 2: Add Your Domain After signing in, you'll be guided through the onboarding process. ### Project Setup 1. Enter a **Project Name** (e.g., "My Website" or "Client Preview Site") 2. Enter your **Domain** (e.g., `example.com` — without `https://`) The project name is for your reference in the dashboard. The domain tells the widget which project to connect to. ### Choose Widget Access Mode Select who can see and use the feedback widget on your website: | Mode | Description | Best For | | --- | --- | --- | | Visible to all visitors | Everyone who visits your site can see and use the widget | Preview sites, internal tools, staging environments | | Visible only with token link | Widget only loads when ?feedback=true is in the URL | Live production sites where you want to show the widget only to specific people | | Visible to all, requires login | Anyone can see the widget, but must log in to leave feedback | Sites where you want to identify commenters | | Token link + requires login | Widget requires both the URL parameter AND login to use | Maximum control over who can provide feedback | **Using token mode?** Share links like `https://yoursite.com?feedback=true` with people who should see the widget. Others won't see it at all. The older `?simple-commenter=true` parameter still works too, so existing links keep functioning. The widget then stays visible across the whole site until you turn it off with `?feedback=false` or the **Exit** button in the widget's Profile tab. --- ## Step 3: Install the Widget Copy the script snippet from your dashboard and add it to your website. ### Default Script ```html ``` Add this to the `` or before `` on every page where you want the widget. ### Script Loading Modes If the default doesn't work with your platform, try a different loading mode. You can switch modes in your project dashboard. | Mode | When to Use | | --- | --- | | Query Parameter (default) | Works with most websites | | Data Attribute | Google Tag Manager, WordPress plugins | | Function Call | Platforms with strict script restrictions | | Next.js Component | Next.js projects | See [General Installation](https://www.simplecommenter.com/docs/installation) for detailed code examples of each mode. ### Platform Guides For step-by-step instructions for your specific platform: --- ## Step 4: Test the Widget Once the script is installed: 1. Visit your website (clear cache if needed) 2. If using **token mode**, add `?feedback=true` to the URL 3. Look for the feedback button (default: bottom-right corner) 4. Click to open the widget and submit a test comment **Widget not appearing?** Check that: - The domain in your script matches your dashboard exactly - You're on the live site (not localhost, unless that's your registered domain) - If using token mode, the `?feedback=true` parameter is in the URL --- ## Step 5: View Your Feedback Head to your [dashboard](https://www.simplecommenter.com/app) to see incoming comments. ### What You Can Do - **View all comments** organized by page URL - **Filter and sort** by status, date, or commenter - **Reply** to comments directly from the dashboard - **Update status** (To Do, In Progress, Done, etc.) - **Switch to Board view** for Kanban-style organization - **Set up notifications** via email, Slack, or Trello Open Dashboard --- ## Alternative: Asset Commenting (No Code Required) Don't have a website yet? Or want to collect feedback on design files without installing anything? Use **Asset Commenting** to upload images and PDFs directly to your dashboard, share a link with clients, and collect visual feedback — no code installation needed. You can also explore dedicated pages for [Creative Asset Feedback](https://www.simplecommenter.com/creative-asset-feedback), [Image Feedback](https://www.simplecommenter.com/image-feedback), and [PDF Feedback](https://www.simplecommenter.com/pdf-feedback). --- ## Next Steps Now that you have the basics set up, explore these features: --- ## Troubleshooting Having issues? Here are solutions to common problems: Check that the domain in your script matches your dashboard exactly (including or excluding `www`). Open browser DevTools (F12) and check the Console for errors. If you have login required, you need to sign in first. Check your access settings in the dashboard. Make sure your project is active. Check that the domain matches and you're not exceeding plan limits. Try a different loading mode. Some platforms work better with the data-attribute or function-call method. Still stuck? [Contact our support team](https://www.simplecommenter.com/support) and we'll help you get set up. **Congratulations!** You've successfully set up Simple Commenter on your website. Your users can now leave feedback, and you'll see it all in your dashboard. --- # Members & Clients Provision the people on your account from your own backend. All requests need the `X-Integration-Token` header, see the [overview](https://www.simplecommenter.com/docs/rest-api) for authentication and base URL. Roles in one line: **members** are your team (they manage feedback), and **clients** are external reviewers (they leave feedback on projects they are invited to). Details in [Clients](https://www.simplecommenter.com/docs/dashboard/clients). ## Members ### List members ```bash curl -H "X-Integration-Token: $TOKEN" \ "https://www.simplecommenter.com/api/external/members" ``` Returns `{ members: [...] }` including the account owner. Add `?domainId=sc_xxx` and each member also gets an `assigned` flag for that project. ### Add a member ```bash curl -X POST -H "X-Integration-Token: $TOKEN" \ -H "Content-Type: application/json" \ -d '{"email": "dev@acme.com", "name": "Dev", "role": "team", "domainId": "sc_xxx"}' \ "https://www.simplecommenter.com/api/external/members" ``` `role` is `"user"` (workspace admin) or `"team"` (team lead). `domainId` is optional: when present, the new member is assigned to that project right away. New members log in via magic link, no password needed. ### Company login and API provisioning `POST /api/external/members` creates the same workspace membership used by [Company login (SSO)](https://www.simplecommenter.com/docs/dashboard/company-login). It creates one member per request; your backend can send a request for each employee to onboard a team of 100 without entering them manually. The token needs the `write` action. There is no bulk-array request format or SSO-approval parameter. 1. Create each member with the email their company identity provider supplies. Use `role: "team"` unless they need workspace-admin permissions, and set their project assignments intentionally. 2. The workspace owner opens **Workspace settings → Company login**, refreshes the page, and approves the new members under **Approve and test**. 3. Share the workspace's company-login link. Approved members can authenticate with the identity provider without a separate registration or Simple Commenter password, once the SSO connection is active. On first login, the signed provider email is matched to an approved member in that workspace. Later logins use the linked provider identity. Creating a member does not automatically approve SSO, sign them in, create a paid subscription, or merge accounts in other workspaces. An unknown or unapproved person is refused access; automatic membership creation on first login and SCIM directory synchronization are not implemented. Requiring SSO currently blocks integration tokens, including this member API's create, list, assignment, and removal operations. Keep SSO optional if you depend on API provisioning. Under required SSO, the owner must manage members in the dashboard after signing in with SSO. For repeat runs, list existing members first and skip emails already present. A duplicate member email returns `400`; creation is not an idempotent upsert. If a request times out, check whether the member was created before retrying. When no `domainId` is supplied, project assignment follows the workspace's default for new members, which may grant access to every project. ### Assign or unassign a member on a project ```bash curl -X PUT -H "X-Integration-Token: $TOKEN" \ -H "Content-Type: application/json" \ -d '{"memberId": "MEMBER_ID", "domainId": "sc_xxx", "assigned": true}' \ "https://www.simplecommenter.com/api/external/members" ``` ### Remove a member ```bash curl -X DELETE -H "X-Integration-Token: $TOKEN" \ "https://www.simplecommenter.com/api/external/members?memberId=MEMBER_ID" ``` ## Clients ### List clients on a project ```bash curl -H "X-Integration-Token: $TOKEN" \ "https://www.simplecommenter.com/api/external/clients?domainId=sc_xxx" ``` ### Create or sync a client ```bash curl -X POST -H "X-Integration-Token: $TOKEN" \ -H "Content-Type: application/json" \ -d '{"domainId": "sc_xxx", "email": "jane@customer.com", "name": "Jane", "autoApprove": true}' \ "https://www.simplecommenter.com/api/external/clients" ``` Idempotent: if the email already exists on the project, the existing client is returned (and the name updated if it changed). ### Approve or revoke a client ```bash curl -X PUT -H "X-Integration-Token: $TOKEN" \ -H "Content-Type: application/json" \ -d '{"domainId": "sc_xxx", "email": "jane@customer.com", "approved": true}' \ "https://www.simplecommenter.com/api/external/clients" ``` ### Remove a client ```bash curl -X DELETE -H "X-Integration-Token: $TOKEN" \ "https://www.simplecommenter.com/api/external/clients?domainId=sc_xxx&email=jane@customer.com" ``` ## Client login tokens Mint a widget login token for an approved client, valid 30 days. This is the primitive the WordPress plugin uses for auto-login; with the [JS API](https://www.simplecommenter.com/docs/js-api) you normally do not need it, since a verified identify mints the token for you. ```bash curl -X POST -H "X-Integration-Token: $TOKEN" \ -H "Content-Type: application/json" \ -d '{"domainId": "sc_xxx", "email": "jane@customer.com"}' \ "https://www.simplecommenter.com/api/external/client-token" ``` Returns `{ token, email, name }`. Store the token in the visitor's browser under the `simpleCommenterUserData` localStorage key before the widget loads, or pass it via the `?simple-commenter-token=` URL parameter. Prefer the [JS API](https://www.simplecommenter.com/docs/js-api) for browser login flows: it handles token storage, expiry, and re-identification for you, and creates clients on demand. Use `/client-token` only when you need full control over token delivery. --- # REST API The REST API gives your backend direct access to your Simple Commenter account: provision team members and clients, read and update feedback, and mint client login tokens. It is the server-to-server counterpart to the [JS API](https://www.simplecommenter.com/docs/js-api), which runs in the browser. ## Authentication Every request carries an integration token in the `X-Integration-Token` header: ```bash curl -H "X-Integration-Token: YOUR_TOKEN" \ "https://www.simplecommenter.com/api/external/domains" ``` The workspace owner can generate a token in **Project → MCP → Local API tokens**, [open MCP settings directly](https://www.simplecommenter.com/app/account/ai-agent), or use **Project settings → Developers → REST API**. Tokens carry scoped actions (`read`, `write`, `settings`); tokens generated from the dashboard have all three and access the whole account. Copy a new token when it is shown, and revoke it in settings when it is no longer needed. For a ChatGPT or Claude remote connection, use the [hosted MCP setup](https://www.simplecommenter.com/docs/integrations/ai-agent) with OAuth and `https://www.simplecommenter.com/api/mcp`. The REST API base URL below is not a remote MCP address. Hosted OAuth can restrict projects and actions without using a local integration token. Treat the token like a password: it grants access to your whole account. Store it in an environment variable or secrets manager, never in client-side code. ### Company login and API access When a workspace requires SSO, integration tokens are currently blocked, including member creation and removal. Keep SSO optional if your workflow depends on the REST API. Creating a member through this API does not approve them for SSO or create an SSO session. See [Company login and API provisioning](https://www.simplecommenter.com/docs/rest-api/members-and-clients#company-login-and-api-provisioning) for the supported onboarding flow. ## Base URL ``` https://www.simplecommenter.com/api/external ``` All endpoints accept and return JSON unless noted. Errors come back as `{ "error": "message" }` with a matching HTTP status. ## Endpoints | Area | Endpoint | Documented | | --- | --- | --- | | Members | `/members` | [Members & Clients](https://www.simplecommenter.com/docs/rest-api/members-and-clients) | | Clients | `/clients` | [Members & Clients](https://www.simplecommenter.com/docs/rest-api/members-and-clients) | | Client login tokens | `/client-token` | [Members & Clients](https://www.simplecommenter.com/docs/rest-api/members-and-clients) | | Projects | `/domains`, `/domains/{domainId}/settings` | Reference on request | | Comments | `/comments`, `/comments/{commentId}`, `/comments/reply`, `/comments/update`, `/comments/create` | Feedback operations | | Account | `/account` | Reference on request | | MCP operations | `POST /mcp` | Token-authenticated operation adapter used by the local [MCP server](https://www.simplecommenter.com/docs/integrations/ai-agent#tool-reference) | Addressing projects: endpoints that take a `domainId` accept the project's public key (`sc_...`), its project ID, or the domain name. Comments returned by `/comments` and `/comments/{commentId}` carry a `brief` object once a [dev brief](https://www.simplecommenter.com/docs/dev-briefs) has been written (`null` before that). It holds `status`, `title`, `summary`, optional `suggestedFix`, `kind`, `confidence`, and `generatedAt`. `metadata.consoleErrorCount` is always present on `/comments` items. The list itself, `metadata.consoleErrors`, comes with `include=metadata_full` on `/comments` and always on `/comments/{commentId}`: the JavaScript errors captured on the page before the comment, each `{ kind, message, source, line, col, at }`. See [Console errors](https://www.simplecommenter.com/docs/dev-briefs#console-errors). Comment and reply `text` is Markdown Lite (`**bold**`, `` `code` ``, `- ` bullet lines) returned as written, with `textFormat: "markdown-lite"` beside it; see [Formatting](https://www.simplecommenter.com/docs/widget/formatting). ## Rate limits Rate limits depend on the endpoint. `POST /api/external/mcp` permits 120 requests per minute per integration token. Hosted OAuth MCP has a separate 120-request-per-minute limit per connection. When an endpoint returns `429`, respect its `Retry-After` header when supplied and retry with backoff. These MCP limits are not a shared plan-based API allowance. ## When to use which API - **REST API**: your server manages the account. Sync your user base as clients, add a member when someone joins your team, pull feedback into your own tooling. - **[MCP](https://www.simplecommenter.com/docs/integrations/ai-agent)**: an external AI client discovers tools for feedback, exports, reports, and permitted project or team administration. - **[JS API](https://www.simplecommenter.com/docs/js-api)**: the browser logs a visitor in and controls the widget. For most SaaS setups the JS API alone is enough, because a verified identify creates the client automatically on first sight. --- # Product Roadmap See what we're building next. This roadmap reflects our current priorities and may evolve based on customer feedback. Have a feature request? [Contact support](https://www.simplecommenter.com/support) or share your ideas with us. --- ## Recently Completed Chat with your feedback right in the dashboard. Ask questions, get reports, and update statuses or reply with confirmation. Add your own logo and brand name, hide Simple Commenter branding, and serve a branded client portal on your own domain. Set an end date for a review round, with reminders before it closes and optional client notifications. A card-based project overview with recent comments, files, clients, and integrations at a glance. A lightweight loader that only pulls in the full widget when a visitor can actually see it. A step-by-step first-run flow to help you install, invite, and collect your first comment. Browser extension for quick access to feedback across any site. Mention and notify team members in comments and replies. Automatic email notifications when new feedback is submitted. Let AI agents fetch and fix feedback via MCP integration. One-click installation for WordPress sites. --- ## Current Integrations --- ## Planned Integrations Sync feedback to Notion databases. --- ## Coming Soon ### User Experience Allow logged-in users to edit their own comments. Fine-grained control over when and how you receive notifications. ### Dashboard Improvements Support for video and audio assets with time-based commenting. Better asset organization and management interface. Export feedback reports as PDF with asset thumbnails. --- ## Feature Requests We prioritize features based on customer feedback. If there's something you'd like to see: - [Contact Support](https://www.simplecommenter.com/support) This roadmap is updated regularly. Items may be reprioritized based on customer needs and technical considerations. --- # Basic Widget Setup The SimpleCommenter widget is a lightweight JavaScript snippet that adds a feedback button to your website. This guide covers the fundamental setup process. ## How It Works 1. You add our script to your website 2. The script loads asynchronously (won't slow down your page) 3. A feedback button appears for your visitors 4. Visitors can submit feedback, which appears in your dashboard ## Adding the Widget Add this script tag to your website's HTML, just before the `` tag: ```html ``` The `defer` attribute ensures the script loads without blocking your page render. Replace `sc_your_project_key` with your project's public key from the dashboard. ## Required Setup ### 1. Create a Project Before the widget works, create a project in the SimpleCommenter dashboard: 1. Go to [your dashboard](https://www.simplecommenter.com/app) 2. Click "Add Project" 3. Enter your project details 4. Save the project, then copy its public key ### 2. Use Your Public Key The `data-id` attribute must contain your project's public key (format `sc_...`) from the dashboard: ```html ``` The same public key works everywhere your project loads, including local development. ## What Visitors See When the widget loads, visitors will see: 1. **Feedback Button** - A small button in the corner of the screen 2. **Feedback Form** - Opens when clicked, with fields for: - Comment text - Screenshot capture (optional) - Email (optional) 3. **Confirmation** - Success message after submission ## Filtering Comments on the Page Logged-in users can control which comments are visible on the page itself using the **status filter** in the widget's comment sidebar: 1. Open the widget's comment sidebar on your site 2. Click the status filter dropdown at the top of the list 3. Check or uncheck statuses to show or hide them Comments with unchecked statuses disappear from both the sidebar list and the page markers. For example, uncheck **Done** to hide completed comments so only open work stays visible on the page. Each status shows a count badge so you can see how many comments it hides. Your selection is saved per user and restored on the next visit. Leaving every status unchecked shows all comments again. This filter only changes what you see in the widget on the page. It does not affect other users, and the dashboard has its own separate filters. ## Next Steps - [Configure the widget](https://www.simplecommenter.com/docs/widget/configuration) with custom options - [Customize the appearance](https://www.simplecommenter.com/docs/widget/customization) to match your brand - [Set up for specific platforms](https://www.simplecommenter.com/docs/widget/platforms) like WordPress or Shopify --- # Widget Configuration Customize how the SimpleCommenter widget loads on your website using supported embed attributes. ## Supported Embed Attributes Use data attributes to tell the widget which project to load: ```html ``` The script tag identifies the project. Theme settings such as color and widget placement are loaded from the project's saved dashboard theme. Script attributes do not override saved theme settings. ### Available Attributes Your project's public key (format `sc_...`). This is the identifier the widget uses to load your project. ## Theme and Position Precedence SimpleCommenter resolves configuration in two layers: 1. The embed script identifies the project with its public key (`data-id` or the `?id=` query parameter). 2. The widget then loads theme settings, including color and position, from the project's saved dashboard configuration. If you need to move the widget or change its colors, update the project under [Theme Configuration](https://www.simplecommenter.com/docs/dashboard/theme) in the dashboard. ## Runtime Behavior The current embed script is intentionally lightweight: - It identifies which project should load. - It pulls saved theme and access settings from the dashboard. - It renders the widget using that saved project configuration. There is currently no public browser API for opening, closing, toggling, pre-filling user data, or subscribing to widget events from `window.SimpleCommenter`. If you need to control who can access the widget or when it appears, use [Access Settings](https://www.simplecommenter.com/docs/dashboard/access). If you need to change colors or placement, use [Theme Configuration](https://www.simplecommenter.com/docs/dashboard/theme). ## Next Steps - [Customize the widget appearance](https://www.simplecommenter.com/docs/widget/customization) - [Configure access settings](https://www.simplecommenter.com/docs/dashboard/access) - [Platform-specific setup guides](https://www.simplecommenter.com/docs/widget/platforms) --- # Widget Customization Make the SimpleCommenter widget match your brand using the project theme and dashboard settings. Widget appearance is managed from the dashboard. Embed script attributes do not override the saved project theme for color or position. ## Color Customization ### Primary Color Set your brand color in **Projects > Your Project > Theme**. This color is applied to: - The feedback button background - Primary action buttons - Active states and highlights - Links within the widget ### Color Examples | Brand | Hex Code | Preview | | --- | --- | --- | | Yellow (default) | #F7D070 | Primary button color | | Green | #7BC47F | Eco-friendly brands | | Blue | #62B0E8 | SaaS and tech | | Purple | #8B5CF6 | Creative agencies | | Orange | #F97316 | Energetic products | ## Text Customization ### Button Text Change widget copy from your dashboard settings rather than the embed script. Popular alternatives: - "Feedback" - "Help" - "Report Bug" - "Suggestions" - "Contact Us" ### Placeholder Text Customize placeholder text via the dashboard under **Advanced > Localization**: - Comment placeholder - Email placeholder - Name placeholder ## Position Options Control where the widget button appears from **Projects > Your Project > Theme**. Supported saved positions: - `bottom-right` - `bottom-center` - `bottom-left` - `side-right` - `side-left` The project theme controls widget placement. If the embed script includes `data-position`, it will not override the saved dashboard setting. ## Advanced Styling Use the project theme to control the widget's visual appearance. The current embed flow does not support per-script color or position overrides. ## Dashboard Settings Additional customization is spread across your project settings tabs: - **Theme** — brand color, widget position, and logo - **Localization** — button text, placeholder text, and every widget label - **Screenshots** — screenshot capture behavior - **Functionalities** — which fields and features are enabled (drawing, file uploads, comment title, mentions, and more) ## Next Steps - [Platform-specific installation guides](https://www.simplecommenter.com/docs/widget/platforms) - [Theme Configuration](https://www.simplecommenter.com/docs/dashboard/theme) --- # Formatting Comment and reply text supports a small set of rules called Markdown Lite. Four rules, nothing else. Anything that is not one of them is shown exactly as typed, so plain text comments look the same as before. ## The Rules | You type | You get | | --- | --- | | **bold** | **bold** | | `code` | `code` | | - item (at the start of a line) | A bullet list. Consecutive "- " lines form one list. | | Enter | A line break. | Unbalanced markers stay literal: a single `*` or a lone backtick is just text. Formatting never applies inside a code span. ## Writing It - Select text in the comment box and a small popover offers **Bold**, **Code**, and **List**. - Keyboard: ⌘B (Ctrl+B) for bold, ⌘E (Ctrl+E) for code, ⌘⇧8 (Ctrl+Shift+8) for a list. - Type `- ` at the start of a line to begin a list. Enter continues it with a new `- ` item, and Enter on an empty item ends the list. Comments are stored as plain text with the markers in place. Nothing is rewritten, so a destination that cannot show formatting still gets the words. ## How It Travels | Destination | What arrives | | --- | --- | | Trello, ClickUp, GitHub, Linear, Discord | The text as written. These tools read the same markers natively. | | Slack | Converted to Slack formatting (single-asterisk bold, bullet lines). | | Jira | Converted to Jira's document format (bold, code, bullet list). | | Asana, Monday | Markers removed, words kept. List items become • lines. | | Email | Rendered as bold, code, and lists in the notification. | | REST API, webhooks, MCP | Raw text with the markers, plus textFormat: "markdown-lite" beside it so your code knows how to read it. | Titles never carry formatting. Where comment text is used as a title, for example a card name, the markers are stripped. See the [REST API](https://www.simplecommenter.com/docs/rest-api), [Webhooks](https://www.simplecommenter.com/docs/integrations/webhooks), and [AI Agent (MCP)](https://www.simplecommenter.com/docs/integrations/ai-agent) pages for where `textFormat` appears. --- # @Mentions & Tagging Tag team members and clients directly in comments and replies. Type `@` to see a list of people on your project, select a name, and they get notified automatically. ## Enabling @Mentions @Mentions are controlled at two levels: ### Project Level Go to **Project Settings > Widget > Features** and toggle **@Mentions / Tagging** on. ### Project Template Go to **Project template > Widget > Features** to set the default for all new projects. Existing projects are not affected. @Mentions are automatically disabled when a project has fewer than 2 eligible people (owner + team members + approved clients). The toggle will have no effect until more people are added. ## How to Use ### In the Widget 1. Click on an element to open the comment input 2. Type `@` anywhere in your comment 3. A dropdown appears with all eligible people on the project 4. Click a name or use arrow keys and Enter to select 5. The mention appears as a styled `@Name` in your comment 6. Submit the comment — the tagged person receives a notification ### In the Dashboard Type `@` in the reply field on any comment in your project page. The same dropdown and notification behavior applies. ### Manual Tagging Click the **people icon** next to the priority dropdown to attach users to a comment without mentioning them in the text. This is useful for assigning feedback to someone without writing their name in the comment body. Manually attached users receive the same notifications as @mentioned users. ## Who Can Be Mentioned The mention dropdown only shows people who are part of the current project: - **Project owner** — always included, cannot be removed - **Assigned team members** — members added to this specific project - **Approved clients** — clients with access to this project People who are not assigned to the project will not appear in the dropdown, even if they are members of the workspace. ## Team Member Assignment Control which team members have access to each project. ### Per-Project Assignment Go to **Project Settings > Access** to add or remove team members from a project. The owner is always included. ### Default Assignment for New Projects Go to **Project template > Access** and set **Auto-assign members to new projects**: Every team member is automatically added to new projects. Only the members you choose are added to new projects. Configure the default list below the dropdown. No team members are added automatically. You assign them manually per project. ### Project Creation When creating a new project from the dashboard, you can choose which team members to include. The selection is pre-filled based on your default assignment setting. When creating a project via the Chrome extension or API, the default assignment setting is applied automatically. ## Team Member Visibility Team members with the **Team** role only see projects they are assigned to. Workspace owners and members with the **Member** role see all projects. Use the filter on the projects page to view projects assigned to a specific team member. ## Notifications Tagged users receive email notifications based on their notification preferences. A dedicated **Mentions** notification type allows users to opt in or out of mention notifications separately from other activity (new comments, replies, status changes). Notification preferences can be configured in **Account > Notifications**. Tagging someone in a reply subscribes them to the entire comment thread. They will receive notifications for future replies in that thread. ## Integrations When a comment includes @mentions, the tagged users are included in integration payloads: - **Slack** — Tagged user names appear in the notification message - **Trello** — Tagged users are listed in the card description - **Webhooks** — `mentions` and `attachedUsers` arrays are included in the JSON payload ## Privacy The mention dropdown never exposes email addresses. Only display names and roles are shown to other users in the widget. Email addresses are stored server-side only and used for notifications. ## Authentication & Tagging Only logged-in users can tag people. If a non-logged-in user types `@`: - A small prompt appears with a **Sign in** button - If client registration is enabled (open or request mode), a **Register** button also appears - After signing in, the user can tag people in their comment ### Draft Preservation If a user starts writing a comment and then needs to sign in (triggered by typing `@`), their in-progress comment is automatically saved and restored after login. This works across all login methods: password, magic link, and Google OAuth. --- # Platform Installation Guides Platform-specific instructions for adding SimpleCommenter to your website. ## WordPress ### Option 1: Theme Editor 1. Go to **Appearance > Theme Editor** 2. Open `footer.php` or your theme's footer template 3. Add the script before ``: ```html ``` ### Option 2: Plugin (Recommended) 1. Install and activate **Insert Headers and Footers** plugin 2. Go to **Settings > Insert Headers and Footers** 3. Paste the script in the **Footer** section 4. Save changes Using a plugin prevents losing the script when updating your theme. ### Option 3: Child Theme Add to your child theme's `functions.php`: ```php function add_simplecommenter_widget() { ?> Custom Code** 2. In the **Footer Code** section, paste: ```html ``` 3. Click **Save Changes** 4. Publish your site Replace `sc_your_project_key` with your project's public key from the dashboard. --- ## Squarespace 1. Go to **Settings > Advanced > Code Injection** 2. In the **Footer** field, paste: ```html ``` 3. Click **Save** --- ## Shopify 1. Install **Simple Commenter** from the Shopify App Store. 2. Open **Apps > Simple Commenter** in Shopify admin, sign in, and choose the project for your store. 3. In setup, choose who can see the widget, then click **Open theme editor**. 4. Under **App embeds**, switch on **Simple Commenter** and click **Save**. 5. Return to the app, open your review link, and leave a test comment. It appears under **Feedback** in Shopify admin. See the [Shopify installation guide](https://www.simplecommenter.com/docs/installation/shopify) for theme changes and troubleshooting. --- ## Wix 1. Go to **Settings > Custom Code** 2. Click **+ Add Custom Code** 3. Paste the script 4. Set placement to **Body - end** 5. Apply to **All pages** 6. Click **Apply** Wix code injection requires a Premium plan. --- ## Next.js Add to your root layout or `_app.js`: ```jsx import Script from "next/script"; export default function RootLayout({ children }) { return ( {children} ``` Or dynamically in a component: ```jsx import { useEffect } from "react"; function FeedbackWidget() { useEffect(() => { const script = document.createElement("script"); script.src = "https://simplecommenter.com/js/comments.min.js"; script.dataset.id = "sc_your_project_key"; script.defer = true; document.body.appendChild(script); return () => document.body.removeChild(script); }, []); return null; } ``` --- ## Vue.js / Nuxt ### Vue 3 In your `App.vue` or main layout: ```vue ``` ### Nuxt 3 In `nuxt.config.ts`: ```typescript export default defineNuxtConfig({ app: { head: { script: [ { src: "https://simplecommenter.com/js/comments.min.js", "data-id": "sc_your_project_key", defer: true, }, ], }, }, }); ``` --- ## Static HTML Simply add before ``: ```html My Website ``` --- ## Troubleshooting ### Widget Not Appearing? 1. **Check public key**: Ensure `data-id` matches your project in the dashboard 2. **Check console**: Look for errors in browser developer tools 3. **Script placement**: Works in either `` or before ``. The script loads without blocking your page. 4. **HTTPS**: Both your site and the script use HTTPS ### Need Help? - [Contact support](https://www.simplecommenter.com/support) - [View dashboard settings](https://www.simplecommenter.com/docs/dashboard/general) --- # Rewrite with AI Every comment box and reply box has a sparkle button next to the attachment icon. Click it, pick what you want done, and the rewritten text streams into the box in front of you. Nothing is posted until you press Post, and your original is one click away. ## What the menu offers | Group | Options | | --- | --- | | Rewrite | Fix spelling and grammar · Make it clearer · Shorter · Friendlier | | Shape | Turn into a bug report (What / Where / Expected / Actual) · Add steps to reproduce | | Language | Translate to the project's brief language | | Suggest a reply (replies only) | Say it's fixed · Ask what they meant · Explain it's by design · Say when it will be done | The last line of the menu is free text: type what you want changed, for example "mention it only happens on Safari", and press Enter. Number keys pick an option while the menu is open. In a reply box, an empty box leads with the suggestions, which are drafted from the comment and its [dev brief](https://www.simplecommenter.com/docs/dev-briefs). Once you have typed something, Rewrite leads. ## While it writes The box empties and refills as the text arrives, Post is dimmed, and clicking the sparkle again cancels and puts your original back. When it finishes, a small **Undo** chip appears for a few seconds. Undo restores exactly what you wrote. ## What it will not do - Send anything. Posting is always your click. - Invent facts. Where a bug report needs something the text and the page don't contain, it leaves a short blank for you. - Touch names. `@mentions` are protected and put back in place. Selectors, code and URLs are kept verbatim. - Add formatting beyond [Markdown Lite](https://www.simplecommenter.com/docs/widget/formatting): bold, code and bullet lists. ## Who can use it Everyone who can write in the widget, clients included. Clearer feedback in is the point. Trials include 50 rewrites; paid plans have no limit. Only the text in the box, the option you picked, and the page context the widget already captured are sent to the model. For reply suggestions, the comment you're replying to is included as well. Names and emails never are.