Business

Support and Onboarding for an AI Product

⏱ 15 min

Lesson 1 covered onboarding as part of productizing your plugin. This lesson goes further into what happens after launch, when real customers are running your product against real WordPress sites and real AI providers, and something inevitably goes wrong. A typical plugin bug is usually reproducible: same input, same broken output, every time. An AI feature isn’t like that. The same prompt against the same model can produce a different answer on two separate calls, a provider can degrade or rate-limit without warning, and “it’s not working” from a customer can mean five different things depending on where in the pipeline the failure actually happened.

What you'll learn in this lesson
Documentation scoped for an AI product specifically
What it needs to cover that a typical plugin's docs don't.
Choosing a support channel that matches your team size
Forum, helpdesk, or email, and what each actually commits you to.
Setting realistic expectations for AI-specific failure modes
Non-determinism, provider outages, and rate limits aren't bugs in the traditional sense.
Using your own audit log to diagnose customer-reported issues
Tying directly back to the audit-logging habit this track built starting in Course 4.
Prerequisites

This lesson assumes you’ve already built the audit-logging pattern from Course 4’s building-your-own-audit-log lesson, or an equivalent, into your product. If you haven’t, that’s the single highest-leverage thing to add before launch, this lesson explains why.

Step 1: Documentation an AI product actually needs

Beyond the onboarding documentation Lesson 1 covered, an AI product needs a specific troubleshooting reference that maps symptoms to causes, because the same visible symptom (“nothing happened” or “got a strange answer”) can come from several different places in the pipeline.

What a customer sees, and where it usually comes from
Customer-visible symptomLikely real cause
”The AI feature did nothing”A permission_callback rejection, an unauthenticated request, or a rate limit, not necessarily a bug
”It gave a weird or wrong answer”The model itself, not the plugin, a prompt or retrieval quality issue (Course 6’s RAG grounding is the fix here, not a bug report)
“It worked yesterday, not today”A provider-side outage, model deprecation, or a quota reset, worth checking the provider’s own status page before assuming a regression
”It’s slower than before”Provider-side latency, or increased content volume feeding a RAG pipeline, both external to your code

Publishing this mapping, in plain language, as part of your documentation does two things: it lets a meaningful share of customers self-diagnose before ever opening a ticket, and it sets the expectation up front that not every strange result is a plugin defect.

Step 2: Pick a support channel that matches your actual team size

Support channel options, honestly assessed
The WordPress.org support forum
Free, publicly visible, tied directly to your listing, but with no guaranteed response time and limited formatting or attachment options.
A dedicated helpdesk (email-based ticketing)
More control over response tracking and private detail sharing (API responses, site URLs), but it's another tool to run and staff.
A community channel (forum, Discord, Slack)
Good for peer-to-peer help and reducing your own ticket volume, but needs some moderation and doesn't replace direct support for account or billing issues.
Direct email
The lowest setup cost, and the easiest to fall behind on without a habit of triaging inbound messages.

Whatever you choose, state a realistic response-time expectation publicly and keep it. A stated 48-hour response window you consistently meet builds far more trust than an implied “always available” promise you can’t.

Step 3: AI-specific failures need AI-specific expectations

Set these expectations in your documentation and, ideally, directly in your product’s error messaging, not just buried in a support macro you paste in reactively:

What to tell customers about AI-specific failure modes
Outputs can vary between identical requests
Especially for anything above a deterministic, low-temperature setting, this is expected model behavior, not a bug.
Provider outages happen and are outside your control
Link to the relevant provider status pages so customers can check independently before filing a ticket.
Rate limits and quotas produce failures that look like bugs
A clear in-product message when a rate limit trips (Course 4's pattern) prevents this from ever becoming a support ticket at all.
Retrieval quality (for RAG features) depends on source content
An assistant grounded on thin or outdated content will answer thinly or out of date, that's a content problem, not a plugin defect.

Step 4: Use your own audit log to diagnose what a customer reports

This is where the audit-logging habit Course 4 built, and that a later course in this track returns to for deeper observability, pays off directly in support. When a customer reports “the AI feature did something wrong,” you almost never have enough information from their description alone: you don’t know which ability ran, what arguments it received, whether permission_callback passed, or what the provider actually returned. An audit log answers all of that, if you ask the customer for the right thing instead of guessing.

Ask for a timestamp and an audit log excerpt, not a screenshot

A screenshot shows what the customer saw. It doesn’t show what ability ran, what arguments were passed, or what the model returned. If your audit logging from Course 4 is in place, asking the customer for the approximate time of the issue and, ideally, an export of their own audit log entries around that time turns a vague “it didn’t work” into a specific, diagnosable event.

// A simple query pattern against the audit log table from Course 4,
// filtered to a time window a customer reports
global $wpdb;
$table = $wpdb->prefix . 'mcp_audit_log';
$rows  = $wpdb->get_results( $wpdb->prepare(
	"SELECT * FROM {$table} WHERE created_at BETWEEN %s AND %s ORDER BY created_at ASC",
	'2026-07-20 14:00:00',
	'2026-07-20 14:15:00'
) );

Test it

Simulate a support scenario before you actually need to run one. Trigger a permission rejection and a rate-limit block deliberately in a test environment, then confirm your own audit log captures enough detail (ability name, permission result, timestamp) to diagnose each without needing anything else from the customer.

Recap

An AI product fails in less predictable ways than a typical plugin, and documentation, support channel choice, and expectation-setting all need to account for that specifically, not just repeat generic plugin support advice. The single highest-value habit is one this track already built: a real audit log from Course 4, asked for by timestamp rather than guessed at from a screenshot, turns a vague customer complaint into a diagnosable event and is usually faster than any other troubleshooting step available to you.

Resources & further reading

← Launching Outside WordPress.org Course Recap: Your Go-to-Market Plan →