# Camelus > Camelus is a user feedback analyst for indie founders, small SaaS teams and agencies with several products. It collects feedback from an in-app widget, a support inbox, a webhook/REST API, payment cancellation reasons and CSV imports, uses AI to translate, summarize (without personal data) and group similar requests into themes, ranks themes with deterministic code by how many people ask, how recently and how much they pay, sends a short daily briefing, pushes themes to any app through signed webhooks (Vicunia, Linear and GitHub via n8n or Zapier, Slack, Discord, custom endpoints), and emails everyone who asked when a change ships. --- Source: https://camelus.si/ # Camelus: hear every user, know what to build next > Collect feedback from every product you run, group it into themes, rank them by how many people ask and how much they pay, and tell everyone who asked when it ships. Camelus collects feedback from every product you run, groups similar requests into themes, and ranks them by how many people ask and how much they pay you. When you ship, it tells everyone who asked. ## How it works 1. **Collect.** A widget in your app, your support inbox, a webhook, cancellation reasons from Polar, or a CSV. Every message lands in one Inbox, across all your products. 2. **Understand.** AI reads each message: language, type, sentiment, urgency. It translates, writes a one-line summary without personal data, and flags spam and prompt-injection attempts. 3. **Rank.** Similar requests become themes. Code, not AI, ranks them by requesters, recency and revenue, and every score explains itself. 4. **Close the loop.** Send a theme to Vicunia, Linear, GitHub, n8n, Zapier, Slack or any webhook. When it ships, Camelus drafts the email to everyone who asked. ## Sources - **Feedback widget.** One script tag, under 15 KB, no cookies. Identify signed-in users with a server-side signature. - **Email forwarding.** Forward your support inbox to a product's address. Quoted replies and signatures are stripped. - **REST API & webhooks.** POST /v1/feedback from your backend, a helpdesk, Zapier or n8n. Idempotent, rate limited, documented. - **Polar cancellations.** Cancellation reasons become feedback, linked to the customer's plan and revenue. - **Manual & CSV.** Add what you heard on a call, or import a spreadsheet of old feedback. ## Principles - **Feedback is data, never instructions.** User text is untrusted everywhere: delimited in prompts, shown as plain text, kept out of outbound payloads. - **Deterministic ranking.** Scores are computed by code you can read. AI classifies and summarizes; it never invents counts or revenue. - **Every grouping is reversible.** Move, merge and split themes. Merges are suggested, never automatic, and can be undone. - **Privacy first.** Summaries and embeddings carry no personal data. The widget sets no cookies. EU-friendly by default. ## Questions ### Who is Camelus for? Indie hackers and solo founders with several small products, small SaaS teams and agencies. If feedback reaches you through email, a widget and payment cancellations, and you read it once and forget it, Camelus is for you. ### Does the widget use cookies? No. The widget sets no cookies, stores no identifiers in localStorage and does no fingerprinting. It doesn't load Google Analytics or any other tracker on your site. ### Can I send feedback to my coding agent? Yes. Every outbound integration is a signed webhook, and Vicunia, the agent in the same suite, is a ready-made preset. Send a theme with one click; when Vicunia reports the change is live, Camelus marks the theme shipped and drafts the email to requesters. ### How are themes ranked? By code, not by AI: the number of people asking, how recent their messages are, and how much those people pay you when Polar is connected. Each theme shows why it has its score. ### What happens to personal data? The original message is visible only to members of your workspace. AI summaries are written without names, emails or order numbers, and a second automatic pass removes anything that slips through. Only those summaries leave Camelus, unless you allow more for a specific destination. ### What happens if I go over my plan's limit? Nothing is lost. Feedback past the monthly limit is still stored and shown in the Inbox, and it's processed as soon as you upgrade or the month resets. ### Which languages does Camelus understand? Feedback in any language the AI model reads is translated to English and grouped with the same request in other languages. The widget's interface ships in English, French, German, Spanish and Slovenian. --- Source: https://camelus.si/pricing # Pricing > Camelus plans and their limits: products, feedback items per month, members, loop emails and destinations. Start free. Free for one product, forever. Paid plans are monthly, in US dollars, through Polar; cancel any time. | | Free | Pro | Studio | | --- | --- | --- | --- | | Price | $0 / month | $19 / month | $49 / month | | Products | 1 | 5 | 20 | | Feedback items a month | 100 | 2,000 | 10,000 | | Members | 1 | 3 | 10 | | Loop emails a month | 100 | 2,000 | 10,000 | | Destinations | 1, sent by hand | 5, automatic events | 25, automatic events | | Read API, MCP, Polar connector | No | Yes | Yes | | Digests and alerts | Daily digest | Daily and weekly digests, alerts | Daily and weekly digests, alerts | | History | 6 months | 24 months | 24 months | Feedback past a monthly limit is stored and shown, never dropped, and processed after an upgrade or when the month resets. --- Source: https://camelus.si/features # Features > Everything Camelus does: collect feedback from every channel, summarize and group it with AI, rank themes by people and revenue, brief you daily, and close the loop. ## Collect: Every channel, every product, one Inbox Feedback arrives where your users already are. Camelus gathers it into one real-time Inbox, with the product, the source and the person attached. - A feedback widget: one script tag, under 15 KB, no cookies, in five languages - Identify signed-in users with a server-side signature, so nobody can borrow someone else's weight - A forwarding address per product: quoted replies, signatures and forwarding headers are stripped - POST /v1/feedback from your backend, a helpdesk, n8n or Zapier: idempotent and rate limited - Polar cancellation reasons, with the customer's plan and revenue - Add what you heard on a call, or import a CSV of old feedback ## Understand: Read once, in any language, without personal data Each message is read once by an AI model. It writes an English summary, translates, and tags type, sentiment and urgency. The original stays untouched. - Summaries leave out names, emails and order numbers; a rule-based pass catches what slips through - Spam and prompt-injection attempts wait in Needs review instead of polluting your themes - A monthly AI budget per plan: past it, feedback is stored and waits, never dropped ## Rank: Themes ranked by people and revenue, not by the loudest voice Similar requests are grouped into themes across languages. Code you can read ranks them: each person counts once, weighed by how they reached you, whether they pay, and how recently they asked. - Why this score: every theme lists who contributes what - MRR affected per theme when Polar is connected; never estimated without it - Move, merge and split themes; merges are suggested, never automatic, and undoable for 30 days - Rising and new themes stand out; quiet ones fade with a 30-day half-life ## Brief: Two minutes every morning A daily digest at the time you choose, with numbers from the database and a two-sentence opening. Quiet days send nothing. Pro adds a weekly digest and alerts. - Top and rising themes, urgent items, complaints from paying customers, cancellations, what shipped - Alerts for urgent feedback from paying customers, theme spikes and runs of cancellations - Quiet hours and at most three alerts a day; the rest wait for the digest ## Send: Push themes to where they get built Every destination is a signed webhook with retries, a delivery log and replay. Presets fill the form for the tools you use, and the receiving app can report back. - Vicunia, n8n, Zapier, Make, Slack, Discord or your own endpoint - Linear and GitHub Issues through ready-made n8n workflows, or a few Zapier and Make steps - Status callbacks move the theme to planned, in progress or shipped - Payloads carry PII-free summaries and counts unless you allow more ## Close the loop: Tell everyone who asked When a theme is planned, shipped or declined, Camelus drafts the email to the people who asked to hear back. You read it and send it with one click. - Only to people who opted in, with one-click unsubscribe - Hard bounces and spam complaints stop further emails - Shipped through a destination? The draft is waiting for you ## For agents: An API and an MCP server Read themes and feedback from your code with the REST API, or let Claude and other agents ask what users want through MCP. - An OpenAPI document generated from the same schemas the server checks - Scoped API keys: send feedback, read, change theme status - MCP tools for top themes, search, a theme's detail and the digest --- Source: https://camelus.si/integrations # Integrations > Camelus works with Vicunia, n8n, Zapier, Make, Linear, GitHub Issues, Slack, Discord, Polar, MCP clients and any HTTPS endpoint. - [Vicunia](https://camelus.si/integrations/vicunia) (Destination): Send a theme to the agent that builds it. Progress and the shipped link come back, and requesters get an email. - [n8n](https://camelus.si/integrations/n8n) (Destination): Receive theme events in an n8n workflow and do anything with them. Ready-made workflows for Linear and GitHub. - [Zapier](https://camelus.si/integrations/zapier) (Destination): Catch theme events with a Zapier webhook trigger and connect them to thousands of apps. - [Make](https://camelus.si/integrations/make) (Destination): Start a Make scenario when a theme is created, rises, or reaches your threshold. - [Linear](https://camelus.si/integrations/linear) (Recipe): Turn a theme into a Linear issue with an n8n recipe, and mark it shipped when the issue is done. - [GitHub Issues](https://camelus.si/integrations/github-issues) (Recipe): Open a GitHub issue for a theme, and close the loop when it's closed. - [Slack](https://camelus.si/integrations/slack) (Notifications): Post new and rising themes to a Slack channel, formatted for Slack. - [Discord](https://camelus.si/integrations/discord) (Notifications): Post theme events to a Discord channel through a channel webhook. - [Polar](https://camelus.si/integrations/polar) (Source): Plan and revenue on every requester, MRR affected per theme, and cancellation reasons as feedback. - [MCP](https://camelus.si/integrations/mcp) (Agents): Let Claude or any MCP client ask what your users want, with a read-only key. - [Alpaga](https://camelus.si/integrations/alpaga) (Agents): Use Alpaga's and Camelus's MCP servers together: what your traffic shows, next to what users say. --- Source: https://camelus.si/integrations/vicunia # Vicunia integration: from user feedback to a shipped change > Send a Camelus theme to Vicunia, the agent that builds it. Progress and the deploy link come back, and everyone who asked gets an email. [Vicunia](https://vicunia.si) is the agent in the same suite that turns a request into a reviewed, merged and deployed change. Connected to Camelus, it closes the whole loop: users ask, Camelus ranks, Vicunia builds, and everyone who asked hears that it shipped. ## What it does - **Send to… → Vicunia** on a theme creates a Vicunia request with the theme's title, summary, counts and a few representative quotes, without personal data. - Vicunia reports back as the job moves: the theme goes to **in progress** while it's built and reviewed, and to **shipped** with the deploy link and the pull request once it's live. - When it ships, Camelus drafts the email to the people who asked to hear back. You read it and send it, or let it go automatically. - If Vicunia declines the request, the theme page asks whether to decline the theme too. Nothing changes on its own. ## Set it up 1. In Vicunia, create a webhook source and copy its URL and signing secret. 2. In Camelus, open **Settings → Destinations → Add destination**, pick the **Vicunia** preset, and paste both. 3. Send a theme. Its page shows the job under **Linked work**. Step-by-step instructions, the status mapping and a local setup: [Vicunia docs](https://camelus.si/docs/vicunia). --- Source: https://camelus.si/integrations/n8n # n8n integration: theme events in your workflows > Receive signed Camelus theme events in n8n, open issues or notify your team, and report back when the work ships. Ready-made Linear and GitHub workflows. [n8n](https://n8n.io) workflows can receive Camelus theme events and do anything with them: open an issue, update a sheet, notify a team. When the work is done, the workflow tells Camelus, and the theme moves to shipped. ## What it does - Camelus posts signed JSON to an n8n **Webhook** node: when you send a theme by hand, and (on Pro) automatically when a theme is created, rises, reaches your threshold or changes status. - Each event carries the theme's title, summary, score, requester counts, quotes without personal data, and a callback URL with its token. - Your workflow posts `planned`, `in_progress` or `shipped` to the callback. Camelus updates the theme and, on shipped, drafts the email to requesters. ## Ready-made workflows - [Camelus → Linear](https://camelus.si/recipes/n8n-linear.json) - [Camelus → GitHub Issues](https://camelus.si/recipes/n8n-github.json) Import one in n8n (**Workflows → Import from file**), add your credentials, and paste the webhook URL into a Camelus destination with the **n8n** preset. Payload, signature check and events: [Destinations](https://camelus.si/docs/destinations). Reporting back: [Status callbacks](https://camelus.si/docs/callbacks). --- Source: https://camelus.si/integrations/zapier # Zapier integration: connect feedback themes to any app > Catch Camelus theme events with a Zapier webhook, pass them to thousands of apps, and mark themes shipped from a second Zap. Connect Camelus to the apps Zapier supports. A Zap catches theme events from Camelus and passes them on; a second Zap reports back when the work is done. ## What it does - Camelus posts signed JSON to a **Webhooks by Zapier → Catch Raw Hook** trigger: when you send a theme by hand, and (on Pro) automatically on the events you pick. - Use the theme's title, summary, counts and quotes in any action: create a task, a ticket, a row, a message. - A second Zap posts `shipped` to the theme's callback URL when the task is completed. Camelus marks the theme shipped and drafts the email to requesters. ## Set it up 1. Create a Zap with **Webhooks by Zapier → Catch Raw Hook** and copy its URL. 2. In Camelus, **Settings → Destinations → Add destination**, preset **Zapier**, paste the URL, and click **Test**. 3. Add a **Code by Zapier** step to check the signature, then your action. The full steps, including the signature snippet and the callback Zap: [Destinations → Zapier](https://camelus.si/docs/destinations#zapier). --- Source: https://camelus.si/integrations/make # Make integration: start scenarios from feedback themes > Start a Make scenario when a Camelus theme is created, rises or reaches your threshold, and report back when it ships. Start a [Make](https://www.make.com) scenario from Camelus theme events, and report back when the work is done. ## What it does - Camelus posts signed JSON to a Make **Webhooks → Custom webhook**: when you send a theme by hand, and (on Pro) automatically when a theme is created, rises, reaches your threshold or changes status. - The scenario gets the theme's title, summary, score, counts, quotes without personal data, and a callback URL. - A second scenario posts `shipped` to the callback when the work is done. Camelus marks the theme shipped and drafts the email to requesters. ## Set it up 1. Start a scenario with **Webhooks → Custom webhook**, with **Get request headers** and **JSON pass-through** on, and copy its address. 2. In Camelus, **Settings → Destinations → Add destination**, preset **Make**, paste the address, and click **Test**. 3. Check the signature, then add your modules. Full steps: [Destinations → Make](https://camelus.si/docs/destinations#make). --- Source: https://camelus.si/integrations/linear # Linear integration: turn feedback themes into issues > Create a Linear issue from a Camelus theme with an n8n recipe, and tell everyone who asked when the issue is done. Turn a Camelus theme into a [Linear](https://linear.app) issue, with the summary, the number of people asking and what they said, and close the loop when the issue is done. Camelus doesn't connect to Linear directly: it sends a signed webhook to an n8n, Zapier or Make workflow that creates the issue. That keeps your Linear credentials in your automation tool, and lets you shape the issue the way your team likes. ## With n8n (ready-made) 1. Download the [Camelus → Linear workflow](https://camelus.si/recipes/n8n-linear.json) and import it in n8n. 2. Add your Linear credentials and pick the team. 3. Copy the workflow's webhook URL into a Camelus destination with the **n8n** preset. 4. On a theme, **Send to… → your destination**. The issue is created; the theme moves to **planned**. When the issue is completed, the workflow reports **shipped**, and Camelus drafts the email to everyone who asked. ## With Zapier or Make Catch the webhook, create the issue with the Linear action, and post `shipped` to the callback URL when it's completed. Steps: [Zapier](https://camelus.si/docs/destinations#zapier), [Make](https://camelus.si/docs/destinations#make). --- Source: https://camelus.si/integrations/github-issues # GitHub Issues integration: feedback themes as issues > Open a GitHub issue for a Camelus theme with a ready-made n8n workflow, and email requesters when it's closed. Open a GitHub issue for a Camelus theme, with the summary, the number of people asking and representative quotes, and tell everyone who asked when it's closed. Camelus sends a signed webhook to an n8n, Zapier or Make workflow, which creates the issue with your GitHub credentials. No GitHub app to install in Camelus. ## With n8n (ready-made) 1. Download the [Camelus → GitHub Issues workflow](https://camelus.si/recipes/n8n-github.json) and import it in n8n. 2. Add your GitHub credentials and set the repository. 3. Copy the workflow's webhook URL into a Camelus destination with the **n8n** preset. 4. On a theme, **Send to… → your destination**. The theme moves to **planned** when the issue is open, and to **shipped** when it's closed. Camelus then drafts the email to requesters. Want an agent to fix it instead of a person? Send the theme to [Vicunia](https://camelus.si/integrations/vicunia). ## With Zapier or Make Catch the webhook, create the issue with the GitHub action, and post `shipped` to the callback URL when it's closed. Steps: [Zapier](https://camelus.si/docs/destinations#zapier), [Make](https://camelus.si/docs/destinations#make). --- Source: https://camelus.si/integrations/slack # Slack integration: feedback themes in your channel > Post new and rising themes, urgent feedback and the daily digest to a Slack channel, without personal data. Post what your users are asking for to a Slack channel: new themes, rising themes, urgent feedback and the daily digest, formatted as Slack messages. ## What it posts - **New theme:** the title, product and number of people asking, with a link to the theme. - **Rising theme:** when a theme's weekly volume doubles. - **Urgent feedback:** the PII-free summary of an urgent item. - **The digest:** the same facts as the email. Summaries never contain names or emails, and mentions in them never ping anyone. Automatic events are on Pro; on Free, send a theme to Slack by hand with **Send to…**. ## Set it up 1. In Slack, add an **Incoming Webhook** to the channel (**Apps → Incoming Webhooks**) and copy its URL. 2. In Camelus, **Settings → Destinations → Add destination**, preset **Slack**, paste the URL. 3. Pick the events and products, and click **Test**. More: [Destinations](https://camelus.si/docs/destinations#slack-and-discord). --- Source: https://camelus.si/integrations/discord # Discord integration: feedback themes in your server > Post new and rising themes, urgent feedback and the daily digest to a Discord channel through a webhook. Post theme events to a Discord channel: new and rising themes, urgent feedback and the daily digest. ## What it posts - New themes and rising themes, with the product, the number of people asking and a link. - PII-free summaries of urgent feedback. - The digest, with the same facts as the email. Mentions in summaries never ping anyone. Automatic events are on Pro; on Free, send a theme by hand with **Send to…**. ## Set it up 1. In Discord, open **Channel settings → Integrations → Webhooks**, create one and copy its URL. 2. In Camelus, **Settings → Destinations → Add destination**, preset **Discord**, paste the URL. 3. Pick the events and products, and click **Test**. More: [Destinations](https://camelus.si/docs/destinations#slack-and-discord). --- Source: https://camelus.si/integrations/polar # Polar integration: paying customers and cancellation reasons > Connect Polar to Camelus: plan and revenue on every requester, MRR affected per theme, and cancellation reasons as feedback. If you sell through [Polar](https://polar.sh), Camelus can know who pays you. Paying customers weigh more in theme scores, each theme shows the monthly revenue it touches, and cancellation reasons arrive as feedback. ## What it does - **Plan and revenue on every requester** whose email matches a Polar customer. - **MRR affected** on each theme: the monthly revenue of the distinct paying customers who asked. Without Polar, Camelus shows "—" rather than guessing. - **Cancellation reasons as feedback:** when a customer cancels and says why, the reason lands in your Inbox and is grouped with everything else. - **Alerts** for urgent feedback from paying customers, and when several customers cancel with a reason in a week. Read-only: Camelus reads subscriptions and never writes to Polar. On Pro and Studio. ## Set it up 1. In Polar, create an organization token with the `subscriptions:read` scope. 2. In Camelus, open **Settings → Integrations** and paste it. 3. Optionally, add the webhook URL shown there to Polar, so changes arrive in seconds instead of daily. Full guide: [Polar docs](https://camelus.si/docs/polar). --- Source: https://camelus.si/integrations/mcp # MCP integration: let agents ask what users want > Connect Claude or any MCP client to Camelus to read top themes, search feedback and get the digest, with a read-only key. Camelus runs an MCP server, so Claude and any agent that speaks the Model Context Protocol can ask what your users want: "what are the top requests on habits.app?", "is anyone complaining about exports?", "what did yesterday's digest say?". ## What an agent can do - **Top themes** for a product or all of them, ranked by score. - **Search feedback** by meaning, across languages. - **A theme's detail:** summary, counts, trend, quotes without personal data, linked work. - **The latest digest.** - **Change a theme's status**, with a key that has the `themes:write` scope. Everything an agent reads is PII-free, like every other way out of Camelus. ## Connect Create a key with the `read` scope in **Settings → API & MCP** (Pro and Studio), then, in Claude Code: ```bash claude mcp add --transport http camelus https://api.camelus.si/mcp \ --header "Authorization: Bearer ck_live_…" ``` Other clients, tools and limits: [MCP docs](https://camelus.si/docs/mcp). --- Source: https://camelus.si/integrations/alpaga # Alpaga and Camelus: traffic next to what users say > Use Alpaga's and Camelus's MCP servers in one agent to see what your traffic shows next to what your users say. [Alpaga](https://alpaga.si) is the analytics app in the same suite: it reads your traffic and search data and tells you what changed. Camelus knows what users say. Together they answer questions neither can alone: "the pricing page lost visitors this week, and what are people complaining about on it?". ## How they work together Both apps run an MCP server. Add both to the same agent (Claude Code, Claude Desktop or any MCP client), and it can combine them in one answer: - Alpaga's server: traffic, conversions, search queries and anomalies per site. - Camelus's server: top themes, feedback search and digests per product. There's no direct connection between the two apps: the agent brings them together, and each keeps its own data and access. ## Set it up 1. Create a key with the `read` scope in Camelus (**Settings → API & MCP**) and add Camelus's server, as in the [MCP docs](https://camelus.si/docs/mcp). 2. Add Alpaga's MCP server the same way, following Alpaga's docs. 3. Ask your agent a question that needs both. --- Source: https://camelus.si/faq # Frequently asked questions > Answers about Camelus: who it's for, the widget and cookies, ranking, personal data, AI, plans, limits, billing, export and deletion. ### Who is Camelus for? Indie hackers and solo founders with several small products, small SaaS teams and agencies. If feedback reaches you through email, a widget and payment cancellations, and you read it once and forget it, Camelus is for you. ### Does the widget use cookies? No. The widget sets no cookies, stores no identifiers in localStorage and does no fingerprinting. It doesn't load Google Analytics or any other tracker on your site. ### Can I send feedback to my coding agent? Yes. Every outbound integration is a signed webhook, and Vicunia, the agent in the same suite, is a ready-made preset. Send a theme with one click; when Vicunia reports the change is live, Camelus marks the theme shipped and drafts the email to requesters. ### How are themes ranked? By code, not by AI: the number of people asking, how recent their messages are, and how much those people pay you when Polar is connected. Each theme shows why it has its score. ### What happens to personal data? The original message is visible only to members of your workspace. AI summaries are written without names, emails or order numbers, and a second automatic pass removes anything that slips through. Only those summaries leave Camelus, unless you allow more for a specific destination. ### What happens if I go over my plan's limit? Nothing is lost. Feedback past the monthly limit is still stored and shown in the Inbox, and it's processed as soon as you upgrade or the month resets. ### Which languages does Camelus understand? Feedback in any language the AI model reads is translated to English and grouped with the same request in other languages. The widget's interface ships in English, French, German, Spanish and Slovenian. ### How is Camelus different from a voting board like Canny or Featurebase? Voting boards collect the requests people take the time to post publicly. Camelus reads feedback where it already arrives (your widget, your support inbox, cancellation reasons) and ranks it by who asked and how much they pay. There's no public board: the people who asked hear back by email instead. ### Do I need Polar? No. Everything works without it. With Polar connected, Camelus also knows who pays you and how much, so paying customers weigh more and each theme shows the revenue it touches. ### Which AI model reads my feedback? An OpenAI model, through its API with storage turned off, so requests aren't kept or used for training. Model names are configuration, not code, and the AI never computes counts, revenue or scores. ### Can I export or delete my data? Yes. Workspace owners can export everything as JSON lines, and delete a workspace (and their account) from Settings. You can also delete any requester's data on request. ### How long is feedback kept? Six months of full history on Free, 24 months on paid plans. Older items keep their summary and classification, so counts stay right, but lose the original text and personal details. ### How do I cancel? From Settings → Billing → Manage billing. You keep the plan until the end of the period, then the workspace moves to Free. Nothing is deleted. ### Is there a public roadmap or changelog for my users? Not yet. Today Camelus closes the loop by emailing the people who asked when something is planned, shipped or declined. --- Source: https://camelus.si/compare/canny # Camelus vs Canny > How Camelus compares with Canny: feedback from where it already arrives versus a public voting board, ranking by people and revenue, and pricing models. Canny and Camelus both help you decide what to build from what users ask for. They start from different places: Canny from a public board where users post and vote, Camelus from the feedback that already reaches you through your app, your inbox and your cancellations. This page compares them as of October 2026. Check [canny.io](https://canny.io) for its current features and prices. ## The short version - **Pick Canny** if you want a public feedback board and roadmap, with voting, comments and a changelog your users can browse. - **Pick Camelus** if most feedback arrives through a widget, support email and cancellations, you run several products, and you want it read, grouped and ranked by who's asking and what they pay, without asking users to go to a board. ## Side by side | | Canny | Camelus | | --- | --- | --- | | Where feedback comes from | Users post on your board or widget; your team adds feedback from other tools | Widget, forwarded support email, REST API, Polar cancellations, manual entry, CSV | | Grouping | People vote on posts; duplicates are merged | AI groups similar messages into themes, across languages; you can move, merge and split, with undo | | Ranking | Votes, with revenue when connected to a billing tool | Code you can read: each person once, weighed by source, identity, payment and recency, with "why this score" | | Public board and roadmap | Yes | No | | Telling users it shipped | Notifications to voters and a public changelog | Drafted email to everyone who asked to hear back, sent after your approval | | Several products | Boards per product | One Inbox across products, themes per product | | Sending work to other tools | Native integrations with issue trackers | Signed webhooks to any app, with presets for Vicunia, n8n, Zapier, Make, Slack and Discord, and status callbacks | | Agents | Has its own AI features | REST API and an MCP server for Claude and other agents | | Pricing model | Grows with the number of tracked users | Flat per workspace: Free, Pro $19 and Studio $49 a month | ## Where Camelus is different **It reads what you already get.** Most indie products never get a busy voting board: users write to support, click a widget, or cancel. Camelus collects all of that without asking anyone to sign up somewhere else. **It ranks by people and money, in code.** A theme with six paying customers can outrank one with twenty anonymous visitors, and every score shows who contributes what. AI summarizes and groups; it never invents counts or revenue. **It closes the loop by email.** When a theme ships, Camelus drafts the email to the people who asked, in plain words, and sends it when you approve. **It hands work to agents.** Send a theme to [Vicunia](https://camelus.si/integrations/vicunia) and it comes back shipped, with the deploy link. ## Where Canny is ahead A public board lets users see each other's requests, vote and discuss, and a public roadmap shows them what's coming. Camelus has neither today. If your users expect that, Canny is the better fit. --- Source: https://camelus.si/compare/featurebase # Camelus vs Featurebase > How Camelus compares with Featurebase: a focused feedback analyst that works with your tools versus an all-in-one board, roadmap and help center. Featurebase bundles a feedback board, a roadmap, a changelog, a help center and support messaging in one product. Camelus does one job: it reads the feedback you already get, groups it into themes, ranks them, and tells people when you ship. This page compares them as of October 2026. Check [featurebase.app](https://featurebase.app) for its current features and prices. ## The short version - **Pick Featurebase** if you want one tool for a public board, roadmap, changelog, help center and support inbox, and you're happy to move your support there. - **Pick Camelus** if you'd rather keep your support tools, and want the feedback they collect (plus your widget and cancellations) read, grouped and ranked across several products, with themes sent to the tools or agents that build them. ## Side by side | | Featurebase | Camelus | | --- | --- | --- | | Scope | Feedback board, roadmap, changelog, help center, support messaging | Feedback analysis: collect, group, rank, brief, send, close the loop | | Where feedback comes from | Its board, widget and support tools | Widget, forwarded email from any support tool, REST API, Polar cancellations, manual entry, CSV | | Grouping | Votes on posts, with AI help to find duplicates | AI groups messages into themes across languages; move, merge and split with undo | | Ranking | Votes and customer data | Deterministic score: each person once, weighed by source, identity, payment and recency, explained per theme | | Public board and roadmap | Yes | No | | Telling users it shipped | Changelog and notifications to voters | Drafted email to everyone who asked to hear back, sent after your approval | | Sending work elsewhere | Integrations with issue trackers and chat tools | Signed webhooks to any app, presets for Vicunia, n8n, Zapier, Make, Slack and Discord, status callbacks | | Agents | Its own AI support agent | REST API and an MCP server for Claude and other agents | | Pricing model | Per seat, with usage-based charges for AI | Flat per workspace: Free, Pro $19 and Studio $49 a month | ## Where Camelus is different **It works with the tools you have.** Forward your support inbox, keep your helpdesk, add a widget. Nothing to migrate. **It's built for several products.** One Inbox across all of them, themes per product, one digest every morning. **The ranking is code you can check.** Every theme shows exactly which people add what, and paying customers count more when Polar is connected. **It ends in a shipped change.** Themes go to [Vicunia](https://camelus.si/integrations/vicunia), [Linear](https://camelus.si/integrations/linear), [GitHub](https://camelus.si/integrations/github-issues) or any webhook; status comes back, and requesters get an email. ## Where Featurebase is ahead If you want a public board, a roadmap, a changelog and a help center in one place, Featurebase covers far more ground. Camelus has no public pages for your users today. --- Source: https://camelus.si/compare/spreadsheets # Camelus vs a feedback spreadsheet > When a spreadsheet or Notion page of feature requests stops working, what Camelus does instead, and how to import your sheet. Most founders start with a spreadsheet, a Notion page or a Slack channel: paste each request in, add a tally, sort by count. It's free and it works, until there are a few hundred rows, three products and messages in four languages. Here's what changes when you move to Camelus, and when you shouldn't bother. ## What a spreadsheet does well - It costs nothing and everyone knows how to use it. - You decide every column. - For a few requests a week from one product, it's enough. ## Where it breaks | | Spreadsheet | Camelus | | --- | --- | --- | | Getting feedback in | Copy and paste from email, chat and your widget | Widget, forwarded email, REST API, Polar cancellations, CSV import: it arrives on its own | | Duplicates | You decide by eye whether two rows are the same request | Similar messages are grouped into themes, across languages; you can correct any grouping | | Counting | A tally that counts messages, so the loudest person wins | Each person counts once; paying customers and verified users weigh more | | Revenue | Looked up by hand, if at all | MRR affected per theme when Polar is connected | | Staying current | Someone has to keep it up to date | A real-time Inbox and a digest every morning | | Personal data | Names and emails in a shared sheet | Original text visible only to your workspace; summaries carry no personal data | | Telling people it shipped | Find the rows, find the emails, write each one | Drafted email to everyone who asked, sent after your approval | | Several products | One tab per product, or one long sheet | One Inbox, themes per product | ## Moving over Export your sheet as CSV and import it in the Inbox (**Import CSV**). Columns are matched by name (`text`, `email`, `name`, `created_at`, `external_id`, `title`), and you can change the mapping before importing. Old feedback is grouped into themes like new feedback, and keeps its original date, so recent requests still weigh more. ## When to stay with the spreadsheet If you get a handful of requests a month, from one product, in one language, a spreadsheet is fine. Camelus's Free plan (1 product, 100 items a month) is there for when it stops being fine. --- Source: https://camelus.si/changelog # Changelog > What's new in Camelus, newest first: billing and the Polar connector, data export and deletion, digests, destinations, the widget and more. What's new in Camelus, newest first. ## October 25, 2026 ### Billing and the Polar connector - **Paid plans.** Pro ($19 a month) and Studio ($49 a month) through Polar. Upgrade in **Settings → Billing**; new limits apply within seconds. Cancel any time from the billing portal. - **Feedback over the limit is processed after an upgrade**, or when the month resets, oldest first. It was always stored; now it catches up on its own. - **Polar connector.** Connect your Polar organization in **Settings → Integrations**: requesters get their plan and revenue, paying customers weigh more in scores, themes show MRR affected, and cancellation reasons arrive as feedback. See [Polar](https://camelus.si/docs/polar). - **Cancellation alerts.** Three or more cancellations with a reason in a week for one product send an alert. Digests list cancellations. ### Your data - **Export** a whole workspace as JSON lines from **Settings → Workspace**. - **Delete** a workspace, and your account with it, from the same page. - **Retention:** history older than your plan's period (6 months on Free, 24 on paid plans) is anonymized. Summaries and counts stay. - **Activity log** in **Settings → Workspace**: who changed members, keys, integrations, destinations, billing and exports. - New [data processing agreement](https://camelus.si/legal/dpa) and [subprocessors](https://camelus.si/legal/subprocessors) pages. ### The website - New pages: [features](https://camelus.si/features), [integrations](https://camelus.si/integrations) with a page for each, [FAQ](https://camelus.si/faq), comparisons with [Canny](https://camelus.si/compare/canny), [Featurebase](https://camelus.si/compare/featurebase) and [spreadsheets](https://camelus.si/compare/spreadsheets), and a guide to [identifying users](https://camelus.si/docs/identify). - Every page is also available as Markdown (add `.md` to the address), and all of them in one file at [/llms-full.txt](https://camelus.si/llms-full.txt), for AI assistants. ## October 25, 2026 · Briefing and the loop - **Daily digest** at the time you choose, and a weekly digest on Mondays (Pro). Numbers come from the database; quiet days send nothing. - **Alerts** (Pro) for urgent feedback from paying customers and theme spikes, with quiet hours and at most three a day. - **Destinations:** send themes to Vicunia, n8n, Zapier, Make, Slack, Discord or any endpoint, as signed webhooks with retries, a delivery log and replay. - **Status callbacks:** the receiving app reports planned, in progress or shipped, and the theme follows. - **Notify requesters:** an AI-drafted email to everyone who asked to hear back, sent after your approval, with one-click unsubscribe. - **Read API and MCP server** (Pro), with an OpenAPI document. ## October 24, 2026 · Widget, email and AI - **Feedback widget:** one script tag, under 15 KB, no cookies, five languages, verified identities. - **Email forwarding:** an address per product; replies, signatures and forwards are handled. - **AI processing:** every message is summarized in English without personal data, translated, classified, and checked for spam and prompt injection. - **Themes:** similar messages are grouped across languages and ranked by a score you can inspect. Move, merge and split, with undo. - **People:** everyone who sent feedback, across products. Merge duplicates, delete on request. ## October 24, 2026 · First version - Workspaces, products and team invites, with Google sign-in. - A real-time Inbox fed by the REST API, manual entry and CSV import. --- Source: https://camelus.si/docs # Documentation > How to set up Camelus: create a product, collect feedback with the widget, email, the REST API or CSV, and read themes ranked by score. Camelus collects feedback about your products in one Inbox, reads it, and groups similar requests into themes ranked by how many people ask and how much they matter. This page covers the first setup. For a guided tour with screenshots, from the first sign-in to telling customers something shipped, follow the [tutorial](https://camelus.si/docs/tutorial). ## 1. Sign in and create a product Sign in with Google at [camelus.si/login](https://camelus.si/login). Your workspace is created on the first sign-in. Then create a **product**: one of your apps or sites. Give it a name, and optionally a domain, a description and the audience it's for. The description and audience are given to the AI that classifies feedback, so a sentence or two helps. Each product gets a **slug** (for example `habits`) that identifies it in the API. The slug can't be changed later. ## 2. Get feedback in Every product has these sources, each with an on/off switch in its settings: | Source | Use it for | | --- | --- | | Feedback widget | A button on your site or app. One script tag; can identify signed-in users. See [Feedback widget](https://camelus.si/docs/widget). | | Email forwarding | Your support inbox. Forward it to the product's address. See [Email forwarding](https://camelus.si/docs/email). | | REST API | Your backend, a support tool, Zapier or n8n: anything that can send an HTTP request. See the [REST API reference](https://camelus.si/docs/api). | | Added by hand | Feedback you heard on a call, in a tweet or in a DM. Open the Inbox and click **Add feedback**. | | Polar cancellations | Why customers leave. Connect your Polar organization and cancellation reasons arrive as feedback, with plan and revenue on every requester. See [Polar](https://camelus.si/docs/polar). | | CSV import | Old feedback from a spreadsheet or a helpdesk export. Columns are matched by name (`text`, `email`, `name`, `created_at`, `external_id`, `title`); you can change the mapping before importing. | Items appear in the Inbox in real time, from every source and every product. ## 3. What happens to each message Each item is read once by an AI model that writes an English summary, translates it if needed, and tags its type (bug, feature request, question, complaint, praise), sentiment and urgency. Personal details are kept out of the summary, and a second, rule-based pass removes any that slip through. The original text is never changed. Similar summaries are then grouped into **themes**, within each product. A French and an English message about the same problem end up in the same theme. When the AI isn't sure, it asks itself a second time; when nothing matches, a new theme starts. Messages that look like spam, or that try to give instructions to the AI, wait in a **Needs review** section at the top of the Inbox until you decide. ## 4. Themes and the score **Themes** lists every theme, ranked by score. The score counts each person once (their most important message), weighs them by how they reached you, whether their identity is verified, what kind of feedback it is and how sure the AI was, and fades with time: a request loses half its weight every 30 days without news. Click the score of a theme to see exactly which people add what. AI classifies and summarizes; it never computes the score. You're always in charge: rename a theme, move an item to another theme, create a theme from an item, merge two themes or split one. Camelus never moves an item you placed, never merges themes on its own (it suggests merges when two look alike), and lets you undo merges, splits and moves for 30 days. ## 5. People **People** lists everyone who sent feedback with an email or a user id, across products. Merge duplicates (the same person with two emails), or delete a person on request: either their personal data only, keeping anonymized summaries for the counts, or everything. ## 6. Briefing, alerts and the loop - **Daily digest.** Every morning at the time you pick (Settings → Notifications), Camelus emails what changed: new feedback, top and rising themes, urgent items, what shipped. The numbers come from the database; the AI only writes the two-sentence opening. On a quiet day nothing is sent. The same digest is in **Briefing**, with past ones. A weekly digest on Mondays is on Pro. - **Alerts** (Pro) arrive right away for urgent feedback from paying customers and for themes that suddenly spike. At most 3 a day, none during quiet hours; the rest wait for the digest. - **Send to…** on a theme sends it to a [destination](https://camelus.si/docs/destinations): Vicunia, n8n, Zapier, Make, Slack, Discord or your own endpoint. The app on the other side can [report back](https://camelus.si/docs/callbacks), and the theme shows it under **Linked work**. - **Notify requesters** emails the people who asked for something when it's planned, shipped or declined. The AI drafts the email; you read it and send it with one click. It only goes to people who asked to hear back, with an unsubscribe link. When a theme ships through a destination, the draft is ready for you. - **API and MCP** (Pro): read themes from your code with the [REST API](https://camelus.si/docs/api), or let an agent ask with the [MCP server](https://camelus.si/docs/mcp). ## 7. Invite your team In **Settings → Team**, invite a teammate by email. They open the link, sign in with that Google account, and join the workspace. Owners and admins manage products, sources, destinations, notifications, API keys and members; members read and triage the Inbox and themes, and can send themes and loop messages. ## Limits The Free plan includes 1 product, 100 feedback items a month and 1 member. Feedback that arrives past a monthly limit, or past the plan's AI budget, is still stored and shown; it's processed as soon as you upgrade, or when the month resets. It's never dropped. Upgrade in **Settings → Billing**; see [Pricing](https://camelus.si/pricing) for the plans. --- Source: https://camelus.si/docs/tutorial # Tutorial: Camelus from first feedback to shipped > A step-by-step tour with screenshots: collect feedback, triage the Inbox, read ranked themes, add Polar revenue, send work out and tell customers it shipped. This tutorial walks through Camelus from the first sign-in to telling customers that what they asked for has shipped. It follows one example the whole way: **Habits**, a habit tracker for iOS, Android and the web, run by Sara. Every screenshot comes from a real Camelus workspace. The feedback in it went through the same pipeline yours will: an AI model read each message, translated it and grouped it into themes, and Camelus ranked the themes. Titles and summaries in your workspace will read a little differently, because the AI writes them from your own feedback. The whole tour takes about 20 minutes. You can stop after step 5 and already have a ranked list of what your users want. **What you'll do** 1. Sign in and create a product 2. Connect your feedback sources 3. Triage the Inbox 4. Read the themes and their scores 5. Fix the grouping when it's wrong 6. Get to know the people behind the feedback 7. Add revenue from Polar 8. Read the daily briefing 9. Send a theme to where work happens 10. Tell people it shipped 11. Let agents and code read your themes 12. Invite your team, and keep control of your data ## 1. Sign in and create a product Go to [camelus.si/login](https://camelus.si/login) and click **Continue with Google**. The first sign-in creates your workspace on the Free plan. No card is needed. ![The Camelus sign-in page, with a single "Continue with Google" button.](https://camelus.si/docs/tutorial/login.webp "Sign in with Google. Your workspace is created on the first sign-in.") Camelus then asks for your first **product**: one app or site you want feedback about. Sara types *Habits*, its domain, and one sentence about what it does. ![The welcome screen with the product name "Habits", the domain "habits.app" and a short description filled in.](https://camelus.si/docs/tutorial/welcome.webp "The description is optional, but the AI reads it when it classifies feedback, so one good sentence pays off.") Under the name, Camelus shows the product's **slug** (`habits`). The REST API uses it to know which product a message is for. It can't be changed later, so pick a name you're happy with. Click **Create product**. The Inbox opens, empty, with a ready-to-run example of sending feedback by API. ![The empty Inbox: "Waiting for your first feedback", with a curl example below.](https://camelus.si/docs/tutorial/inbox-empty.webp "An empty Inbox shows every way to get feedback in, and a curl command you can run right away.") ## 2. Connect your feedback sources Open **Settings → Products → Habits**. The **Sources** card lists where feedback can come from, each with an on/off switch. Below it are the setup details for the widget, email forwarding and the API. ![The product settings page: the Sources list with switches, the widget's install snippet and settings, the email forwarding address and the API example.](https://camelus.si/docs/tutorial/product-sources.webp "One product, every source. Each one has a switch, and the Inbox shows which source every message came from.") You don't need all of them. Most teams start with one or two. ### The feedback widget The widget is a small **Feedback** button in the corner of your site or web app. It runs in its own Shadow DOM, sets no cookies and weighs under 15 KB. 1. Copy the snippet from the **Feedback widget** card and paste it before the closing `` tag. 2. Add your site under **Allowed origins**, here `https://habits.app`. The widget refuses to send from anywhere else. 3. Optionally change the position, the accent color, the language and the texts, then click **Save widget**. This is what Habits' visitors see: ![The Habits web app with the Camelus widget open in the bottom-right corner: Bug, Idea, Question and Other chips, a message box, an email field and a "Notify me when this is resolved" checkbox.](https://camelus.si/docs/tutorial/widget.webp "The widget on habits.app. Visitors can tag their message, and tick a box to hear back when it's resolved.") The **Notify me when this is resolved** box matters later: only people who tick it (or who emailed you) receive the "it shipped" email in step 10. If your users are signed in, you can tell the widget who they are, so their messages are linked to one person and count as verified. See [Identify users](https://camelus.si/docs/identify). ### Email forwarding Each product gets a private address like `p_habits-…@in.camelus.si`. Forward your support inbox to it, or set a filter that forwards only feature requests. Every email becomes feedback from its original sender. Camelus removes quoted replies and signatures, and for forwarded emails it keeps the person who first wrote, not the person who forwarded. See [Email forwarding](https://camelus.si/docs/email). ### The REST API Your backend, your helpdesk or an automation tool can send feedback with one request. Create a key in **Settings → API & MCP → New key**: ![The "New API key" dialog with the name "Habits backend" and the scopes "Send feedback" and "Read" checked.](https://camelus.si/docs/tutorial/api-key-new.webp "Name each key after where it's used, so you know which one to revoke later. The full key is shown once.") Then send messages from your server: ```bash curl https://api.camelus.si/v1/feedback \ -H "Authorization: Bearer ck_live_…" \ -H "Content-Type: application/json" \ -d '{ "product": "habits", "text": "Reminders stopped working after the last update on my Pixel 8.", "person": { "id": "u_1042", "email": "ana.novak@example.com", "name": "Ana Novak" } }' ``` A `person.id` sent from your server counts as a verified identity. `created_at` lets you import older messages with their real date, and `external_id` makes retries safe: the same id never creates a second item. The full reference is in [REST API](https://camelus.si/docs/api). ### CSV import Old feedback from a spreadsheet or a helpdesk export? In the Inbox, click **Import CSV** and pick the file. Camelus matches the columns by name, and you can change the mapping before importing. ![The CSV import dialog: "helpdesk-export.csv: 5 rows", with columns matched to Feedback text, Email, Name and Date.](https://camelus.si/docs/tutorial/csv-import.webp "Columns are matched by name. Map an External id column to skip rows you've already imported.") ### Added by hand Some of the best feedback comes from a sales call or a DM. Click **Add feedback** in the Inbox and paste what they said, with their email if you have it. ![The "Add feedback" dialog: notes from a call with a 40-person company that wants team challenges, with the title "Team challenges for companies" and the customer's email and name.](https://camelus.si/docs/tutorial/add-feedback.webp "Feedback you heard elsewhere goes through the same pipeline as everything else.") ### Polar cancellations If you sell through Polar, connecting it turns every cancellation reason into feedback, and puts plan and revenue on every person. That's step 7. ## 3. Triage the Inbox Everything arrives in the **Inbox**, from every source and every product, in real time. Each row shows who sent it, the product, the source, and the AI's one-line English summary. Below the summary are the type (bug, feature request, question, complaint or praise) and the theme the message was grouped into. ![The Inbox: a "Needs review (2)" section at the top, then messages from Polar, the widget, email and the API, each with a summary, a type badge and a theme.](https://camelus.si/docs/tutorial/inbox.webp "Every message, every source, one list. The filters narrow it down by product, source, type, sentiment or theme.") Click a message to open it on the right. Sara opens one written in French: ![A feedback item opened in the side panel: the original French text, its English translation, the AI summary with type, sentiment, urgency and confidence, the theme it belongs to, and the person who sent it.](https://camelus.si/docs/tutorial/inbox-item.webp "The original text is never changed. The translation and the summary sit next to it.") The panel shows, from top to bottom: - **The original message**, exactly as it was sent, and an **English translation** when it was written in another language. - **The AI summary**, with the type, sentiment, urgency, and how sure the AI was. Summaries never contain names, emails or other personal details. A second, rule-based pass removes any that slip through. - **The theme** the message was grouped into, and why, for example "Similar to this theme" with the similarity score. **Move to theme…** puts it somewhere else; **New theme** starts a theme from it. - **The person**: their other messages, whether their identity is verified, and their plan and revenue once Polar is connected. Keyboard shortcuts make triage fast: j and k move between messages, e archives, t jumps to the theme picker, and Esc closes the panel. ### Needs review Messages that look like spam, or that try to give instructions to the AI, don't go into themes. They wait at the top of the Inbox under **Needs review**. ![A message flagged "Instructions to AI": the panel says "This message seems to give instructions to the AI" with the buttons "Looks fine, group it" and "Spam".](https://camelus.si/docs/tutorial/inbox-review.webp "This message tried to tell the AI to rank it first. It's kept out of themes until someone decides.") Click **Looks fine, group it** to let it through, or **Spam** to move it out of the way. Feedback is never deleted on its own. ## 4. Read the themes and their scores **Themes** is where Camelus earns its keep. Every message about the same need, in any language and from any source, ends up in one theme, and the themes are ranked by **score**. ![The Themes list, ranked by score: dark mode first, then Android reminders, pausing streaks, an Apple Watch app and shared challenges, each with requesters, paying requesters and MRR affected.](https://camelus.si/docs/tutorial/themes.webp "The ranked list. Requesters counts people, not messages: someone who writes three times counts once.") Each row shows: - **Score**: how much this theme matters, explained below. - **Requesters**: how many different people asked. - **Paying** and **MRR affected**: how many of them pay you, and their total monthly revenue. This needs Polar (step 7); until then it shows "—". - **Trend**: *New* for a theme less than two weeks old, then *Rising*, *Stable* or *Falling* depending on the last seven days. Click a theme to open it: ![The dark mode theme: AI-written title and summary, the actions Send to…, Notify requesters, Edit, Merge and Split, the stats row (score 13.9, 8 requesters, 5 paying, $105 MRR affected), representative quotes, a 12-week chart and the people who asked.](https://camelus.si/docs/tutorial/theme.webp "A theme page: what people want, in their words, with the numbers behind it.") The title and summary are written by the AI from the messages' summaries, and rewritten as the theme grows. Once you edit them with **Edit**, the AI leaves them alone. **Representative quotes** are picked by code, not by the AI: the latest, the most important, then a mix of sources and people. ### Why this score? Click the score to see exactly where it comes from: ![The score breakdown: a table of requesters with the weight of their source, who they are, the type of feedback, the AI's confidence, the time decay, and what each person adds.](https://camelus.si/docs/tutorial/theme-score.webp "Every point of the score is accounted for. Paying customers weigh more, and old requests fade.") The rules are simple and the same for everyone: - **Each person counts once**, with their most important message. - **Who they are** changes the weight. An anonymous message counts 0.8, a known email 1.0, a verified user 1.2. A paying customer counts 1.5 plus a little more for higher revenue, and someone who cancelled in the last 90 days counts 2.0. - **The type** changes the weight too. Bugs, feature requests and complaints count fully, questions half, and praise very little. - **Time fades everything.** A request loses half its weight every 30 days unless the person writes again. The AI classifies and summarizes. It never computes a count, a revenue figure or a score; code does that. ## 5. Fix the grouping when it's wrong The AI groups well, but you know your product better. Everything it does can be changed, and Camelus never undoes what you did: - **Move** a message to another theme from its panel in the Inbox. Camelus never moves it back. - **Merge** two themes that are really one. - **Split** a theme that mixes two needs: select messages and move them to a new theme. - **Edit** the title and summary. In this workspace, the AI made two themes out of one Android bug: one about reminders arriving late, one about reminders stopping after an update. Sara merges the smaller one into the bigger one: ![The "Merge into another theme" dialog, with the target theme picked.](https://camelus.si/docs/tutorial/theme-merge.webp "Merging moves every message and requester into the theme you pick.") Every merge, split and move is recorded in the theme's **History**, and can be undone for 30 days: ![The theme history: the merge just made with an Undo button, an earlier merge struck through because it was undone, and the theme's start.](https://camelus.si/docs/tutorial/theme-history.webp "Changed your mind? Undo it from the history. An undone change stays listed, struck through.") Camelus also suggests merges when two themes look alike, but never merges on its own. ## 6. Get to know the people behind the feedback **People** lists everyone who sent feedback with an email or a user id, across all your products. ![The People list: names, emails, number of messages, products and when they last wrote.](https://camelus.si/docs/tutorial/people.webp "Everyone who wrote, across products. Search by name, email or id.") A person's page shows all their messages, the themes they're part of, and the updates they've received. With Polar connected, it also shows their plan and monthly revenue. ![Tom Baker's page: verified identity, 3 messages, Premium plan, $9 MRR, his feedback and the three themes he's part of.](https://camelus.si/docs/tutorial/person.webp "One customer, everything they told you, and what they pay.") Two buttons matter here: - **Merge duplicate**, for the same person with two emails. Their feedback moves to one person, and both addresses keep pointing to them. - **Delete**, for erasure requests under the GDPR. You can delete only their personal data, which keeps the anonymized summaries so theme counts don't move, or delete them and all their feedback. ## 7. Add revenue from Polar Ten requests from people who pay you are worth more than ten from people who don't. If you sell through [Polar](https://polar.sh), connect it in **Settings → Integrations** (Pro and Studio plans): 1. In Polar, create an organization access token with the `subscriptions:read` scope, and paste it into Camelus. 2. Add the webhook Camelus shows in Polar (**Settings → Webhooks → Add endpoint**) with every `subscription.*` event, and paste Polar's signing secret back into Camelus. ![The Integrations page: Polar connected, 9 subscriptions and 9 paying customers, the webhook endpoint, and Polar's products mapped to Habits.](https://camelus.si/docs/tutorial/integrations.webp "Camelus only reads subscriptions. It syncs once a day and on every webhook.") From then on: - Every person whose email matches a Polar customer gets their **plan** and **MRR**. Themes show how many requesters pay and how much revenue is affected, and paying customers weigh more in the score. - When someone cancels with a reason or a comment, it arrives in the Inbox as feedback from the **Polar** source, grouped like everything else. In the Inbox screenshot in step 3, the top two messages are cancellations: one customer found the price too high, another left over unreliable Android reminders. See [Polar](https://camelus.si/docs/polar) for the details. ## 8. Read the daily briefing You don't have to check Camelus every day. Every morning, at the time you choose, it emails a short digest of what changed, and the same digest lives under **Briefing**: ![The Briefing page: today's digest with a short opening paragraph, counts by source, top themes, new themes, urgent items and feedback from paying customers, and an Alerts panel.](https://camelus.si/docs/tutorial/briefing.webp "Today's digest, live. Past digests are listed below it.") All the numbers come from the database. The AI only writes the two-sentence opening, and Camelus checks it against the numbers before using it. On a quiet day, no email is sent. ![The digest email: "Today's feedback digest" with the opening, top themes, new themes, urgent items, feedback from paying customers, cancellations and what shipped.](https://camelus.si/docs/tutorial/email-digest.webp "The morning email. Every line links to the theme or the message.") Set it up in **Settings → Notifications**: the time, which products, and who receives it. On Pro and Studio there's also a weekly digest on Mondays, and **alerts**: an email right away for urgent feedback from paying customers, a theme that suddenly spikes, or a run of cancellations. Alerts never exceed 3 a day and respect your quiet hours; the rest wait for the next digest. ![The Notifications settings: digest time and products, alert quiet hours, and recipients.](https://camelus.si/docs/tutorial/notifications.webp "Pick the time, the products and the people. Alerts stay quiet at night.") ## 9. Send a theme to where work happens A theme is only useful if someone acts on it. **Destinations** send themes to the tools where your team works: Vicunia, n8n, Zapier, Make, Slack, Discord, or your own endpoint. In **Settings → Destinations → Add destination**, pick a preset. Sara sends themes to an n8n workflow that creates GitHub issues: ![The "Add a destination" form for the n8n preset: name "n8n: roadmap", the workflow's webhook URL, when to send, and the payload format.](https://camelus.si/docs/tutorial/destination-form.webp "Start from a preset. You choose whether themes go out only when you click, or also automatically.") Every request is signed. Camelus shows the signing secret once, so your workflow can check that requests really come from Camelus: ![The "Destination created" dialog with the signing secret, shown once, and the callback instructions.](https://camelus.si/docs/tutorial/destination-secret.webp "Copy the secret now: it won't be shown again. You can rotate it later.") Then, on any theme, click **Send to…** and pick the destination: ![The "Send to…" dialog listing the n8n destination with a Send button.](https://camelus.si/docs/tutorial/send-to.webp "One click sends the theme: title, summary, counts, quotes and score. No personal data unless you turn it on.") The workflow can **report back**. Each payload carries a callback URL, and when the workflow posts a status to it (planned, in progress, shipped), the theme shows it under **Linked work**: ![The "Linked work" card on the theme: the n8n destination, issue #482 and the status "planned".](https://camelus.si/docs/tutorial/linked-work.webp "The issue n8n created, and its status, right on the theme.") The **Settings → Destinations** page shows each destination's last delivery, a delivery log you can open, and buttons to test, pause or rotate the secret. Failed deliveries are retried for a day. ![The Destinations page with "n8n: roadmap": active, last delivery just now, HTTP 200.](https://camelus.si/docs/tutorial/destinations.webp "Every delivery is logged. A Test button sends a sample event.") See [Destinations](https://camelus.si/docs/destinations) and [Status callbacks](https://camelus.si/docs/callbacks). With [Vicunia](https://camelus.si/docs/vicunia), the agent can build the change itself and report "shipped" when it's deployed. ## 10. Tell people it shipped This is the part most teams skip, and the part customers remember. When a theme is marked **shipped**, either by you or by a destination reporting back, Camelus drafts an email to everyone who asked and wanted to hear back: ![The "Loop messages" card on the theme, with a shipped message ready for review.](https://camelus.si/docs/tutorial/loop-messages.webp "When the theme shipped, the draft was ready.") Open it to read and edit the draft: ![The "Shipped message" editor: the subject "Dark mode is here", a short AI-written message that starts with "Hi {name}," and includes the release link, and the button "Send to 2".](https://camelus.si/docs/tutorial/loop-editor.webp "The AI drafts, you decide. {name} becomes each person's first name.") The AI writes the draft from the theme, never invents features or dates, and includes the release link your workflow reported. You can rewrite it freely. Click **Send** and it goes out, one email per person: ![The email Olivia receives: "Hi Olivia," the news that dark mode is live with the link, the "Habits team" signature, and an unsubscribe line at the bottom.](https://camelus.si/docs/tutorial/email-loop.webp "What a requester receives. Every message explains why they're getting it and has a one-click unsubscribe.") The email only goes to people who asked to hear back: they ticked the box in the widget, or wrote by email. It's never sent to people who unsubscribed or whose address bounced. You can also use **Notify requesters** at any time to announce that something is planned, shipped, or won't be built, and **Reply** on a single message to answer one person. In **Settings → Loop messages** you can set the sender name and reply-to address, edit the templates the AI starts from, and choose to acknowledge new feedback automatically. ## 11. Let agents and code read your themes On Pro and Studio, the same data is available to your code and your AI tools. **Settings → API & MCP** lists your keys and shows how to connect an agent: ![The API & MCP page: the "Habits backend" key with its scopes, and the MCP server URL with setup snippets for Claude Code and other clients.](https://camelus.si/docs/tutorial/api-keys.webp "Keys for your servers, and an MCP server for agents.") - The [REST API](https://camelus.si/docs/api) reads themes and items, and can change a theme's status (`PATCH /v1/themes/:id`). - The [MCP server](https://camelus.si/docs/mcp) lets Claude or any agent ask "what are the top requests this month?" or "is anyone complaining about exports?". Only PII-free summaries and counts leave Camelus through the API and MCP, never original messages or emails. ## 12. Invite your team, and keep control of your data In **Settings → Team**, invite a teammate by email. They open the link, sign in with that Google account, and join the workspace. ![The Team page: Sara as owner, and an invite form for marta@habits.app with a role picker.](https://camelus.si/docs/tutorial/team.webp "Invite links expire after 7 days.") - **Owners and admins** manage products, sources, destinations, notifications, API keys and members. - **Members** read and triage the Inbox and themes, and can send themes and loop messages. **Settings → Workspace** holds the workspace name, its time zone (used for digests), and your data: ![The Workspace settings: name and time zone, Export, the Activity log of changes to members, keys and integrations, and Delete this workspace.](https://camelus.si/docs/tutorial/workspace.webp "Export everything, see who changed what, or delete the workspace.") - **Export** prepares everything in the workspace as JSON lines: products, feedback, people, themes, history, messages and the activity log, without secrets. The files are deleted after 24 hours. - **Activity** lists changes to members, keys, integrations, destinations, billing and data. - **Delete this workspace** removes everything, for everyone, right away. Export first if you want a copy. Plans and limits are on the [pricing page](https://camelus.si/pricing). The Free plan includes 1 product, 100 feedback items a month and 1 member; upgrade in **Settings → Billing**. Feedback that arrives over a limit is still stored and shown, and processed as soon as you upgrade or the month resets. Camelus never drops feedback. ## Where to go next - [Feedback widget](https://camelus.si/docs/widget) and [Identify users](https://camelus.si/docs/identify): install options, texts and verified users. - [REST API](https://camelus.si/docs/api): every endpoint, with the OpenAPI document. - [Destinations](https://camelus.si/docs/destinations) and [Status callbacks](https://camelus.si/docs/callbacks): payloads, signatures and retries. - [Polar](https://camelus.si/docs/polar): what the connector reads and how revenue is counted. - [MCP server](https://camelus.si/docs/mcp): connect Claude or another agent. --- Source: https://camelus.si/docs/api # REST API: send feedback, read themes > Camelus REST API reference: API keys and scopes, POST /v1/feedback, reading items and themes, changing a theme's status, limits and errors. Send feedback to Camelus from any server, and read the themes it builds, with plain HTTP requests. Responses never contain original feedback text or personal data: only AI summaries and counts. The machine-readable version of this page is the OpenAPI document at [api.camelus.si/v1/openapi.json](https://api.camelus.si/v1/openapi.json). It includes the webhook payloads too. ## Authentication Create an API key in **Settings → API & MCP**. Keys look like `ck_live_abc123_…`, are shown once, and belong to a workspace, not to a person. Send the key as a bearer token: ``` Authorization: Bearer ck_live_abc123_… ``` Each key has scopes: | Scope | Allows | Plans | | --- | --- | --- | | `feedback:write` | `POST /v1/feedback` | All | | `read` | Reading items and themes, and the [MCP server](https://camelus.si/docs/mcp) | Pro, Studio | | `themes:write` | Changing a theme's status | Pro, Studio | Keep keys on your server. Revoke a key in Settings when you no longer need it. ## Send feedback ```bash curl https://api.camelus.si/v1/feedback \ -H "Authorization: Bearer $CAMELUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "product": "habits", "text": "Export uses US dates, I am in France.", "external_id": "zendesk-4412", "person": { "id": "u_123", "email": "ana@example.com", "name": "Ana" }, "metadata": { "plan": "pro", "app_version": "2.3.1" } }' ``` | Field | Type | Notes | | --- | --- | --- | | `product` | string, required | The product's slug, shown on the product page. | | `text` | string, required | The feedback itself. Text beyond 10,000 characters is cut, and the item is marked truncated. | | `title` | string | Up to 200 characters. | | `external_id` | string | Your id for this message (a ticket number, a row id). Sending the same id twice creates one item. | | `person` | object | `id` (your user id), `email`, `name`. All optional. Without them the feedback is anonymous. | | `metadata` | object | Anything useful for triage: plan, app version, browser. Up to 4 KB of JSON. | | `page_url` | string | The page the feedback is about. | | `created_at` | ISO 8601 date-time | When the feedback was given, for imports. Defaults to now. | A new item returns `202 Accepted` with `{ "id": "k57c…", "status": "received" }`. Retries are safe. A request with the same `external_id` as an earlier one, or with no `external_id` and the same text from the same person within 10 minutes, returns `200 OK` with the first item's id and `"duplicate": true`. ## Read themes ```bash curl "https://api.camelus.si/v1/themes?product=habits&status=open&sort=score&limit=20" \ -H "Authorization: Bearer $CAMELUS_API_KEY" ``` `sort` is `score` (the default), `requesters`, `mrr`, `trend` or `recent`. `limit` goes up to 100. Themes that have only one item so far (candidates) aren't listed. Change a theme's status, with an optional note for its timeline: ```bash curl -X PATCH https://api.camelus.si/v1/themes/k97d… \ -H "Authorization: Bearer $CAMELUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "status": "planned", "note": "On the roadmap for November" }' ``` Statuses are `open`, `planned`, `in_progress`, `shipped`, `declined` and `closed`. A change fires `theme.status_changed` to your [destinations](https://camelus.si/docs/destinations), and `shipped` drafts an email to the people who asked. ## Reference ### POST /v1/feedback Stores one feedback item. Returns 202 for a new item, 200 with the same id for a repeat (same external_id, or same text from the same person within 10 minutes). Scope: `feedback:write`. ### GET /v1/feedback/{id} Processing results of one item: summary, type, sentiment, urgency and theme. No original text or personal data. Scope: `read`. ### GET /v1/themes Themes ranked by score (or another sort), optionally for one product and status. Scope: `read`. ### GET /v1/themes/{id} Summary, stats, up to 10 representative item summaries and linked external work. Scope: `read`. ### PATCH /v1/themes/{id} Sets the status and adds an optional note to the timeline. Fires theme.status_changed to subscribed destinations. Scope: `themes:write`. ### Theme Returned by `GET /v1/themes` (in `data`) and inside webhook payloads. | Field | Type | Notes | | --- | --- | --- | | `id` | string | | | `product` | object | | | `title` | string | | | `summary` | string or null | | | `type` | `bug` · `feature_request` · `question` · `complaint` · `praise` · `other` | | | `status` | `open` · `planned` · `in_progress` · `shipped` · `declined` · `closed` | | | `score` | number | | | `trend` | `new` · `rising` · `falling` · `stable` | | | `requesters` | integer | | | `paying_requesters` | integer | | | `mrr_affected_cents` | integer or null | null when no billing connector is set up; never estimated | | `item_count` | integer | | | `sentiment` | object | | | `last_item_at` | string or null | | | `url` | string | The theme in the Camelus app | ### Theme detail Returned by `GET /v1/themes/{id}` and `PATCH /v1/themes/{id}`: every Theme field, plus: | Field | Type | Notes | | --- | --- | --- | | `representative_items` | object[], optional | Up to 10, chosen by code: most recent, highest weight, diverse sources | | `external_links` | object[], optional | | ### Feedback item | Field | Type | Notes | | --- | --- | --- | | `id` | string | | | `product` | object | | | `source` | string | | | `status` | `received` · `processing` · `processed` · `needs_review` · `archived` · `spam` | | | `received_at` | string | ISO 8601 date-time, UTC | | `external_id` | string or null | | | `language` | string or null | | | `summary_en` | string or null | | | `type` | `bug` · `feature_request` · `question` · `complaint` · `praise` · `other` or null | | | `sentiment` | `negative` · `neutral` · `positive` or null | | | `urgency` | `low` · `medium` · `high` or null | | | `theme_id` | string or null | | ## Limits - 60 requests a minute per API key. Past that, the API answers `429` with a `Retry-After` header. - Request bodies up to 128 KB. - Past your plan's monthly item limit, feedback is still accepted and stored. It's never dropped. ## Errors Errors use standard HTTP status codes and a JSON body: ```json { "error": { "code": "invalid_body", "message": "person.email: Invalid email address" } } ``` | Status | Code | Meaning | | --- | --- | --- | | 400 | `invalid_json`, `invalid_body`, `invalid_query` | The body isn't JSON, or a field or parameter is missing or invalid. The message names it. | | 401 | `unauthorized` | The key is missing, malformed or revoked. | | 403 | `forbidden`, `plan_required`, `source_disabled` | The key lacks the scope, the plan doesn't include the read API, or the product's API source is turned off. | | 404 | `product_not_found`, `not_found` | No such product slug, item or theme in the key's workspace. | | 409 | `merged` | The theme was merged into another one. | | 413 | `too_large` | The body is too big. | | 429 | `rate_limited` | Too many requests for this key. Wait for the number of seconds in `Retry-After`. | --- Source: https://camelus.si/docs/widget # Feedback widget: install and identify users > Add the Camelus feedback widget to your site with one script tag, identify signed-in users with an HMAC, customize it and open it from your own button. The Camelus widget is a small feedback button for your site or app. Visitors write a message, optionally tag it as a bug, idea or question, and leave their email if they want to hear back. It shows up in your Inbox right away. ## Install Open **Settings → Products → your product → Feedback widget** and copy the snippet. It looks like this: ```html ``` Paste it before the closing `` tag. The script loads asynchronously and never blocks your page. It's under 15 KB gzipped. Then add your site to **Allowed origins**, for example `https://habits.app`. The widget only accepts feedback from these exact origins: scheme, host and port must match, so add `https://www.habits.app` separately if you use it. For local testing, turn on **Allow localhost**. The `pk_live_` key is public by design. It can only send feedback and read the widget's look, and only from your allowed origins. ## Identify signed-in users If your visitors are signed in, tell the widget who they are. Their feedback is then linked to the same person across messages, and the email field is hidden: ```js camelus('identify', { id: 'u_123', email: 'ana@example.com', name: 'Ana', hash: 'HASH_FROM_YOUR_SERVER' }); ``` Anyone can call `identify` from the browser console, so Camelus only trusts an identity it can verify. Create an **identity secret** in the widget settings (it's shown once) and compute the hash on your server: ```js // Node.js import crypto from "node:crypto"; const hash = crypto.createHmac("sha256", process.env.CAMELUS_IDENTITY_SECRET).update(user.id).digest("hex"); ``` ```python # Python import hmac, hashlib, os hash = hmac.new(os.environ["CAMELUS_IDENTITY_SECRET"].encode(), user_id.encode(), hashlib.sha256).hexdigest() ``` ```php // PHP $hash = hash_hmac('sha256', $user->id, getenv('CAMELUS_IDENTITY_SECRET')); ``` Verified identities weigh more when themes are ranked. Without a valid hash, the identity is kept as an unverified claim: it never attaches feedback to a person someone else verified. ## Open it from your own button Add `data-headless="true"` to the script tag to hide the floating button, then open the form yourself: ```js document.querySelector('#feedback').addEventListener('click', () => camelus('open')); // Preselect a type: bug, idea, question or other camelus('open', { type: 'bug' }); ``` ## Add context Send flat key/value details with each message (at most 2 KB, strings and numbers only): ```js camelus('meta', { plan: 'pro', app_version: '2.3.1' }); ``` The widget also records the page URL (without query string or fragment), page title, viewport, browser and OS family, and language. ## Customize In the widget settings you can change the accent color, the position (bottom right or left), the language and every text. Data attributes on the script tag override the settings for one page: `data-accent="#2563EB"`, `data-position="left"`, `data-locale="fr"`. The widget speaks English, French, German, Spanish and Slovenian, and follows the visitor's browser language unless you pick one. It follows the visitor's light or dark preference, respects reduced motion, traps focus while open and closes with Escape. ## Privacy The widget sets no cookies, stores no identifiers and doesn't fingerprint visitors. The only thing it keeps is the unsent draft, in the tab's session storage. It renders in a Shadow DOM, so its styles never touch your page and yours never touch it. --- Source: https://camelus.si/docs/identify # Identify users > How Camelus recognizes the person behind each message: verified ids from your server or a signed widget identity, emails, claims, merges and deletion. Camelus ranks themes by **people**, not messages: someone who writes five times counts once. To do that, it needs to know who sent each message. This page explains how people are recognized, and how to make sure your signed-in users are. ## How Camelus recognizes a person Each message can carry a user id, an email and a name. Camelus matches them to a person in this order: 1. A **verified user id**: sent by your server with an API key, or by the widget with a valid signature. 2. An **email address**. 3. An **unverified user id**: a claim from a browser that Camelus can't check. Without an id or an email, the message is anonymous: it counts as its own requester. An unverified claim never attaches feedback to a person someone else verified, so nobody can borrow a paying customer's weight by typing their id. How a person is known also changes how much they weigh when themes are ranked: unknown 0.8, claimed 1.0, verified 1.2, and more for paying customers when [Polar](https://camelus.si/docs/polar) is connected. ## From your server (REST API) Requests with an API key come from your server, so the user id is trusted as is: ```bash curl https://api.camelus.si/v1/feedback \ -H "Authorization: Bearer ck_live_…" -H "Content-Type: application/json" \ -d '{"product": "habits", "text": "Export to CSV please", "person": {"id": "u_123", "email": "ana@example.com", "name": "Ana"}}' ``` Use the same id your app uses for that user, every time. See the [REST API reference](https://camelus.si/docs/api). ## From the widget The widget runs in the browser, where anyone can call `identify` from the console. So Camelus only trusts an identity that comes with a signature from your server: 1. In the product's widget settings, create an **identity secret**. It's shown once: store it on your server. 2. On your server, sign the user id with it (HMAC-SHA256, hex): ```js // Node.js import crypto from "node:crypto"; const hash = crypto.createHmac("sha256", process.env.CAMELUS_IDENTITY_SECRET).update(user.id).digest("hex"); ``` ```python # Python import hmac, hashlib, os hash = hmac.new(os.environ["CAMELUS_IDENTITY_SECRET"].encode(), user_id.encode(), hashlib.sha256).hexdigest() ``` ```php // PHP $hash = hash_hmac('sha256', $user->id, getenv('CAMELUS_IDENTITY_SECRET')); ``` 3. Pass it to the page and call: ```js camelus('identify', { id: 'u_123', email: 'ana@example.com', name: 'Ana', hash: 'HASH_FROM_YOUR_SERVER' }); ``` With a valid hash, the person is verified. Without one (or with a wrong one), the id is kept as an unverified claim. Never put the secret itself in the page. ## Email and forwarded emails Emails sent to a product's forwarding address are linked to the sender's address. For a forwarded support email, Camelus uses the original sender, not you. See [Email forwarding](https://camelus.si/docs/email). ## Duplicates and merges The same person can show up twice, for example with a personal and a work email. In **People**, open one and **Merge** the other into it: their feedback, counts and themes combine, and future messages from either address find the merged person. ## Deleting a person On a person's page, **Delete** removes their personal data, either keeping anonymized summaries for the counts or removing their feedback entirely. Use it when someone asks you to delete their data. --- Source: https://camelus.si/docs/email # Email forwarding: feedback from your inbox > Forward your support inbox to your product's Camelus address. Each email becomes feedback from its sender, with quoted replies and signatures removed. Every product has its own forwarding address. Send email to it, and each message becomes a feedback item in your Inbox. ## Find your address Open **Settings → Products → your product → Email forwarding**. The address looks like `p_habits-x7k2q9mb@in.camelus.si`. Copy it. ## Forward your support inbox Set up a forwarding rule in your mail provider. In Gmail: **Settings → Forwarding and POP/IMAP → Add a forwarding address**, then a filter that forwards the messages you want (for example everything sent to `support@`). Most providers have the same option. You can also forward a single email by hand. Camelus recognizes forwarded messages (Gmail, Apple Mail, Outlook, in several languages) and uses the **original sender** as the person, not you. ## What's kept - The sender's email and name become a person in **People**, so several emails from the same customer are counted once per theme. - The subject becomes the item's title (without `Re:` and `Fwd:`). - The body becomes the feedback text, with quoted reply chains and signatures removed. - Attachments aren't stored. Their names and sizes are kept as metadata. Email senders count as unverified identities: a From address can be forged. ## Replies If people who email you expect to hear back, keep **People who email expect to hear back** on. Camelus can then tell them when what they asked for ships. ## Limits Each product accepts up to 200 emails a day. If you need a new address (for example because the old one leaks to spammers), click **New address**: the old one stops working right away. --- Source: https://camelus.si/docs/destinations # Destinations: send themes to Linear, GitHub, Slack and more > Send Camelus themes to Vicunia, n8n, Zapier, Make, Slack, Discord or any endpoint: signed webhooks, events, payloads, retries and recipes. A **destination** sends themes from Camelus to another app: Vicunia, an n8n, Zapier or Make workflow (which can open a Linear, GitHub or Jira issue), a Slack or Discord channel, or your own endpoint. They're all the same thing underneath: a signed HTTPS webhook. Presets only fill in the form. ## Add one **Settings → Destinations → Add destination**, then pick a preset: | Preset | Sends | Reports back | | --- | --- | --- | | [Vicunia](https://camelus.si/docs/vicunia) | The theme as a Vicunia request | Build progress and "shipped", through Vicunia's source callback | | n8n, Zapier, Make | The [canonical JSON](#payload) | Your workflow calls the [status callback](https://camelus.si/docs/callbacks) | | Slack, Discord | A short message to an incoming-webhook URL | No | | Webhook | The canonical JSON, to any HTTPS endpoint | Your code calls the status callback | You choose: - **Products**: all, or some. - **When to send**: by hand with **Send to…** on a theme, automatically on events (Pro), or both. - **Filters** for automatic theme events: a minimum score, a minimum number of requesters, types, paying requesters only. - **Auth header**: an extra header such as `Authorization: Bearer …`, stored encrypted. The **signing secret** (`whsec_…`) is shown once when you create the destination. **Rotate secret** makes a new one; for 24 hours requests are signed with both, so you can switch your receiver over without missing anything. Use **Test** to send a `test.ping` event. The **delivery log** shows every request with its status code, timing, body and the first 2 KB of the response, with **Retry** and **Replay**. ## Events | Event | When | | --- | --- | | `theme.sent` | Someone clicks **Send to…** on a theme | | `theme.created` | A theme gets its second item (or an urgent bug) | | `theme.rising` | A theme's trend turns to rising | | `theme.threshold_reached` | A theme passes the destination's filters (once per theme) | | `theme.status_changed` | A theme's status changes, in Camelus or through a callback | | `theme.merged` | Two themes are merged (the payload is the surviving theme) | | `feedback.received` | A feedback item is processed | | `feedback.urgent` | An item is classified as high urgency | | `digest.ready` | The daily or weekly digest is computed | | `test.ping` | The **Test** button | ## Payload ``` POST https://your-endpoint.example.com/camelus Content-Type: application/json User-Agent: Camelus-Webhooks/1 Camelus-Event: theme.sent Camelus-Delivery: dlv_6f1c… Camelus-Timestamp: 1792915200 Camelus-Signature: v1=5c2a… Camelus-Version: 2026-10-01 ``` ```json { "id": "evt_9b2e…", "type": "theme.sent", "created_at": "2026-10-25T08:00:00.000Z", "workspace": { "id": "k17…" }, "product": { "id": "k57…", "slug": "habits", "name": "Habits", "domain": "habits.app" }, "data": { "theme": { "id": "k97d…", "title": "CSV export ignores date locale", "summary": "Exports use US dates whatever the user's locale.", "type": "bug", "status": "open", "score": 4.2, "trend": "rising", "requesters": 17, "paying_requesters": 6, "mrr_affected_cents": null, "item_count": 21, "sentiment": { "negative": 82, "neutral": 18, "positive": 0 }, "last_item_at": "2026-10-25T07:41:00.000Z", "url": "https://camelus.si/app/themes/k97d…", "representative_items": [ { "id": "k3a…", "summary_en": "CSV export uses US dates for a French user.", "source": "widget", "received_at": "2026-10-25T07:41:00.000Z" } ] } }, "callback": { "url": "https://api.camelus.si/v1/callbacks/k97d…", "token": "cbt_…" } } ``` Payloads carry AI summaries and counts, never original text, names or emails. A workspace owner can turn on **Include requester emails** for one destination (for your own CRM, say); that choice is logged. `mrr_affected_cents` is `null` until a billing connector is set up: it's never estimated. Every schema is in the [OpenAPI document](https://api.camelus.si/v1/openapi.json), under `webhooks`. ## Verify the signature The signature is HMAC-SHA256, keyed with the whole signing secret, over `{timestamp}.{raw body}`. During a rotation the header holds two signatures, `v1=…,v1=…`; accept either. ```js import crypto from "node:crypto"; export function verifyCamelus(rawBody, headers, secret) { const ts = headers["camelus-timestamp"]; if (!ts || Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false; // older than 5 minutes: a replay const expected = crypto.createHmac("sha256", secret).update(`${ts}.${rawBody}`).digest("hex"); return (headers["camelus-signature"] ?? "").split(",").some((part) => { const sig = part.trim().replace(/^v1=/, ""); return sig.length === expected.length && crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected)); }); } ``` Use the raw body exactly as received, before any JSON parsing. ## Delivery - Answer with any `2xx` within 10 seconds. Redirects are followed (at most 3). - Anything else is retried after about 1 minute, 5 minutes, 30 minutes, 2 hours, 6 hours and 12 hours: 7 attempts over a day. `410 Gone` turns the destination off right away. - After 20 failed deliveries in a row, or 3 days of failures, the destination is paused and the owner gets an email. **Resume** it once the endpoint works. - Order isn't guaranteed. Use `created_at` to order events, and `Camelus-Delivery` (the same on every retry) to ignore repeats. - URLs must be public `https://` addresses. Local and private networks are refused, also after DNS resolution and after redirects. ## n8n Two ready-made workflows: download, then **Import from file** in n8n. - [Camelus → Linear](https://camelus.si/recipes/n8n-linear.json): a sent theme becomes a Linear issue; the callback reports it as planned, and as shipped when the issue is completed. - [Camelus → GitHub Issues](https://camelus.si/recipes/n8n-github.json): the same with a GitHub issue, shipped when it's closed. After importing: paste your signing secret into the **Verify** node, pick your Linear team or GitHub repository and credentials, then copy the workflow's production webhook URL into a Camelus destination (preset n8n). The callback URL and token travel in a footer of the issue, so closing it reports back without a database. ## Zapier 1. Create a Zap with **Webhooks by Zapier → Catch Raw Hook**, and paste its URL into a destination (preset Zapier). 2. Add a **Code by Zapier** step to check `Camelus-Signature` with the snippet above (the raw body and headers are in the trigger's output). 3. Add **Linear → Create Issue** or **GitHub → Create Issue**, with the theme's title, summary and `url`. Put `callback.url` and `callback.token` in the description. 4. In a second Zap triggered when the issue is completed or closed, add **Webhooks by Zapier → POST** to the callback URL from the description, with the header `Authorization: Bearer ` and the body `{"status": "shipped", "external_id": "", "external_url": ""}`. ## Make 1. Start a scenario with **Webhooks → Custom webhook** and paste its address into a destination (preset Make). Turn on **Get request headers** and **JSON pass-through** so the raw body is available for the signature. 2. Add **Linear → Create an issue** or **GitHub → Create an issue**, mapping `data.theme.title`, `data.theme.summary` and `data.theme.url`, plus the callback block. 3. In a second scenario watching for completed or closed issues, add **HTTP → Make a request**: `POST` to the callback URL, header `Authorization: Bearer `, JSON body with `status: shipped`. ## Slack and Discord Create an incoming webhook in Slack (**Apps → Incoming Webhooks**) or Discord (**Channel settings → Integrations → Webhooks**) and paste its URL. By default they get new themes, rising themes, urgent feedback and the digest. Mentions in summaries never ping anyone. --- Source: https://camelus.si/docs/callbacks # Status callbacks: report progress on a theme > How the app that received a theme reports planned, in progress or shipped back to Camelus, and what each status changes. When Camelus sends a theme to a [destination](https://camelus.si/docs/destinations), the app on the other end can report what happened to it: planned, in progress, shipped. The report shows on the theme under **Linked work**, can change the theme's status, and a "shipped" report drafts an email to the people who asked for it. ## Report a status Every theme payload carries a `callback` block: ```json "callback": { "url": "https://api.camelus.si/v1/callbacks/k97d…", "token": "cbt_…" } ``` POST to that URL with the token as a bearer token: ```bash curl https://api.camelus.si/v1/callbacks/k97d… \ -H "Authorization: Bearer cbt_…" \ -H "Content-Type: application/json" \ -d '{ "status": "shipped", "external_id": "LIN-412", "external_url": "https://linear.app/acme/issue/LIN-412", "deploy_url": "https://habits.app", "note": "Merged in PR #88" }' ``` | Field | Type | Notes | | --- | --- | --- | | `status` | `planned` · `in_progress` · `shipped` · `declined` · `failed`, required | See below. | | `external_id` | string | Shown on the theme, e.g. an issue number. | | `external_url` | URL | A link to the issue or pull request. | | `deploy_url` | URL | Where the change is live, for `shipped`. It goes into the email to requesters. | | `note` | string | Plain text, up to 500 characters. Shown on the theme's timeline. | The answer is `200` with the theme's status: `{ "ok": true, "theme_status": "shipped" }`. ## What each status does - `planned`, `in_progress`, `shipped` move the theme forward. A callback never moves a theme back (a late `in_progress` after `shipped` is recorded but doesn't change the status), and never reopens a declined or closed theme. - `shipped` also drafts a **shipped** email to the requesters who asked to hear back. Someone reviews and sends it from the theme, unless **auto-send on shipped** is on in Settings → Loop messages. - `declined` adds a note and asks on the theme page whether to decline the theme too. Camelus never declines a theme on its own. - `failed` adds a note and changes nothing else. ## Details - The token works for one theme and one destination. Deleting the destination revokes its tokens. - Instead of the token you can sign the request like an outbound webhook: `Camelus-Timestamp` and `Camelus-Signature: v1=` with the destination's signing secret. Timestamps older than 5 minutes are refused. - Repeats are safe: the same status with the same `external_id` is applied once, and answered with `"duplicate": true`. - If the theme was merged since, the report goes to the theme it was merged into. - At most 60 callbacks a minute per theme and destination. --- Source: https://camelus.si/docs/mcp # MCP server: ask what users want > Connect Claude or any MCP client to Camelus: the server URL, API key auth, and the tools for top themes, search and digests. Camelus runs an MCP server, so Claude, Alpaga's analyst or any agent that speaks the Model Context Protocol can ask what your users want: "what are the top requests on habits.app?", "is anyone complaining about exports?". ## Connect - **URL**: `https://api.camelus.si/mcp` (Streamable HTTP) - **Auth**: a workspace API key with the `read` scope, as `Authorization: Bearer ck_live_…`. Add `themes:write` to let the agent change theme statuses. Create the key in **Settings → API & MCP** (Pro and Studio plans). Claude Code: ```bash claude mcp add --transport http camelus https://api.camelus.si/mcp \ --header "Authorization: Bearer ck_live_…" ``` Clients with a JSON config: ```json { "mcpServers": { "camelus": { "type": "http", "url": "https://api.camelus.si/mcp", "headers": { "Authorization": "Bearer ck_live_…" } } } } ``` ## Tools | Tool | What it returns | | --- | --- | | `list_products()` | The workspace's products and their slugs. | | `get_top_themes(product?, status?, sort?, limit?)` | Themes ranked by score (or by requesters, MRR, trend, recency). | | `get_theme(theme_id)` | Summary, stats, up to 10 representative feedback summaries and linked external work. | | `search_feedback(query, product?, since?, limit?)` | The feedback items closest in meaning to the query, with their theme. | | `get_digest(date?)` | The daily digest for a date, or the latest one. | | `update_theme_status(theme_id, status, note?)` | Changes a theme's status. Needs `themes:write`. | Every call is limited to the key's workspace. Results are AI summaries and counts: no original feedback text, names or emails. Summaries come from what users wrote, so agents should treat them as data, not instructions. ## Limits - 60 tool calls a minute per key. - `search_feedback` embeds the query with the same model as the feedback, which counts toward the workspace's monthly AI budget. When the budget is spent, search pauses until next month. - The server is stateless: no sessions, no event stream. Each request is answered on its own. --- Source: https://camelus.si/docs/vicunia # Vicunia: from user feedback to shipped change > Connect Camelus to Vicunia: send a theme as a request, and get build progress and shipped status back, with an email to requesters. [Vicunia](https://vicunia.si) turns a request into a pull request and ships it. Connected to Camelus, a theme your users asked for can go straight to Vicunia, and when the change is deployed, the people who asked hear about it. ## Set it up 1. **In Vicunia**, open the project, add a source with **public trust** (theme text comes from your end users, so Vicunia always asks for approval and never auto-merges it), and copy its key and signing secret (**Show secret**). 2. **In Camelus**, go to **Settings → Destinations → Add destination → Vicunia**: - **URL**: Vicunia's requests endpoint, `https://actions.vicunia.si/api/requests`. A self-hosted Vicunia serves it on its HTTP actions origin (`CONVEX_SITE_ORIGIN`), not on the API origin. - **Auth header value**: `Bearer `. - **Vicunia signing secret**: the source's signing secret. 3. Camelus shows a **callback URL** once the destination is created: `https://api.camelus.si/v1/callbacks/vicunia/`. Paste it into the Vicunia source's **callback URL**. ## What happens - **Send to… → Vicunia** on a theme sends one Vicunia request: the theme's title, its summary, up to 5 representative summaries and the counts, with `external_id: camelus_theme__`. Each send has its own number, so each gets its own Vicunia job. No requester emails are sent; Camelus emails requesters itself. - Vicunia reports every job change to the callback URL, signed with the source's secret. Camelus maps it: | Vicunia | Camelus | | --- | --- | | `queued`, `running`, `pr_open`, `awaiting_merge_approval`, `merged` | Theme → **In progress** | | `deployed` | Theme → **Shipped**, with the deploy URL, and a "shipped" email drafted for requesters | | `rejected` | A note, and the theme page asks whether to decline the theme | | `failed`, `deploy_failed`, `blocked_by_policy` | A note on the theme | | `pending_approval` | Nothing yet | The pull request link and deploy URL show under **Linked work** on the theme. ## Locally Both apps refuse private addresses by default. To connect two local stacks, set `ALLOW_PRIVATE_DESTINATIONS=true` in Camelus's `.env` and `ALLOW_PRIVATE_CALLBACKS=true` in Vicunia's (both only work when the site URL is local), and use `http://host.docker.internal:` addresses between the containers. --- Source: https://camelus.si/docs/polar # Polar: paying customers and cancellation reasons > Connect your Polar organization to Camelus: plan and revenue on every requester, MRR affected per theme, and cancellation reasons as feedback. If you sell through [Polar](https://polar.sh), connect your organization and Camelus learns who pays you. Paying customers weigh more in theme scores, each theme shows how much monthly revenue it touches, and when someone cancels with a reason, that reason lands in your Inbox as feedback. The connector is read-only and on the Pro and Studio plans. ## What you get - **Plan and revenue on people.** Every requester whose email matches a Polar customer shows their plan and monthly revenue (MRR). Yearly plans count as a twelfth a month. Trials count as not paying yet. - **Better ranking.** A paying requester weighs more than an unknown one, and a customer who cancelled in the last 90 days weighs the most: they told you why they left. See [how the score works](https://camelus.si/docs#4-themes-and-the-score). - **MRR affected** on each theme: the monthly revenue of the distinct paying customers who asked for it. Without Polar it shows "—": Camelus never guesses revenue. - **Cancellation reasons as feedback.** When a customer cancels and picks a reason or writes a comment, it becomes an item from the **Polar** source, grouped into themes like any other feedback. - **Alerts** (with alerts on in Settings → Notifications) for urgent feedback from paying customers, and when three or more customers of a product cancel with a reason in a week. - **Digests** list complaints from paying customers and cancellations. ## Connect 1. In Polar, open **Settings → Developers → New token**. Give it the `subscriptions:read` scope only. 2. In Camelus, open **Settings → Integrations**, paste the token, pick **Production** (or **Sandbox** for a Polar sandbox organization) and click **Connect Polar**. The first sync starts right away. Camelus then syncs once a day: active subscriptions, plus those cancelled in the last 90 days. On the first sync, cancellation reasons from the last 30 days are imported. ## Add the webhook (recommended) Without it, changes arrive with the next daily sync. With it, they arrive in seconds. 1. In Polar, open **Settings → Webhooks → Add endpoint**. 2. Paste the **Endpoint URL** shown in Settings → Integrations (`https://api.camelus.si/v1/polar/connector/…`). Format: **Raw**. 3. Select every `subscription.*` event. 4. Copy the signing secret Polar shows (`whsec_…`) and paste it into **Signing secret** in Camelus. Camelus checks the signature of every delivery and ignores anything older than five minutes. ## Map your products Cancellation reasons go to a Camelus product. With a single product, they all go there. With several, pick a Camelus product for each Polar product under **Products** in Settings → Integrations; reasons from unmapped Polar products aren't imported. Plans and revenue count for everyone either way. Each product also has a **Polar cancellations** source in its settings, with an on/off switch. ## Privacy - The token is encrypted at rest and only decrypted on the server to call Polar. It's never shown again; Camelus shows its last four characters. - Camelus reads subscriptions: the customer's email, product, amount, status and cancellation reason. It never writes to Polar. - Revenue and plan stay inside Camelus. [Destinations](https://camelus.si/docs/destinations) receive counts (paying requesters, MRR affected), never who pays what. - **Disconnect** deletes the token and the cached subscriptions, and removes plans and revenue from people. Cancellation feedback already in the Inbox stays. --- Source: https://camelus.si/legal/privacy # Privacy policy > What camelus.si and the Camelus app collect, why, who processes it, how long it's kept, and how to export or delete it. This page covers the Camelus website, camelus.si, and the Camelus app. It says what we collect, why, who helps us process it, how long we keep it, and how you can get a copy or have it deleted. There are two kinds of data here. **Your account and workspace** (your name, email, settings, billing): for these, Camelus decides how they're used. **The feedback your products receive** (messages and the details of the people who sent them): you decide what's collected and why, and Camelus processes it for you, under the [data processing agreement](https://camelus.si/legal/dpa). ## The website The website works without cookies. If you click **Accept** in the cookie banner, we use Google Analytics 4 to learn which pages help people and which plans are bought. Until then, Google Analytics runs in a cookieless mode, without identifiers, and a purchase isn't linked to your visit. We don't use advertising features and we don't sell data. Change your choice at any time with **Cookie preferences** in the footer. ## Your account When you sign in with Google, we store your name, email address and photo. We ask Google for nothing else. We also store your workspaces, their members, your settings (such as light or dark theme) and an activity log of changes to members, keys, integrations, billing and exports, which workspace admins can see. ## Feedback you send to Camelus Camelus stores the feedback your products receive: the text, and whatever your integration sends with it, such as the sender's name, email address, user id, page URL and metadata. Only members of your workspace see the original text. Each message is read once by an AI model that writes a short English summary, translates it, and classifies it. Personal details are left out of the summary, and a rule-based pass removes any that slip through. Summaries, not original text, are what Camelus uses to group feedback and what leaves the app through the API, MCP and destinations (unless you turn on personal data for a destination). If you connect Polar, Camelus reads your customers' subscriptions (email, product, amount, status, cancellation reason) to show plans and revenue. It never writes to Polar. Workspace API keys and invite links are stored as hashes; third-party tokens and secrets are encrypted. ## Emails to your users When you send a loop message, Camelus emails the people who asked to hear back, from Camelus's sending domain, with an unsubscribe link. Unsubscribes, hard bounces and spam complaints stop further emails to that address. ## Who processes data for us The full list, with what each one receives and where, is on the [subprocessors page](https://camelus.si/legal/subprocessors): Google (sign-in, analytics with consent), OpenAI (AI processing of feedback text, without storage for training), Resend (email), Polar (payments) and the servers that host Camelus. ## How long we keep it - **Feedback history** follows your plan: 6 months on Free, 24 months on Pro and Studio. Older items keep their summary and classification, so theme counts stay right, but lose the original text, title, page URL and metadata. People who haven't sent feedback for that long lose their name, email and ids. Loop message delivery records, digests and alerts that old are deleted. - **The webhook delivery log** keeps 90 days. - **Exports** are deleted 24 hours after they're ready. - **Your account and workspaces** are kept until you delete them. When you delete a workspace, access ends at once and its data is deleted within minutes. Backups that contain it expire within 30 days. - **Billing records** are kept by Polar as long as tax law requires. ## Your rights - **Get a copy:** workspace owners can export everything in **Settings → Workspace → Export**. - **Delete:** owners can delete a workspace, and their account with it, in **Settings → Workspace**. A requester's data can be deleted from their page in **People**. - **Correct or object:** write to [hello@camelus.si](mailto:hello@camelus.si). If you sent feedback to a product that uses Camelus, the company behind that product decides what happens to it: ask them first. If you can't reach them, write to us and we'll pass your request on. If you're in the EU, you can also complain to your data protection authority. --- Source: https://camelus.si/legal/terms # Terms of service > The terms for using Camelus during early access: the service, your content and acceptable use. These terms are a working draft. The final terms will be published before Camelus launches paid plans. ## The service Camelus collects, organizes and ranks feedback about your products. You can use it on the Free plan while it's in early access. Features and limits may change during this period. We'll tell you before a change removes something you use. ## Your content The feedback you send to Camelus stays yours. We process it only to provide the service to you. You're responsible for having the right to send it, including any personal data of the people who wrote it. ## Acceptable use Don't use Camelus to send spam, to store data you aren't allowed to process, or to try to access other workspaces. We may suspend accounts that do. ## No warranty During early access, Camelus is provided as is. We work to keep it available and your data safe, but we can't promise uninterrupted service. ## Contact Questions about these terms: [hello@camelus.si](mailto:hello@camelus.si). --- Source: https://camelus.si/legal/dpa # Data processing agreement > The GDPR Article 28 agreement for the feedback data Camelus processes for you: roles, security measures, subprocessors, breaches and deletion. This data processing agreement (DPA) is part of the [terms of service](https://camelus.si/legal/terms). It applies when you use Camelus to process personal data of the people who send feedback about your products, as required by Article 28 of the GDPR. You accept it by using Camelus; no signature is needed. If you need a signed copy, write to [hello@camelus.si](mailto:hello@camelus.si). ## 1. Roles You (the customer) are the **controller** of the feedback data. Camelus is the **processor**: it processes that data only to provide the service to you, on your documented instructions. Your instructions are the terms, this DPA, and what you configure in the app (sources, destinations, loop messages, integrations). ## 2. The processing - **Subject matter and purpose:** collecting, storing, summarizing, translating, classifying and grouping feedback about your products; showing it to your workspace; sending summaries to the destinations you configure; emailing the people who asked to hear back. - **Data subjects:** people who send feedback to your products, and your customers if you connect Polar. - **Personal data:** names, email addresses, user ids, page URLs, metadata your integration sends, the content of feedback messages, and (with Polar) plan, revenue and cancellation reasons. - **Special categories:** none are intended. Don't send them; if feedback contains them, it's processed like any other text. - **Duration:** while your workspace exists, then as described in section 8. ## 3. Our obligations Camelus will: - process the data only on your instructions, and tell you if an instruction seems to break data protection law; - make sure everyone who can access it is bound to confidentiality; - protect it with the measures in section 6; - help you answer requests from data subjects (the app lets you export, correct and delete a person's data) and with data protection impact assessments, where reasonable; - tell you without undue delay, and within 48 hours of becoming aware, of a personal data breach affecting your data, with what we know about it; - make available the information needed to show compliance with this DPA, and allow audits by you or an auditor you appoint, with 30 days' notice, at most once a year unless a breach or an authority requires it. ## 4. Subprocessors You authorize the subprocessors on the [subprocessors page](https://camelus.si/legal/subprocessors). We give each one data protection obligations no weaker than this DPA, and we're responsible for them. We'll announce a new subprocessor that receives feedback data at least 30 days in advance; you can object, and if we can't address the objection, you can end the agreement and get a refund of prepaid fees for the remaining period. ## 5. International transfers Where subprocessors process data outside the EU/EEA, transfers rely on an adequacy decision (including the EU-US Data Privacy Framework) or the European Commission's standard contractual clauses. ## 6. Security measures - Encryption in transit (TLS) for every connection, and at rest for stored data. Third-party tokens and secrets are additionally encrypted with AES-GCM; API keys and invite tokens are stored only as hashes. - Strict separation between workspaces: every request is checked against the workspace of the signed-in user or API key. - Feedback text is treated as untrusted: it's never executed, and it's never rendered as HTML. - Only PII-free summaries leave the app through the API, MCP and destinations, unless an owner turns on personal data for a destination; that choice is recorded in the activity log. - Outbound requests are protected against server-side request forgery; inbound webhooks are signature-checked. - Logs don't contain feedback text, emails or tokens. - Daily backups, with restores tested. - An activity log of changes to members, keys, integrations, destinations, billing and exports. ## 7. Data subject requests If a data subject contacts Camelus directly about your data, we'll forward the request to you and won't answer it ourselves unless you ask us to. ## 8. Deletion and return You can export your workspace at any time (**Settings → Workspace → Export**). When you delete a workspace, its data is deleted within minutes; backups that contain it expire within 30 days. Feedback older than your plan's retention period is anonymized automatically, as described in the [privacy policy](https://camelus.si/legal/privacy). ## 9. Liability and precedence Liability under this DPA follows the terms of service. If this DPA and the terms conflict about personal data, this DPA wins. --- Source: https://camelus.si/legal/subprocessors # Subprocessors > The companies that process personal data for Camelus, what each one receives, and where. These companies process personal data for Camelus. Each one gets only what its job needs. We'll update this page at least 30 days before adding a subprocessor that receives feedback data; subscribe to changes by writing to [hello@camelus.si](mailto:hello@camelus.si). | Subprocessor | What it does | What it receives | Where | | --- | --- | --- | --- | | Server hosting | Runs the Camelus servers and stores all data and backups | Everything stored in Camelus, encrypted in transit and at rest | Listed here before launch | | OpenAI | Reads each feedback message once to summarize, translate and classify it, and embeds summaries for grouping | Feedback text and product descriptions; requests are sent with storage turned off and aren't used for training | United States | | Resend | Sends Camelus emails (digests, alerts, invites, loop messages) and receives forwarded feedback emails | Recipient addresses, email content, forwarded emails | United States | | Polar | Payments, invoices and tax for Camelus plans | The workspace owner's email and billing details. Polar is the merchant of record | United States | | Google | Sign-in with Google; Google Analytics on the website, only after consent | Name, email and photo at sign-in; analytics events with a pseudonymous id | United States | Data sent to the United States is covered by the EU-US Data Privacy Framework where the provider is certified, and by the European Commission's standard contractual clauses otherwise. If you connect your own Polar organization or set up destinations (Slack, Discord, n8n, Zapier, Make, Vicunia or your own endpoint), you choose to send data to those services. They aren't Camelus subprocessors: they work for you.