ModuleFest Hub help
Billing 2
- How billing is split with Stripe Stripe owns the money; the hub owns the licence. You create Payment Links in Stripe and map each one here to a tier and a set of services.Stripe then drives licence creation, renewal and expiry through webhooks, so a cancelled…
- Where the Stripe keys belong The secret key and the webhook signing secret can be set as constants in wp-config.php, and when they are, the hub uses those and hides the fields.That is the better arrangement: the keys stay out of the database and out…
Customers and the portal 4
- Customers and contacts A customer is created automatically for each registered site. A contact is created for each requester email under that customer.Both are stamped onto every ticket as it arrives, which is what lets you see a site's whole history rather than…
- The customer portal The [keen2support_portal] shortcode gives customers a web page on your site where they can sign in with a WordPress account and see their history across every product, read threads, reply, attach files, and submit and vote on ideas.History is matched…
- The public feature-request board Enhancements are ordinary tickets with the type set to enhancement. New ones start private and under review — nothing becomes public without you publishing it.Published ones appear on the board for upvoting. The board never exposes names, emails or ticket…
- Where the Leads list comes from Anybody who gives a name and email at a demo's gate is captured here, de-duplicated by email address and filterable by product, with a CSV export.These are people who tried a demo, not customers — they have no site, no…
Free trials 4
- Abuse controls on signup Signups are limited by an email cooldown, a per-IP daily cap, a disposable-domain block and a list of reserved subdomains.All four are adjustable. Loosening them is the first thing to look at if legitimate signups are being refused.
- How free trials work A visitor signs up with no card, and a real sub-site is created for them on your trial network, with a licence attached and demo data in place.They get reminder emails as the end approaches, and the tenant is removed…
- The hub cannot create trial sites by itself Sub-site creation and deletion happen on the trial network, through a companion provisioner plugin the hub calls over signed HTTPS using a shared secret.If trials fail to provision, check that the companion plugin is present and the network URL and…
- What happens when a trial ends The tenant is deleted — the sub-site and its uploads — after reminder emails have gone out. A follow-up job then verifies the deletion actually happened, because the provisioner cannot report back.There is no in-place upgrade path from a trial…
Getting started 4
- Finding your way around the menu The nav bar groups the screens by what you are doing:Dashboard and Tickets — day-to-day support.Products — the plugins that connect, their keys and their releases.Commerce — licences, the licensing catalogue, free trials, billing and customers.Sites — every install that…
- How a plugin connects, and why it is safe Client sites only ever make outbound HTTPS calls to the hub, so there is no IP allow-listing and nothing to open up on either end.Each product has one product key, shipped inside the distributed plugin. It permits registration and nothing…
- Setting the hub up for the first time Add a product under Products and copy its product key.Put the hub URL and that key into the connecting plugin's Keen2Support client.Set a notification address under Settings so new tickets reach you.Open the connecting plugin's support screen on a test…
- What Keen2Support is Keen2Support is a self-hosted support desk that lives on your own WordPress site. The plugins you distribute connect to it as clients: their customers raise tickets from inside those plugins, the tickets land in your inbox here, you reply, and…
Help articles 5
- A product shows zero articles Read the message on its card — each one means something specific:No help URL configured — source is Remote feed and the URL box is empty.No local post type configured — source is Local and the post-type box is empty.No…
- A successful sync is not a complete one The card shows a tick and a number. It does not know how many topics the product actually has, so a product handing over five topics out of a hundred reports success just as cheerfully as one handing over all…
- Help matching is on the exact slug Articles are stored against the product slug and matched as an exact string. Unlike licensing, the help path has no alias resolution, so a product whose plugin calls itself one thing while the hub row says another will never sync.Read…
- The three help sources Read from the plugin directly — for a product installed on this same site. The hub calls its PHP and asks for its topics. No URL, no key, never stale.Local post type — reads published posts of a help post…
- What the Help articles screen is for It caches each connected product's knowledge base into the hub, so that mid-ticket you can search it and drop the right paragraph into a reply without leaving the screen.It is a configuration screen, not documentation. The articles themselves come from…
Licensing 6
- Grace days, and hub outages Each licence carries a grace period — seven days by default — during which a client site keeps working even if it cannot reach the hub.That is deliberate: your customers should not lose functionality because your hub was down for…
- Pending features Client sites report the feature keys they know about. Anything the catalogue has never heard of queues up as pending until you assign it a tier.Until you do, that feature is not licensable — so a newly shipped feature can…
- Seats and domains A licence has a seat limit, and each seat binds to a domain when that site activates. Freeing a seat releases the domain so it can be used elsewhere.Seats also record the plugin version each site is running, which is…
- The customer licence API A site you run can ask the hub what one customer owns, by email address, and show it to them on an account page. Everything else in the licence API answers what is this site entitled to — which an…
- The enforcement switch There is one global switch on the Licences screen. While enforcement is off, every licence response tells client sites not to enforce, so all features unlock everywhere — which is what you want while you are still rolling licensing out.Turning…
- The licensing catalogue The catalogue defines the products, tiers, services and features that licences draw on, and it is editable here rather than in code.Pet Central and Pavilion both have a free lowest plan that issues no licence key at all — a…
Products and connecting 7
- A site registered but nothing works Check Connected sites for its status. A site registers as Pending unless its product has auto-approve switched on, and a pending site cannot authenticate at all — every call it makes returns 401, including the one that would show its…
- Auto-approve, and when to leave it off Auto-approve is set per product on the Products screen. With it on, any install holding the product key becomes active the moment it registers.That is right for a plugin you distribute openly. Leave it off when you want to see…
- Everything 401s on LiteSpeed or CGI hosting Some hosts — LiteSpeed especially, and Apache under CGI or FastCGI — strip or relocate custom request headers, so the hub never sees X-K2S-Token.The hub already recovers the token from every place those setups stash it, and falls back to…
- Product keys: what they do and do not allow A product key looks like k2s_ followed by forty characters, and there is one per product. It is the only credential that ships inside a distributed plugin.It permits registration only. A product key cannot read a ticket, list sites or…
- Site tokens and where they are stored Each registered install gets a 48-character token, sent on every call as the X-K2S-Token header.The hub stores only a SHA-256 hash of it. The raw token is returned once, at registration, and cannot be retrieved afterwards — if a site…
- The diagnostics attached to every ticket The client SDK attaches an environment snapshot to each ticket it opens: plugin and version, site URL, WordPress, PHP and MySQL versions, active theme, locale, multisite flag, memory limit, server software and whether the site is on HTTPS.It shows on…
- Ticket references and numbers Each product has a ticket prefix, so a Pavilion ticket reads PAV-XXXXXX and is instantly recognisable in an email subject line.Tickets also carry a plain sequential number per product, which is the friendlier thing to read down a list. Both…
Releases and updates 7
- Getting a download link by hand The Releases table has a Get link control against each published package. It gives you the same signed URL the hub hands to a site checking for updates, valid for 30 days.Useful wherever the update channel does not reach: a…
- Publishing a theme Choose Theme on the publish form. Drop the ZIP and the hub reads style.css for the name, version and requirements, and takes the folder inside the ZIP as the theme’s stylesheet directory — which is what WordPress calls it.Themes have…
- Publishing an update The hub doubles as a plugin update server. Upload a ZIP on the Releases screen and the version, requirements, changelog and homepage are read out of it automatically.Customer sites then see the update in their own WordPress admin, exactly as…
- Publishing from CI A separate publish key allows a release to be pushed straight to the hub over the API, so a build pipeline can ship without anybody opening wp-admin.It is a different credential from the product key and the site tokens, and…
- The drop folder ZIPs left in the incoming folder are imported automatically on the hourly job, or immediately if you ask. Convenient when your build process already writes a file somewhere.The product is worked out from the folder inside the ZIP, not its…
- Where the release files live Two folders, both shown on the Releases screen, and both changeable there.Drop folder — where you put ZIPs for the hub to pick up.Package folder — where the published ZIPs are kept, and what customer sites actually download through their…
- Why download links expire When a site checks for updates the hub hands back a signed download URL valid for fifteen minutes. WordPress core fetches that URL itself, without the site token, which is why it has to authenticate on its own.A link copied…
Settings and troubleshooting 5
- Emailing the customer when you reply Optional, and off unless enabled. The subject and body are templates with placeholders for the customer, agent, subject, reference, the reply itself and the site name.Without it, customers find out by seeing the badge inside your plugin — which works,…
- Something scheduled has not run Almost always WP-Cron rather than the feature itself. Check whether the site gets enough traffic to fire it, and whether a real cron is configured.The help sync and the digest both hang off the same hourly job, so if one…
- The debug log Opt-in, written to its own file under uploads/keen2support/ rather than into WordPress's debug.log, and readable, downloadable and clearable straight from the Settings screen.Turn it on while chasing something, and off afterwards.
- What runs on a schedule Hourly: the notification digest, the help-article sync, two ticket housekeeping sweeps, the release drop-folder scan and the usage prune. Every five minutes: the reply-by-email poll. Daily: trial reminders and expiries.All of it rides on WP-Cron, which only fires when somebody…
- What to back up Everything the hub holds is in your WordPress database — tickets, replies, customers, licences, usage — plus the files under uploads/keen2support/, which hold the attachments and, unless you have moved them, the release ZIPs.If the package folder has been pointed…
The agent app and notifications 5
- Immediate, hourly or daily Email notifications can arrive as they happen, batched hourly, or as one daily digest at an hour you choose.Push notifications always go immediately, whatever the email setting says. That is deliberate — the digest is for your inbox, not for…
- Phone notifications Push goes through ntfy — free, topic-based, no account needed — or Pushover. Configure one under Settings and use the test button to confirm it before relying on it.With neither configured, push is silently skipped and nothing else is affected.
- Pushing replies to the client instead of waiting A client site can supply a webhook URL when it registers. The hub then posts to it when an agent replies, so the customer sees the answer without waiting for their site's next poll.It is fire-and-forget and best-effort. Polling remains…
- Signing in to the app The app signs in with a WordPress Application Password, not your normal login password. Create one on your WordPress profile page and paste it into the app once.The account needs administrator-level capability. An application password can be revoked on its…
- The agent app on your phone The hub serves an installable app at its own address — add it to your home screen and it behaves like a native one. It shows every ticket across every product, with replies, status, assignment, tags and the help articles.Setup…
The AI assistant 3
- It is off unless you turn it on The assistant does nothing until it is both enabled and given an API key, and even then it only acts when you click one of its buttons. Nothing is sent anywhere in the background as a side effect of reading…
- What gets sent to the provider The ticket, the relevant help articles and similar past tickets. Internal notes are excluded unless you deliberately opt in.There is also a redaction option, and a limit on how many help articles accompany each query. Set the API key as…
- What the AI assistant does With a provider configured, the assistant can draft a reply, suggest the clarifying questions worth asking, summarise a long thread, and classify tickets into the ten-category taxonomy that drives the emerging-issues widget.It is grounded in your cached help articles and…
Tickets 9
- Assigning, tagging and categories Assign a ticket to an agent to make ownership obvious, and use the "mine" filter to see only yours.Tags are yours to invent and filter on. Categories are different: they come from a fixed ten-category taxonomy applied automatically by the…
- Attachments: limits and storage Up to 10 MB per file, from an allow-list of about a dozen safe types — images, PDF, plain text and CSV, Office documents and zip.Files are stored under uploads/keen2support/ with randomised names behind an .htaccess deny rule, and are…
- Canned replies Answers you give often can be saved under Canned replies, and they then appear as a dropdown above the reply box on every ticket.Inserting one drops the text into the box for editing rather than sending it — the customer…
- Internal notes A note is stored on the ticket like a reply but is never sent to the customer and never appears in their thread. Use it for the working-out — what you have ruled out, what you are waiting on, what…
- Merging duplicate tickets When somebody raises the same problem twice, merge the duplicate into the original from the ticket screen. Merged tickets drop out of the inbox unless you filter for them specifically, so the list stays honest.The merge is recorded rather than…
- Replying by email The hub can poll an IMAP mailbox every five minutes, find the ticket reference in the subject line, strip the quoted history and post what is left as your reply.It needs the PHP imap extension. The Settings screen detects whether…
- Satisfaction ratings When a ticket closes for the first time the customer can be sent a short "was this helpful?" email with one-click good and bad links. The links are signed, so nobody has to log in to answer.Results roll up onto…
- The emerging-issues widget On the dashboard, this compares each category's last twenty-four hours against its own thirty-day baseline and surfaces anything spiking.It is the fastest way to notice that a release has broken something — several people asking about the same area within…
- The life of a ticket A customer opens a ticket from inside the plugin. It arrives here marked unread, filed under its product. You reply; the reply syncs back to the customer's own site and shows there with an unread badge.Either side can close it,…
Usage and telemetry 3
- How long usage data is kept Sessions and events are pruned automatically after the retention window — ninety days by default — on the hourly job. Older detail is not recoverable, so export anything you need to keep.
- No usage data is arriving The screen says so explicitly when nothing has ever reached it, rather than showing an empty chart you might mistake for zero activity.Telemetry is opt-in on the client side, so first check it is switched on there. The client SDK…
- What the Usage screen shows Client sites can send opt-in telemetry — sessions, screens visited and feature events — which becomes the online-now count, the feature heatmap, the logins-by-day chart and the clickable session trails.It is per-product and per-date-range, and it is only as complete…
Nothing here matches that. Press Search to look inside the guides themselves.