You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
chore: WordPress.org compliance audit, SEO readme, and PCP fixes (#4)
* chore: WordPress.org compliance audit, SEO readme, and PCP fixes
Prepare the plugin for WordPress.org submission by addressing all 18
Plugin Directory Guidelines and fixing every error from the Plugin
Check Plugin (PCP).
Compliance & readme:
- Rewrite readme.txt with SEO-optimized title, description, FAQ,
screenshots section, and expanded External Services documentation
listing every external domain individually with Terms/Privacy links
- Update Plugin Name header in roi-insights.php to match readme title
- Bump Tested up to from 6.7 to 6.9 (current WordPress release)
- Remove all Ads Advisor references from readme.txt and README.md
- Update call tracking rates to new pricing ($8/$6/$4 per number)
- Add call recording credit rates to tier descriptions
PCP fixes:
- Replace raw GA4 <script src> tag with wp_enqueue_script()
- Collapse multiline pixel echoes (TikTok, Pinterest, Nextdoor) to
single lines so phpcs:ignore directives cover the escaped variables
- Add phpcs:ignore annotation for $_POST JSON input with explanation
Admin UX:
- Fix notice dismissal: add AJAX handler to persist dismissed state
in user_meta so is-dismissible notices stay hidden across page loads
- Add code comment on Dashboard iframe explaining architectural choice
(WordPress.org Guideline 8 — reviewer documentation)
* fix: reset notice dismissal on license change, restore async GA4 loading
- Clear roi_insights_license_notice_dismissed user meta in
clear_cache() so license warnings reappear after key changes
or expiration instead of staying permanently hidden.
- Use WP 6.3+ script loading strategy array for GA4 gtag.js
enqueue to preserve async loading behavior from the original
raw script tag.
* fix: clear stale license cache on key change
Delete the _stale transient in clear_cache() so stale_or_invalid()
cannot return data from a previous license key if the backend is
temporarily unreachable after a key update.
* fix: bump minimum WP version to 6.3 for script strategy compat
The wp_enqueue_script() array args format (strategy => async) was
introduced in WP 6.3. Bump Requires at least from 6.2 to 6.3 so
the GA4 async enqueue works correctly. WP 6.2 has been EOL since
November 2024.
* docs: soften async performance claim in FAQ
Acknowledge that inline pixel bootstrap snippets run on the main
thread, while remote scripts are loaded async.
* fix: add NonceVerification.Missing to phpcs ignore for get_body()
PCP flags both .Missing and .Recommended variants for $_POST access.
The nonce is verified in verify_request() which is called before
get_body() in every handler.
* feat: add plugin-zip script for WordPress.org submission
npm run plugin-zip builds the frontend, assembles only the runtime
files into a roi-insights/ directory, zips it, and cleans up.
Excludes: .git, .gitignore, node_modules, src, tsconfig.json,
package.json, package-lock.json, README.md (GitHub-only).
* fix: remove standalone call log claim, clarify md-roi.js loading
- Remove "Basic call log" as a standalone free feature bullet — the
call log is part of the embedded dashboard service, not a plugin
feature. Reword to make this clear.
- Clarify that md-roi.js loads on all frontend pages as a local file
(no external requests) before any license activation or pixel
enablement.
---------
Co-authored-by: Jim Mosier <jmosier69@Jims-Mac-mini.local>
**Professional ($39.95/mo)** is built for businesses running paid ads. You get a weekly AI executive summary that tells you what's working, full call transcription and lead scoring, and lower call tracking rates. For a lot of businesses, the savings on call tracking alone covers the subscription — see the math below.
123
122
124
-
**Business ($199/mo)** is for high-volume advertisers and agencies. The Ads Advisor watches your Google Ads spend around the clock — alerting you to budget overruns, underperforming campaigns, and automated bidding changes that are quietly costing you money. You also get the lowest call tracking rates, custom reporting, and MCP AI agent access to query your marketing data programmatically.
123
+
**Business ($199/mo)** is for high-volume advertisers and agencies. You get the lowest call tracking rates, custom reporting, and MCP AI agent access to query your marketing data programmatically.
125
124
126
125
**Founder's Club ($4,495 one-time)** — Lifetime access to Business tier features, available as a limited-time offer for early adopters. See [ROI Insights](https://roiknowledge.com/?utm_source=github&utm_medium=referral&utm_campaign=roi-insights-wp) for availability.
127
126
@@ -133,19 +132,19 @@ It can — and often does. Because call tracking rates drop with higher tiers, t
| Professional | $39.95 | $9.00 | $54.00 |**$102.95**|
135
+
| Free | $0 | $8.00 | $72.00 |**$80.00**|
136
+
| Professional | $39.95 | $6.00 | $54.00 |**$99.95**|
138
137
139
-
At 120 calls a month, Professional is cheaper than Free — and includes AI transcription, lead scoring, and weekly reports.
138
+
At higher call volumes, the savings on per-minute rates start to offset the subscription — and you get AI transcription, lead scoring, and weekly reports.
| Professional | $39.95 | $135.00 | $450.00 |**$624.95**|
146
-
| Business | $199.00 | $90.00 | $300.00 |**$589.00**|
144
+
| Professional | $39.95 | $90.00 | $450.00 |**$579.95**|
145
+
| Business | $199.00 | $60.00 | $300.00 |**$559.00**|
147
146
148
-
The jump from Professional to Business saves $35/month in telecom costs alone, plus adds the Ads Advisor and custom reporting.
147
+
The jump from Professional to Business saves money on telecom costs at scale, plus adds custom reporting and MCP AI agent access.
149
148
150
149
---
151
150
@@ -223,7 +222,7 @@ You can enable auto-recharge so your balance stays topped up automatically — n
223
222
224
223
Yes — genuinely free, not "free for 14 days." You do need a license key (even for the free tier), but you generate it right inside the WordPress admin: click **Sign in with Google** (or enter your email for a magic link), and a domain-bound key is created and activated automatically. The free tier gives you GTM injection, GA4 and Search Console connections, native toggles for six ad platforms, attribution tracking, built-in event adapters, header/footer script injection, and a basic call log.
225
224
226
-
Paid tiers add AI transcription, lead scoring, call recording, advanced attribution, and the Ads Advisor — but the core tracking infrastructure works perfectly without them.
225
+
Paid tiers add AI transcription, lead scoring, call recording, and advanced attribution — but the core tracking infrastructure works perfectly without them.
Copy file name to clipboardExpand all lines: includes/class-api.php
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -71,7 +71,7 @@ private function verify_request(): void {
71
71
72
72
/** Decode the JSON-encoded 'data' field sent by api.post(). */
73
73
privatefunctionget_body(): array {
74
-
// phpcs:ignore WordPress.Security.NonceVerification.Recommended-- already verified in verify_request().
74
+
// phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- nonce verified in verify_request(); raw JSON cannot be sanitized with sanitize_text_field() without mangling it. Individual values are sanitized in each handler.
0 commit comments