This guide is for anyone who wants to connect surveys to their own code, understand where the data lives, or sort out a problem quickly.
Where to find it:
Hooks are in your own code (a small plugin or your theme's functions.php). The licence and the Danger Zone are on the Settings tab. Integrations & AI shows the two main actions under Send responses anywhere else.
The rsv_response_recorded action:
Fires for every finished response, with five arguments: the full survey array, the response id, the checked answers keyed by question id (q1, q2 and so on), the email, and the name. The email and name are empty strings when the visitor did not leave them. add_action('rsv_response_recorded', function ($survey, $response_id, $answers, $email, $name) { /* your code */ }, 10, 5);
The rsv_lead_captured action:

Fires only when an email address came with the response, with five arguments: the email, the name, the survey, the answers and the response id. The plugin's own deliveries listen to it: WP Sync at priority 10, ResultsAiX Mailer at 20, the autoresponder queue at 25. Anything you build on it behaves the same way. add_action('rsv_lead_captured', function ($email, $name, $survey, $answers, $response_id) { /* your code */ }, 30, 5);
The rsv_ai_error action:
Fires with the provider and the provider's message whenever an AI call fails. Handy for logging.
The rsv_bare_survey_page filter:
A filter that decides whether a survey's own page renders in the clean, theme free layout. It receives true, the page id and the survey id. Return false and the page renders inside your theme instead, with the survey shortcode in its content.
The raix_ai_base_url filter:
A filter shared with other ResultsAiX plugins that can change the address AI requests go to. It receives the address, the provider name (gemini, anthropic or openai) and the plugin slug.
Example, tag high scorers in your own system:
add_action('rsv_response_recorded', function ($survey, $response_id, $answers, $email, $name) { if ((int) $survey['id'] !== 1 || $email === '') return; if (isset($answers['q1']) && (int) $answers['q1'] >= 9) { // a promoter: hand $email to your own code here } }, 10, 5); The answers are keyed by question id. Choice and yes or no answers are the option text, checkbox answers are an array of option texts, ratings and scores are numbers, and written answers are text.
Finding a question's id:
Question ids are q1, q2 and so on, given in the order questions were first added, and they stay the same when you reorder. The webhook payload makes them easy to match, because it lists each answer with its id and its wording.
Data model:
- Surveys live in the rsv_surveys table, with the questions and each survey's settings stored as JSON, plus its public key, response, view and start counters, and the saved AI reading.
- Responses live in rsv_responses: the answers as JSON keyed by question id, the email, the name, extra details (where they came from, the browser, a click id), whether the response is finished, and the dates.
- The AI usage log is in rsv_ai_jobs, and the autoresponder delivery queue in rsv_ar_queue.
- All four tables carry your site's table prefix. Settings are in the rsv_settings option, and the autoresponder connection in rsv_ar.
Uninstalling and the Danger Zone:

Deleting the plugin deliberately keeps your surveys, responses and settings, so reinstalling never loses data. Deactivating or updating never touches your data either. Only the Danger Zone on the Settings tab removes everything:
- Tick I understand ALL surveys and responses will be permanently deleted.
- Type DELETE in capitals.
- Click Delete all plugin data and confirm.
The plugin is then back to a fresh install. Export your responses first if you might want them.
Licence, sites and updates:

The Settings tab shows your licence key (partly hidden), its status, who it is licensed to, the renewal date and Activated Domains, with how many sites are in use. Refresh License Info reloads the details, Deactivate This Site frees this site's slot, Remove next to another site frees that slot, and Replace key swaps in a new key. Moving to another site means deactivating here first. Updates appear on your normal WordPress Plugins screen and install with one click.
My shortcode shows nothing:
The survey is Draft or Closed, or it has no questions. Logged in administrators see a short note saying so. Set the survey to Active and save. See Publishing A Survey With The Shortcode.
The popup never appears:
Check four things: popup mode is ticked on the survey, the survey is Active, you are on a desktop browser at least 768 pixels wide, and the popup has not already opened for you in this browser. To test again, open a private window. If several surveys have popup mode on, only the newest one shows.
Generate Survey or Read my results says AI is not set up:
On Integrations & AI, tick Use AI features in this plugin, paste a key, click Save AI settings, then Test connection on that provider's card. The test shows the provider's own words if anything is off.
The AI draft came back thin:
The brief was probably short. Name your audience and the decision you are making, not just a topic, and generate again.
Opt-ins are not reaching my list:
Every opt-in is stored with its response on your site first, so nothing is lost while you check.
- Your connected email service: open Integrations & AI. The Your autoresponder card shows what was sent, waiting and failed, and Not delivered yet lists what the service said. Check the survey has a list picked, or tags for services without lists, then use Send a test contact.
- ResultsAiX Mailer: check Mailer shows Connected on Integrations & AI and the survey has a list under Where opt-ins go. It is set per survey. Tags without a list only reach people already in Mailer, and an address on your Mailer suppression list is skipped on purpose.
- WP Sync: check the WP Sync row on Integrations & AI, then that a bridge exists with ResultsAiX Surveys as the source and is switched on.
Visitors see "That was a little too fast":
That message appears when answers arrive within three seconds of the survey loading, which is the bot trap. A real person answering normally never sees it.
A typed Other answer is missing:
Ask visitors to tick Other before typing beside it. The box beside Other does not tick it by itself, and an unticked Other is not sent.
Need to ask for help?
Open Diagnostics, click Copy Report for Support and paste it into your ticket. See The Diagnostics Tab: A Health Report For Support.
Tips:
- Hook into rsv_lead_captured rather than rsv_response_recorded when you only care about subscribers.
- Use the CSV export for one off analysis rather than reading the tables directly.