Documentation
Lite Feedback is a feedback widget you add to any website with a single line of code. Visitors send you a message in one click — and you receive it with full context (page, device, browser, OS, timezone, and any custom data you attach). This guide covers installation, customization, developer integration, identifying your users, listening to events, the REST API, and the MCP server for coding assistants. It also covers webhooks and Slack notifications.
YOUR_DOMAIN_ID with the ID from that snippet.Quick start — the one-line script
Paste this single line into your site's HTML. The widget loads asynchronously (defer), so it never blocks your page.
<script lf69="YOUR_DOMAIN_ID" defer src="https://litefeedback.com/min.litefeedback.js"></script>Where do I put it?
- Anywhere inside the
<head>or before the closing</body>tag. - On every page where you want the widget to appear. Most site builders and CMSs let you add it once, globally (see below).
- That's the whole setup — no build step, no npm package, no configuration in code. Appearance and text are configured visually in your dashboard.
Install on your platform
The widget is a plain <script> tag, so it works on any stack. Here's where to paste it for the most common platforms.
Plain HTML / custom code
Paste the snippet into your template's <head>. Done.
WordPress
Use a header-snippet plugin (e.g. WPCode or Insert Headers and Footers), or paste it into your theme's header.php before </head>. Step-by-step guide →
Shopify
In your admin, go to Online Store → Themes → Edit code and paste the snippet into theme.liquid, just before </head>.
Wix
Go to Settings → Custom Code → Add Custom Code, paste the snippet, and set it to load on All pages in the Head. Wix guide →
Webflow
Open Project Settings → Custom Code and paste the snippet into the Head Code field, then publish. Webflow guide →
Squarespace
Go to Settings → Advanced → Code Injection and paste the snippet into the Header box.
Framer
Open Project Settings → General → Custom Code and paste the snippet into Start of <head> tag.
Google Tag Manager
Create a new Custom HTML tag, paste the snippet, and set the trigger to All Pages. Handy if you can't edit your site's HTML directly.
Verify it's working
- Open your site in a new browser tab (a normal window, not incognito with blockers).
- The feedback button (or popup, depending on your settings) should appear after your configured delay.
- Send a test message — it shows up instantly in your dashboard.
lf69 ID matches your domain, and that no content blocker is hiding it. On mobile, check the “Show popup for mobile devices” setting.Customization
Everything visual is configured in your dashboard (no code) under a domain's settings. Available options:
- Main color
- Popup title
- Textarea placeholder
- Submit button label
- Reopen button label
- Success & error messages
- Auto-display on load (with delay in ms)
- Show / hide on mobile
- Optional email field (and make it required)
- Email placeholder
- Hide the “Powered by” watermark Unlimited
- Email notifications (realtime, daily & weekly digests)
- Telegram, webhook & Slack notifications Unlimited
- MCP server for Cursor, Claude Code & Codex Unlimited
Notifications, webhooks & Slack
Configure how you get alerted when new feedback arrives. Open a domain in your dashboard and expand Notifications & Webhook in the left-hand settings panel.
Choose realtime delivery, a daily recap, or a weekly recap. Daily and weekly digests require a paid plan; realtime email is available on every plan.
Telegram
Realtime Telegram alerts require the Unlimited plan. Connect your account first under User settings → Telegram connection, then enable notifications per domain. Optionally turn on silent mode so alerts arrive without sound or vibration.
Generic webhook
Available on the Unlimited plan. Enable the webhook toggle and paste any HTTPS endpoint. Lite Feedback sends a POST request with a JSON body whenever new feedback is created (from the widget or the REST API). Use it with Zapier, Make, n8n, your own backend, or any tool that accepts inbound webhooks.
// POST https://your-endpoint.example/hooks/feedback
// Content-Type: application/json
{
"event": "feedback.created",
"domain": {
"id": "YOUR_DOMAIN_ID",
"name": "example.com"
},
"feedback": {
"id": "f_abc123",
"message": "Love the product, but checkout is slow on mobile",
"created_at": "2026-05-30T14:22:00.000Z",
"pathname": "/pricing",
"email": "jane@example.com",
"user_identifier": "user_12345",
"browser": "Chrome",
"os": "macOS",
"device": "Desktop",
"timezone": "Europe/Paris",
"tags": ["Performance"],
"status": "new",
"sentiment": "Neutral",
"priority": "medium",
"extradata": null
}
}| Field | Description |
|---|---|
event | Always feedback.created for new feedback. |
domain.id | Your domain ID (same as the lf69 attribute in the install snippet). |
domain.name | The domain label you set in the dashboard. |
feedback.id | Unique feedback identifier. |
feedback.message | The feedback text. |
feedback.created_at | ISO 8601 timestamp. |
feedback.pathname | Page path where the feedback was sent (if available). |
feedback.email | Visitor email, if provided. |
feedback.user_identifier | Your custom visitor id (window.lite_feedback_user_id), if set. |
feedback.browser / os / device | Technical context from the visitor session. |
feedback.tags / status / sentiment | Present when AI triage ran (Unlimited plan). |
feedback.extradata | Custom JSON metadata from the REST API, if any. |
feedback.message, feedback.email, and other fields to Slack, Jira, Notion, Google Sheets, etc.Slack
Also available on the Unlimited plan. For a native Slack channel notification, create a Slack Incoming Webhook (pick the channel, copy the URL), then paste it into the Slack field and enable it. Each new feedback posts a formatted message with the text, visitor id, email, page, and sentiment when available.
Webhook and Slack fire in realtime alongside email and Telegram — independently of the email digest schedule.
Integration for developers (pure JavaScript)
Prefer to inject the widget programmatically — e.g. from a bundler, a framework, or conditionally? Append the script yourself:
const script = document.createElement("script");
script.setAttribute("src", "https://litefeedback.com/min.litefeedback.js");
script.setAttribute("lf69", "YOUR_DOMAIN_ID");
script.setAttribute("defer", "");
document.head.appendChild(script);Works the same way as the one-line tag. In SPAs (React, Vue, etc.) inject it once on initial load — the widget persists across client-side navigation.
Identify your users (user id & email)
If your visitors are logged in, attach an identifier and/or email to their feedback so you know exactly who sent what. Set these global variables before the feedback is submitted:
// Set these BEFORE the visitor submits feedback.
// Both are optional and attached to the feedback so you know who sent it.
// A stable identifier for the logged-in user (id, username, etc.)
window.lite_feedback_user_id = "user_12345";
// Pre-fill the sender email. If the visitor types one in the popup,
// the typed email is used instead.
window.lite_feedback_user_email = "jane@example.com";| Global | Type | Behavior |
|---|---|---|
window.lite_feedback_user_id | string | Attached to the feedback as the visitor identifier — shown in your dashboard and notifications. |
window.lite_feedback_user_email | string | Used as the sender email. If the visitor types an email in the popup, the typed one takes priority. |
Both are optional. Set them as early as possible (e.g. right after login) so they're present whenever the visitor opens the widget.
Listen to events
When feedback is submitted successfully, the widget dispatches a lf69_msg_success event on document. Use it to trigger your own analytics, a thank-you flow, or a confetti animation:
document.addEventListener("lf69_msg_success", (e) => {
console.log("Feedback sent:", e.detail.message, e.detail.email);
// e.g. fire your own analytics event here
});event.detail contains { message, email } for the submitted feedback.
REST API
Submit feedback programmatically from your backend or a mobile app — no widget required. Ideal for in-app feedback, crash reports, or piping feedback from other systems.
Endpoint
POST https://us-central1-easyfeedback-37932.cloudfunctions.net/addFeedbackFromAPIAuthentication
Send your secret API key as a Bearer token. Find and regenerate it in your dashboard under User settings → API key. Keep it server-side; never expose it in client code.
Authorization: Bearer YOUR_API_KEYRequest body
Send JSON. Only domain_id and message are required.
| Field | Type | Required | Description |
|---|---|---|---|
domain_id | string | Yes | The ID of the domain to attach the feedback to. |
message | string | Yes | The feedback content (max 5000 characters). |
email | string | No | Sender email (max 254 characters). |
user_identifier | string | No | Your own identifier for the visitor. |
pathname | string | No | The page/path the feedback relates to. |
browser | string | No | Browser name. |
os | string | No | Operating system. |
device | string | No | Device name/type. |
app_version | string | No | Your app version (mobile). |
os_version | string | No | OS version (mobile). |
device_model | string | No | Device model (mobile). |
mobile_user_id | string | No | User id from your mobile app. |
timezone | string | No | IANA timezone, e.g. Europe/Paris. |
tags | string[] | No | Up to 20 tags. |
extradata | object | No | Any extra JSON metadata. |
Example — JavaScript (fetch)
fetch("https://us-central1-easyfeedback-37932.cloudfunctions.net/addFeedbackFromAPI", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_KEY",
},
body: JSON.stringify({
domain_id: "YOUR_DOMAIN_ID", // required
message: "The export button is broken on mobile", // required
email: "jane@example.com", // optional
user_identifier: "user_12345", // optional
pathname: "/pricing", // optional
tags: ["bug"], // optional
extradata: { plan: "pro" }, // optional
}),
});Example — cURL
curl -X POST "https://us-central1-easyfeedback-37932.cloudfunctions.net/addFeedbackFromAPI" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"domain_id": "YOUR_DOMAIN_ID",
"message": "The export button is broken on mobile",
"email": "jane@example.com"
}'Responses
// 200 OK
{ "success": true, "feedbackId": "f_abc123" }| Status | Meaning |
|---|---|
200 | Feedback created — returns { success, feedbackId }. |
400 | Missing domain_id / message, or a field is too long. |
401 | Missing/invalid Authorization header or API key. |
403 | Domain doesn't belong to you, or monthly feedback limit reached (Free plan). |
405 | Wrong method — use POST. |
429 | Rate limited — max 10 requests/minute per API key. |
500 | Server error — try again. |
MCP server Unlimited
The Lite Feedback MCP server lets your coding assistant pull visitor feedback and work on it in your repo. In Cursor, Claude Code, or Codex you can say “Pull the last feedbacks from the project” then “Work on feedback #f_abc123” — the assistant gets the message, page, device, browser, tags, and a work brief.
Endpoint
POST https://us-central1-easyfeedback-37932.cloudfunctions.net/mcpAuthenticate with your MCP token as a Bearer token. Find it in your dashboard under User settings → MCP server (Unlimited plan). One token covers every website on the account.
Authorization: Bearer YOUR_MCP_TOKENCursor
Paste this into .cursor/mcp.json in your project, or ~/.cursor/mcp.json for a global config. Restart Cursor afterwards.
// .cursor/mcp.json
{
"mcpServers": {
"litefeedback": {
"url": "https://us-central1-easyfeedback-37932.cloudfunctions.net/mcp",
"headers": {
"Authorization": "Bearer YOUR_MCP_TOKEN"
}
}
}
}Claude Code
Paste this into .mcp.json at the root of your project.
// .mcp.json
{
"mcpServers": {
"litefeedback": {
"type": "http",
"url": "https://us-central1-easyfeedback-37932.cloudfunctions.net/mcp",
"headers": {
"Authorization": "Bearer YOUR_MCP_TOKEN"
}
}
}
}Codex
Add this to ~/.codex/config.toml.
# ~/.codex/config.toml
[mcp_servers.litefeedback]
url = "https://us-central1-easyfeedback-37932.cloudfunctions.net/mcp"
http_headers = { Authorization = "Bearer YOUR_MCP_TOKEN" }Tools
| Tool | What it does |
|---|---|
list_projects | List the websites on your account. |
list_feedbacks | Pull recent feedback (optional filters: domain, status, tag). |
get_feedback | Load one item by ID, with a ready-to-work engineering brief. |
search_feedbacks | Search messages, notes, emails, and page paths. |
update_feedback | Set status, tags, priority, team notes, or archive after you start/finish. |
#f_… → implement in the current repo → mark it in_progress or done.Privacy & GDPR
The widget sets no cookies and collects no personal data by default. It only sends what a visitor types plus basic technical context (page, browser, OS, timezone). Any user id or email is only attached if you set it (see Identify your users). This keeps integration friendly to GDPR and to your visitors.
Troubleshooting & FAQ
Do I need to add the script to every page?
Yes — but most platforms (WordPress, Shopify, Wix, Webflow, GTM…) let you add it once globally so it loads everywhere automatically.
Will it slow down my site?
No. The script is loaded with defer and runs after your page, so it never blocks rendering.
Can I use it on a mobile app?
Yes — use the REST API to submit feedback from any backend or native app.
Where is my domain ID / API key?
Your domain ID is in the install snippet (the lf69 value) in your dashboard. Your API key is in User settings.
Does it set cookies?
No cookies, and no personal data is collected unless you explicitly attach a user id or email.
Can I send feedback to Slack or Zapier?
Yes — on the Unlimited plan, enable the generic webhook or Slack integration under a domain's Notifications & Webhook settings. See the Notifications section for the JSON payload and setup steps.
Can my coding assistant pull feedback from Lite Feedback?
Yes — on the Unlimited plan, connect the MCP server in Cursor, Claude Code, or Codex. See the MCP section. Your token lives in User settings.
