Crisp
Crisp is RoundTrip's customer support platform. It handles in-app chat support, email ticketing, and the customer-facing knowledge base at help.roundtrips.app. Crisp was selected in July 2026 as the Phase 1 support platform, replacing a ZenDesk trial.
See TRA-225 for the full support platform strategy and the three-phase roadmap toward a Relay-powered AI support assistant.
What Crisp Does
| Capability | Details |
|---|---|
| In-app chat widget | Embedded in RoundTrip — users click the chat bubble to get help |
| Email ticketing | Emails to support@roundtrips.app create tickets in Crisp inbox |
| Knowledge base | Self-service articles at help.roundtrips.app |
| User identification | Pre-fills user name and email from auth context automatically |
Configuration
Account Details
| Item | Value |
|---|---|
| Login | Bitwarden → "Crisp" |
| Workspace name | RoundTrip |
| Website ID | 65572966-7391-42f9-9932-1d38d2c7c740 |
| Plan | Essentials (free tier — 2 agents) |
| Knowledge base URL | help.roundtrips.app |
| Support email | support@roundtrips.app |
Agents
| Agent | Role | Handles |
|---|---|---|
| Pete Carroll | Admin | Technical issues, billing, account management |
| Robin Carroll | Agent | Feature requests, user feedback, general inquiries |
Ticket Categories
| Category | Owner |
|---|---|
| Technical Issue | Pete |
| Billing & Account | Pete |
| Account Management | Pete |
| Feature Request | Robin |
| User Feedback | Robin |
| General Inquiry | Robin |
SLA Targets
| Priority | Trigger | Response | Resolution |
|---|---|---|---|
| Critical | App down, data loss, can't log in | 2 hours | 24 hours |
| High | Core feature broken, billing issue | 4 hours | 48 hours |
| Normal | Non-critical bug, general question | 1 business day | 5 business days |
| Low | Feature request, feedback | 3 business days | Roadmap |
Business hours: Monday–Friday 9am–6pm Eastern. Founding customers have a direct line to Pete regardless of SLA tier.
In-App Widget Integration
The Crisp widget is embedded in RoundTrip and automatically identifies the logged-in user.
How it works
User logs in to RoundTrip
→ authStore.setAccount() called
→ fetchCurrentUser() succeeds
→ identifyCrispUser(email, name) called
→ Crisp widget pre-fills user identity
→ Support conversations are automatically attributed to the correct user
Key files
| File | Purpose |
|---|---|
src/lib/crisp.ts | Crisp initialization, user identification, session reset |
src/types/crisp.d.ts | TypeScript Window type declarations for $crisp |
src/stores/authStore.ts | Calls identifyCrispUser on login, resetCrispSession on logout |
src/main.tsx | Calls initCrisp() once at app startup |
_headers | CSP entries for all Crisp domains |
CSP entries required
The following domains must be in _headers for the widget to function:
script-src: https://client.crisp.chat
style-src: https://client.crisp.chat
font-src: https://client.crisp.chat
img-src: https://image.crisp.chat https://storage.crisp.chat https://*.crisp.chat
connect-src: https://client.crisp.chat wss://client.crisp.chat
wss://client.relay.crisp.chat wss://client.relay.rescue.crisp.chat
https://storage.crisp.chat https://*.crisp.chat https://image.crisp.chat
Email Setup
Emails sent to support@roundtrips.app route to Crisp via DNS records on roundtrips.app in Cloudflare.
DNS Records
| Type | Name | Value | Priority |
|---|---|---|---|
| TXT | _crisp.support | crisp-website-id=65572966-7391-42f9-9932-1d38d2c7c740 | — |
| MX | support | inbound.crisp.email. | 10 |
| TXT | support | v=spf1 redirect=_spf.crisp.email | — |
| CNAME | _dmarc.support | _dmarc.crisp.email. | — |
| CNAME | crisp._domainkey.support | crisp._domainkey.crisp.email. | — |
| CNAME | links.support | links.custom.crisp.email. | — |
:::caution DNS Only All Crisp CNAME records in Cloudflare must be set to DNS only (grey cloud). Proxied CNAMEs break email routing. :::
Knowledge Base
The RoundTrip Help Center is at help.roundtrips.app.
Starter Articles
| Article | URL |
|---|---|
| How to Invite a Team Member | help.roundtrips.app/... |
| How to Send an Invoice | help.roundtrips.app/... |
| How to Contact Support | help.roundtrips.app/... |
Add new articles whenever a support question comes up more than twice — that's the signal it belongs in the knowledge base.
Rotating the Crisp API Key
If the Crisp website ID ever needs to change (e.g. workspace recreation):
- Update
CRISP_WEBSITE_IDinsrc/lib/crisp.ts - Update the TXT DNS record
_crisp.supportin Cloudflare with the new ID - Rebuild and deploy RoundTripWeb
- Verify the widget loads correctly on
roundtrips.app
Troubleshooting
Widget not appearing
- Check browser console for CSP errors — add any blocked Crisp domains to
_headers - Verify
initCrisp()is called insrc/main.tsxbeforeReactDOM.createRoot - Check
window.CRISP_WEBSITE_IDin browser console — should return the website ID
User identity not pre-filling
- Check browser console for errors in
identifyCrispUser - Verify
fetchCurrentUseris returningstatus: 'ok'— check Network tab for/v1/me - The test admin account (
acme.admin@roundtripapp.onmicrosoft.com) has no real email — identity won't pre-fill for this account. Use a real user account to test.
Emails not arriving in Crisp
- Check Cloudflare DNS records are correct and set to DNS only (not proxied)
- Allow up to 24 hours for DNS propagation after initial setup
- Use Crisp → Email Settings → Email Domain → Verify domain setup to check status
Outlook Safe Links consuming one-time codes
Crisp sends one-time login codes to agents via email. Outlook's Safe Links feature pre-fetches links and consumes the code before the agent can use it. Always click the button in the email — never copy the link. This affects Robin's Outlook account.