Customer chat for apps and websites
Collect customer messages, reply from one inbox and turn conversations into fix reports.
Enable chat for an app
Open Apps, select an app or website, then choose Set up chat. Press Enable chat and choose your framework. Appearance, business links and revenue connections are optional; receiving messages requires no model key or billing access. Chat is off by default. Turning it off blocks customer reads and new messages while keeping owner history. Names and context are customer supplied.
Website installation
Copy the website snippet from Set up chat into your HTML before the closing body tag. Choose HTML, React / Vite or Next.js to get code with your app ID and Macaron address already filled in. React / Vite uses its HTML entry; Next.js uses next/script in app/layout.tsx. The deferred script creates a scoped chat button and a keyboard-accessible dialog. If your Content Security Policy restricts scripts, images, inline styles or connections, allow the deployed Macaron origin and the widget styles. No iframe or account cookies are required.
<script src="https://YOUR_MACARON_HOST/macaron-support.js" data-app="YOUR_APP_ID" defer></script>React Native and Expo
Download MacaronSupport.tsx from Set up chat and copy it into your existing project. Import MacaronSupport and render it inside your navigation and safe-area container. Use baseUrl and appId from the setup screen. The component uses native React Native views, text inputs and a list, with no WebView or additional native module. It polls only while the app is active. Persist the onSession callback using your secure storage and pass the saved object as initialSession. Remount the component with a new key when switching customer accounts or app IDs.
import { MacaronSupport } from "./MacaronSupport";
<MacaronSupport key={appId} baseUrl="https://YOUR_MACARON_HOST" appId={appId} name={displayName} context="Checkout, build 42" initialSession={savedSession} onSession={persistSecurely} />Native SwiftUI
Download MacaronSupportView.swift and add it to an iOS 17+ target. Present MacaronSupportView in your own navigation or sheet. Set baseURL and appID from Macaron. Persist onSession values in Keychain and provide them as initialSession to restore access after relaunch. Remount the view with .id when the signed-in customer changes. The component uses SwiftUI and URLSession without a WebView. Simulator and physical-device acceptance remain part of your app release checks.
MacaronSupportView(baseURL: URL(string: "https://YOUR_MACARON_HOST")!, appID: appID, name: displayName, initialSession: savedSession, onSession: persistInKeychain)Verify installation with a round trip
Send a test message from the installed chat. Set up chat shows when that customer message arrives. Open the linked conversation in your inbox and send a reply, then return to the customer chat and keep it visible. The final check confirms the reply loaded there. Reloading setup preserves these checks because they come from persisted messages in one conversation. A script found in HTML is not proof of delivery. The hosted test chat verifies transport only, not installation in your product. Disabled chat keeps history but is clearly marked disabled.
Read and reply
Open Inbox to see messages across all apps and websites. Filter by app, search conversation text previews, and choose Open, Closed or All. Open a conversation to mark only the messages actually loaded as read. Send reply delivers it to the customer chat on its next refresh. Closing a conversation is a support status; it does not verify or resolve a software fix. A new message reopens it.
Turn a conversation into a fix
Choose Create fix report, confirm the title, and enter reproduction steps and expected behavior. The report includes the transcript and customer-supplied context, with a link back to the conversation. Creation is idempotent and does not launch a coding run. Open the report to prepare a fix using a configured machine and model, then review and verify it normally.
Sessions, limits and privacy
The customer API never uses owner account cookies. A random conversation token is sent in the Authorization header, stored only as a hash on the server, and grants access to one conversation. The website component remembers it in sessionStorage for that browser tab; native hosts should use secure storage and clear/remount on account changes. Losing the token loses customer access to that conversation. Rate limits apply, with 1000 conversations per owner account and 200 messages per conversation; messages are limited to 4000 characters. The first version supports text and polling while open. It does not include attachments, push notifications, payments, verified user identity or automated AI replies. HTTPS deployment is required before real customer use; localhost on a physical phone means the phone itself.