Egenverk Customer Hub · Documentation
Complaints and AI
The customer's flow
The customer files a complaint under Complaints in My Account, or as a guest on the page with [wcch_claim_form]. The form has four steps: Item, The fault, Attachments and Send. The chosen reason reveals the fields that belong to it, and the form also works without JavaScript.
- Attachments can be JPG, PNG, WEBP or PDF, by default at most 5 files and 8 MB per file.
- Attachments are stored outside the public paths and can only be downloaded by someone with permission.
- An order line can only have one open complaint at a time.
The case gets a reference of the form REK-YYYY-NNNNNN, and the customer gets an acknowledgment with the reply time you have set.
Statuses
| Status | Meaning |
|---|---|
| Submitted | Nobody has started the review. |
| In review | The case is being reviewed. |
| Return booked | A return is booked. When the carrier reports the return delivered, the case goes back to In review. |
| Resolved | Resolved. Can be reopened. |
| Rejected | Rejected, with the reasoning emailed to the customer. |
Handling complaints
Under Customer Hub → Complaints each complaint opens in a panel with the order and customer details, the attachments, the conversation and the log. The queues are Needs a decision, Awaiting reply, On the way back, All open and Snoozed.
- The case can be assigned to a handler. The assigned person sees their open complaints as a count by the menu. Who can be chosen is set in the Handlers list under Settings → Complaints.
- Remind me… parks the case for 1, 3 or 7 days, until a date or until the customer replies.
- Refund item… and Compensation… wait five seconds with Undo before anything is sent to the payment method. Book a return…, Reject and Mark resolved are done from the same panel.
- Bulk actions in the list: Begin review, Remind me…, Lift the reminder, Mark resolved, Assign handler and Reject.
- Export CSV downloads the list.
Under Settings → Complaints:
| Setting | Default | What it does |
|---|---|---|
| Enable complaints | On | Shows the complaint form to customers and accepts submissions. |
| Forward complaints by email | Off | Emails each complaint, with attachments, to the staff address. |
| Staff email address | Empty | Where forwarded complaints go. Empty = the site admin email. |
| Reply time promised in the acknowledgment — shortest / longest (working days) | 2 / 5 | The reply time in the customer's acknowledgment. 0 as the shortest leaves the sentence out. |
| Max attachments per complaint | 5 (1–20) | |
| Max file size (MB) | 8 (1–64) | Per file. |
| Pre-contract reklamation notice | Off | A notice at checkout and in the order emails about the right to complain, linking to the form. |
| Complaint address (gatuadress) | Empty | Added to the notice. |
Photo check
Every image the customer sends gets an origin verdict: Camera photo, Unknown origin or AI-generated. The verdict is made on the server from the file's metadata, and nothing is sent to any service.
- Ask for a new photo fills the reply box with a ready request for a new image. You edit the text under Customer texts. Nothing is sent until you send the reply.
- Compare with product image shows the product's catalogue image beside the customer's photo in the image viewer.
Conversation
Replies are written and sent from the case, for complaints and withdrawal cases alike, with Reply templates and Signature in complaint replies from Settings → Mail & templates. A sent reply can be undone for 30 seconds. The customer replies in My Account, through the link in the email or, with Postmark, by replying to the email.
For replies by email, set up Inbound mail (Postmark) under Settings → Integrations:
| Setting | Default | What it does |
|---|---|---|
| Receive replies by e-mail | Off | The emails get a reply address per case on the inbound domain. Switch it on only once Postmark's test delivery answers 200. |
| Inbound domain | Empty | The subdomain whose MX points at Postmark. |
| Webhook secret | Empty | A long random string. Once saved, the webhook addresses to paste into Postmark are shown. |
| Only accept the webhook from Postmark's IP addresses | On | The second lock beside the secret. Behind a proxy the visitor's IP address must be restored, or everything is refused. |
| Spam score threshold | 5 | Mail scored at or above this is kept as spam instead of entering the case. 0 = never. |
| Postmark server token, Postmark message stream | Empty | Used to lift the suppression on an address that bounced, so Send again reaches it once corrected. |
Email that cannot be matched to a case ends up under Customer Hub → Inbound e-mail, in the tabs Unmatched, Spam, Auto-replies and bounces and In a case. From there you can link an email to the right complaint.
AI advice
The AI features call OpenAI or Anthropic with the store's own API key. They are off from the start and only appear when Enable AI advice is on and at least one provider has a key.
On a complaint the AI card shows an assessment (recommended action, assessment, company position, next step and risks) and a draft reply.
- Use as reply (or Alt+A) fills in the reply box. The AI never sends anything to the customer; you read, edit and send.
- Generate again produces a new draft. The old one stays as an earlier draft.
- In the chat you can ask follow-up questions and attach up to four images per question.
- The reject, book-return and compensation dialogs can propose a reasoning or a message, which you choose to use or not.
- New memory + saves a store guideline based on the case.
- A handler can pick the provider in the card; otherwise the default provider is used.
On a withdrawal case the same chat is available, but no assessment: a withdrawal needs no reason and is not assessed.
An assessment is stored per complaint. A new call is only made when the material or the AI settings have changed, or when you choose Generate again. Each handler can make at most ten new AI calls a minute. Every call is logged on the case with provider, model, token count and whether pseudonymisation was on.
AI settings
Under Settings → AI advice:
| Setting | Default | What it does |
|---|---|---|
| Enable AI advice | Off | Generates an assessment when a complaint is opened. |
| Shejtan mode | Off | Makes the AI sceptical of the customer's account and readier to ask for evidence, always within the law. Applies to complaints, can be changed per case in the AI card and is never shown to the customer. |
| Default provider | OpenAI | Used until a handler picks their own in the card. |
| OpenAI API key, Anthropic API key | Stored encrypted and never shown again in the form. | |
| OpenAI model, Anthropic model | gpt-6-sol, claude-sonnet-5 | Pick from the list or enter your own model id. |
| Max tokens | 2000 | Reasoning models always get at least 16,000. |
| Temperature | 0.2 | Lower is more literal. |
| Timeout (seconds) | 60 | For one whole assessment or question. |
| Attach the complaint's pictures | On | Sends up to the four most recent images, downscaled. |
| Pseudonymise customer data | On | Replaces names, email, phone, street address, company name, postcode and personal identity number before anything is sent. The order number stays. Images are not altered. |
| Nightly distillation | Off | At 03:00 the AI reviews the complaints closed since the last run, when at least five have closed, and proposes guideline changes. A proposal applies only once someone approves it. |
| System prompt | The default text | Your own text replaces the default. {RULES} is replaced with the legal references, guidelines and terms. |
| Terms page | WooCommerce terms page | The terms are sent with every assessment and question. |
| Documents the model may read | PDF, TXT, MD or DOCX, at most 10 MB per file, that the AI can read when needed. |
The same page holds the store's guidelines and the closed list of legal references. The AI may only cite references on the list.
Under Settings → Integrations, DB Schenker — give the AI access and the matching box for the payment extension decide whether the AI may see the order's shipping and payment data. Both are on by default.
The API keys can also be set in wp-config.php, and then they take precedence over the settings page:
define( 'WCCH_OPENAI_API_KEY', '...' );
define( 'WCCH_ANTHROPIC_API_KEY', '...' );
What is sent to the provider is described in Data and privacy.