Troubleshooting
CSR logs under the csr category, so start with storage/logs. Spam refusals, email that could not
be sent, CAPTCHA provider outages and Pigeon bridge failures all appear there.
Article URLs return a 404
- The site has no URI format. Open CSR → Settings → Sites. An empty Article URI format means that site has no article pages. Each site needs its own row, and a site added after CSR was installed has none until you save this screen.
- The URI format changed a moment ago. Craft stores each article's URI when the article is
saved. Changing the format, or adding a site, queues every article to be saved again, so the new
URLs appear once the queue has run. Check Utilities → Queue Manager, or run
php craft resave/csr-articlesyourself. - The knowledge base is switched off. With The public knowledge base off under General, every CSR article, category and search page returns a 404.
- The article is restricted (Pro). A reader who isn't allowed to see it gets a 403 on the article page, and it doesn't appear in listings or search results for them.
- The index is somewhere else. Each site's index, search and category pages live at its The help centre index lives at path on the Sites screen, or at Default help centre path when that is empty. See Configuration.
The support form refuses everything
Every spam check shows the same message: "We couldn't send that. Please try again in a moment."
This is intentional. A form that says which check caught you is telling a bot which check to work
around. The actual reason is logged, e.g. CSR refused a support submission (tooFast).
honeypot: the hidden field was filled in. Browser autofill can do this if your own template gives the honeypot a label ornamethat looks like a real field. Keep it off-screen, unlabelled, andautocomplete="off".tooFast: the form was sent sooner than Refuse submissions faster than allows (3 seconds), or it had no validcsrStamp. A rewritten template must include<input type="hidden" name="csrStamp" value="{{ craft.csr.stamp() }}">. A page cached across a change to the security key also fails this check. Set the value to0to turn the check off.rateLimit: that email address has raised as many tickets this hour as the limit allows, or — on the customer's ticket page — posted as many replies as Replies one address may post per hour allows. This is common in testing, where one address sends everything.captcha: a provider is chosen, but the form didn't post the provider's response field (cf-turnstile-responseorg-recaptcha-response). CSR's own templates render the widget with{{ craft.csr.captcha() }}. A copy of_support/form.twigor_portal/ticket.twigmade before you turned CAPTCHA on needs that line added. If the provider can't be reached, the check lets the submission through, so an outage never stops customers reaching you.
A refusal that isn't one of these (a missing email address, or an unanswered required question) says what is wrong, because it isn't a spam check.
No emails arrive
- The queue isn't running. Emails are queued by default. Check Utilities → Queue Manager for waiting jobs, or turn off Send through the queue to test.
- Nobody to tell. Emails to the desk go to Who hears about new tickets, the assigned agent, and the ticket's team. If there are none, the log says "there is nobody to tell".
- That notification is off. Each one has its own switch under Notifications. Status emails are set on each status, with Email the customer when a ticket moves here.
- Craft can't send mail. Use Settings → Email → Test to check. CSR uses Craft's mailer, and if the mailer refuses a message, CSR logs it.
- You expected a copy of your own reply. CSR doesn't send one. A customer's reply goes to the desk, and an agent's reply goes to the customer.
SLAs never breach
- Cron isn't running
csr/sla/check. The control panel shows a late ticket in red as soon as its deadline passes. The breach is only recorded, emailed and escalated when the sweep runs. Run it by hand. It reports how many breaches it found. - SLAs are off. If Put a clock on tickets is off, the command says so and exits. Tickets raised while SLAs were off have no deadlines.
- The site is on Lite. Service levels are Pro. On Lite the sweep does nothing.
- No policy matched. Policies are tried in order and the first match wins. If none match, the ticket has no clock. Add a policy with no conditions at the bottom as a catch-all.
- The ticket is waiting on the customer. A Pending-kind status pauses the clock, and the deadline moves forward by the time spent waiting. See FAQ.
- Opening hours. A policy that only counts opening hours doesn't run over weekends or
holidays. Run
php craft csr/sla/preview 240to see when a target would be due.
The suggestions panel stays empty
- Not enough typed yet. Suggestions start after Start suggesting after characters (8 by default). Shorter queries would match everything.
- The matches are too weak. The panel only shows fairly strong matches, because three weak guesses are worse than none for someone who is already frustrated. Fill in Also found by with the words customers use. A keyword match counts for almost as much as a title match.
- Your template dropped the hooks. The script needs the
data-csr-*attributes described in Usage, and the page must output{{ head() }}and{{ endBody() }}so the script loads. - The articles are restricted or disabled on this site. Suggestions go through the same visibility filter as everything else.
A report says it needs Pro
On Lite, the reports index and Top searches work. Failed and abandoned searches, article
performance and feedback, deflection, desk reports and CSV export are Pro. csr/kb/gaps prints a
notice on Lite and exits. Lite also keeps only 30 days of searches, so a newly upgraded site has
at most a month of history to report on.