iolo Sitemap [iolo_sitemap]
DETECTED VALUES:
Query coupon: –
SIC cookie: –
SIC decoded (coupon | segmentid): –
segmentid cookie: –
SN cookie: –
Effective coupon (non-UPD): – (–)
Effective coupon (UPD): –
All cookies: –
PRICING WIDGET — API DETAILS 9 sections — endpoint, request/response, coupons, tiers, product map, failure modes, known gaps
Reference for how this page (and every priceCodes page) gets its prices. Mirrors the WordPress plugin
iolo_pricingWG (inc/class-iolo-pricing.php, inc/class-iolo-api-client.php),
reimplemented client-side because the Astro site is prerendered.
1. Endpoint & transport
| Service | SOAP 1.1, svc.iolo.com/__svc/priceinfo/priceinfoservice.asmx (11 operations in the WSDL; we use 2) |
|---|---|
| Called from | The browser, from an is:inline script in <head> — fetches start before the body parses |
| localhost | Same-origin /__svc/…, forwarded by the Vite dev proxy (localhost is not CORS-allowlisted) |
| www / stage1 | Direct to https://svc.iolo.com — CORS is live for both origins (POST, OPTIONS; content-type, soapaction) |
| Override | PUBLIC_PRICING_SOAP_URL env var replaces the base for any other environment |
| Replaces | WP’s 3-way routing (IOLO_USE_SOAP / IOLO_USE_PPG / IOLO_FORCE_PPG). Prod runs SOAP-only, so Astro implements only that path. |
2. Request shape
One POST per product, deduplicated by GUID + coupon. Header SOAPAction: "http://tempuri.org/<method>", 3.5s abort timeout.
POST /__svc/priceinfo/priceinfoservice.asmx
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://tempuri.org/GetStickyPricingInfoItem"
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetStickyPricingInfoItem xmlns="http://tempuri.org/">
<productID>5488CB36-BE62-4606-B07B-2EE938868BD1</productID>
<couponCode>iolo20</couponCode>
</GetStickyPricingInfoItem>
</soap:Body>
</soap:Envelope> UPD is the exception. GetStickyPricingInfoItem answers Code -1 “PriceItemInfo not found”
for the Updater GUID. It is served instead by GetStickyPricingInfoItemFromStickyProduct with
avProductID=298 plus locale=en_US and currency=USD — same response fields, and the same
substitution the WP client makes. That call returns UPD1Y1 at $34.99 / $19.99 (43% off).
3. Response shape
Flat XML, prefixed per tier — Purchase…, Upgrade…, Renew… — wrapped in <Code> / <Message>.
| Field | Parsed as | Rendered by |
|---|---|---|
{tier}ItemId | item_id | Diagnostics only |
{tier}ItemCode | item_code | Diagnostics only — a SKU, not the cart’s ock |
{tier}RegularPrice | regular_price | data-live-normal |
{tier}SavePrice | save_price | data-live-price |
{tier}SaveAmount | save_amount | data-live-save |
{tier}SavePercent | save_percent | data-live-percent |
Code / Message | code / message | Gate: anything other than 0 falls back to static prices |
Never build a cart link from item_code. Cart offers are chosen by the ock key, which lives in
src/data/cart-links.ts and is copied verbatim from production. The two disagree by design: SM’s
item_code IOLO_SMSTD_1Y-V2024 loads a $55.94 no-LiveTech cart, while the ock
sms-1y-ltc-1m-v2024 loads the $43.94 bundle the API is quoting.
4. DOM hooks
| Attribute | Receives | If the API fails |
|---|---|---|
data-live-price="CODE" | Sale price (tier SavePrice) | Static snapshot price stays |
data-live-normal="CODE" | Regular price (tier RegularPrice), inside the struck-out <s> | Whole “Normally…” wrapper is hidden when there is no discount |
data-live-save="CODE" | “Save $X” (tier SaveAmount) | Hidden when there is no discount |
data-live-percent="CODE" | “N% OFF” (tier SavePercent, rounded) | Hidden when there is no discount |
data-live-raw="CODE" | Full parsed response as JSON (this page only) | Prints the failure reason instead |
5. Coupon resolution
?coupon=in the URL — exact lowercase key wins, any other casing accepted as a fallback.SICcookie — base64 ofcoupon|segmentid, tolerant of the URL-safe alphabet (-_,→+/=); a coupon ofnonecounts as absent. Seeded by/coupon/<code>/<path>/URLs.- Default
iolo20for the API call. Cart links are not given a default at runtime — they simply keep the coupon they were authored with, which is the sameiolo20.
UPD overrides this: ?coupon= still wins, but the SIC cookie is ignored and the default is upd15. The same coupon is sent to the API and written onto the cart link, so the quoted price and the cart agree.
The default is not cosmetic: an empty couponCode returns the undiscounted price ($54.95 / $54.95 for System Mechanic).
WordPress never sends one either — mu-plugins/iolo-varnish-compat.php injects SIC = base64(“iolo20|None”) when the cookie is missing,
carrying over the old Varnish VCL default, which is exactly what iolo20 reproduces here.
6. Tier selection & buy-URL branches
The segmentid cookie (set by the /cookie-init/ infra endpoint from ?sn= / ?isc= / ?sc=) decides which tier is read and where the CTA points.
| State | segmentid | Price tier | CTA target |
|---|---|---|---|
| RENEW | 011 021 SM · 010 020 SMP · 009 019 SMU · 008 018 P360 · 111 121 PG · 112 122 MK · 113 123 BP · 013 023 SMB · 114 124 UPD | Renew tier | /purchase/SubscriptionExtend.aspx?sn=… |
| UPGRADE | 030 040 050 060 066 067 073 160 162 163 | Upgrade tier | /purchase/upgrade.aspx?sn=… |
| PURCHASE | 999 998 065, or no segmentid cookie at all | Purchase tier | secure1 cart with the page’s static ock |
Renew and upgrade both need a decoded SN cookie; without one the CTA falls back to /purchase/UpgradeHelpStartJump.aspx. Owning the product being viewed reads the Renew tier; owning a different one reads Upgrade.
SN and SIC are both base64 in the plugin’s URL-safe alphabet — Helper.php’s base64_url_encode maps + / = to - _ ,, so all three substitutions must be reversed before decoding. A serial whose base64 carries padding otherwise fails to decode and silently downgrades the renewal CTA.
7. Product mapping
| Code | Product | GUID (productID) | Sticky id | Static ock | Fallback reg / sale |
|---|---|---|---|---|---|
UPD | Updater | D8F85E47-5164-4358-8F74-E0F527AF642A | – | upd-1y-ltc-1m | $34.95 / $19.95 |
SM | System Mechanic | 5488CB36-BE62-4606-B07B-2EE938868BD1 | 288 | sms-1y-ltc-1m-v2024 | $49.95 / $39.95 |
SMP | System Mechanic Professional | 68B717EE-E309-41DF-8D19-F82B1E591419 | 289 | smp-1y-ltc-1m-v2024 | $69.95 / $59.95 |
P360 | System Mechanic Ultimate Defense | A50DE83F-EFEC-48D0-B4DC-3E98620FC509 | 290 | smu-1y-ltc-1m-v2024 | $99.95 / $99.95 |
PG | Privacy Guardian | 1E38E75F-AC2C-4B27-ADA5-C0EA08862383 | 285 | pg-1y-v2024 | $34.95 / $34.95 |
MK | Malware Killer | A852BE1C-512F-49B9-A420-541AA6FB2FEB | 284 | mk-1y-v2024 | $24.95 / $24.95 |
BP | ByePass | EED7C0B1-1E12-4709-AB58-2551B1243F42 | 282 | bp-1y-v2024 | $19.95 / $19.95 |
SMB | System Mechanic Business | 34727AC2-C35B-4F3D-8942-A23A4FFC80DF | – | smb3-1y | – |
SS | System Shield | 882362E0-C71A-411B-B16F-46D1B66E1890 | 287 | ss-1y-v2024 | $39.95 / $31.95 |
SR | Search & Recover | 882362E0-C71A-411B-B16F-46D1B66E1890 | 286 | sr-1y-v2024 | $39.95 / $31.95 |
DS | DriveScrubber | 36ED6646-A91F-4078-8781-9F2EB056D706 | 283 | ds-1y-v2024 | $29.95 / $23.95 |
Cart URL built from these: https://secure1.iolo.com/sm/carts/?view=1.10.13&ock=sms-1y-ltc-1m-v2024&coupon=iolo20 — host, view and ock are authored; only coupon is rewritten at runtime (plus secure1 → sb-secure1 off production).
- Search & Recover shares System Shield’s GUID, so it is quoted at System Shield’s price. The WP plugin maps it the same way — faithful, not a typo.
- UPD and SMB have no sticky id, and UPD’s GUID is never actually sent — that product is priced through
avProductID=298. It is listed here only because the catalog carries it. - SMB carries no catalog fallback — its own page ships a snapshot price instead, so the dash above is expected.
- The
cart.smukey holds the Ultimate Defense offer (WP’sP360). WP’s separateSMUoffersmu-1y-v2024has no Astro entry because no page sells that edition.
8. Failure behaviour
- Price elements are hidden by an injected style until their response lands, so a price never visibly changes.
- Any failure — network error, non-zero
Code, zero prices, 3.5s timeout — reveals the build-time snapshot price instead. - A 4s watchdog reveals everything regardless, so a hung service cannot leave the page priceless.
- With JavaScript off nothing is ever hidden, and the static prices and cart links stand on their own.
- A coupon that does not apply to a product returns
SaveAmount 0; the price shows alone and the “Normally / Save” pair is dropped, matching production.
9. Known gaps vs the WordPress plugin
verified — no action The iolo20 default is load-bearing, and it is the platform default
An empty couponCode is not harmless: System Mechanic comes back $54.95 / $54.95, SaveAmount 0. WordPress never sends one because mu-plugins/iolo-varnish-compat.php injects SIC = base64(“iolo20|None”) in memory whenever the cookie is absent — the same default the Varnish VCL used (aW9sbzIwfE5vbmU=). Astro’s hardcoded iolo20 reproduces that edge default rather than inventing one.
What to do: None. Just never let the default fall out — a missing coupon quotes list price.
breaks parity — needs a decision Upgrade-segment visitors are quoted the Purchase tier
The ten UPGRADE segments (030 040 050 060 066 067 073 160 162 163) have no entry in the pricing script’s ownership map, so tier selection falls through to purchase — while CartLinks does know them and sends the same visitor to upgrade.aspx. WordPress derives both from one license_state, so it quotes the Upgrade tier. The two tiers are identical for every product we sampled, so nothing is visibly wrong today, but the logic is inconsistent with our own CTA.
What to do: Decide whether upgrade segments should read the Upgrade tier; if so, mirror <code>CartLinks</code>’ segment list into the pricing script.
breaks parity — needs a decision Tier is chosen per request in WordPress, per product here
WordPress derives one license_state from the segmentid cookie and applies that tier to every price on the page. Astro compares the owned product to each rendered code instead. Concretely, a System Mechanic owner (011) on /products/system-mechanic/ sees Renew pricing on all three editions under WordPress, but Renew on SM and Upgrade on Pro / Ultimate Defense here.
What to do: Confirm the intended commercial behaviour with the commerce team, then align one side. Ours is the more granular model, but it is not what WordPress does.
breaks parity — needs a decision A ?coupon= does not survive navigation
WordPress turns ?coupon= into a 30-day SIC cookie on any page load, so the coupon follows the visitor through the site. Astro only persists a coupon from the /coupon/<code>/<path>/ URL form; a plain ?coupon= applies to the landing page and is then lost on the next click. This is separate from the query-param forwarding that was deliberately removed — WordPress uses a cookie, not URL rewriting.
What to do: Confirm the intent. If coupons should stick, write the SIC cookie from <code>?coupon=</code> (cookie only, no URL changes).
check before shipping The rewritten WP class defaults an unknown visitor to segment 050
class-iolo-pricing.php falls back to SegmentID::NON_SM (050) when no segmentid cookie exists, which resolves to UPGRADE and rewrites every CTA to /purchase/UpgradeHelpStartJump.aspx. Live production does the opposite: an anonymous visitor gets the ordinary secure1 cart (verified on /products/system-mechanic/, where the only UpgradeHelp links are static nav items). Astro follows production — no segmentid cookie means PURCHASE and a normal cart link.
What to do: Flag to whoever owns that rewrite; as written it would push anonymous buyers out of the cart.
intentional Locale & currency are USD-only in practice
The WP class carries full country→locale→currency maps, but a non-USD request to this SOAP service answers Code -1 “PriceItemInfo not found” (verified with locale=en_GB, currency=GBP). Non-USD pricing lives in the PPG path, which prod has switched off (IOLO_USE_PPG=false). Astro therefore sends no locale or currency at all.
What to do: No action. Revisit only if PPG is ever enabled.
do not switch The REST source returns a different (older) catalog
GET api.iolo.com/pricinginfoapi/Pricing/StickyProductProperties/sm answers IOLO_SMSTD_1Y at $49.95/$39.95, while the SOAP service answers IOLO_SMSTD_1Y-V2024 at $54.95/$43.94 — the SOAP numbers are the ones live on iolo.com. Prod runs IOLO_USE_SOAP=true for exactly this reason. The REST host also sends no CORS headers.
What to do: Keep using SOAP. Do not “modernise” to the REST endpoint without a catalog fix on the API side.
behavioural No server-side response cache
WP caches every response in a WordPress transient for 2 hours and can prefetch all products in one parallel curl_multi batch. A static site has no server to cache on: each visitor’s browser makes its own calls (deduplicated per GUID+coupon within a page load).
What to do: Acceptable today. If svc.iolo.com load becomes a concern, add a CDN-cached JSON snapshot endpoint.
no impact Apex domain is not CORS-allowlisted
svc.iolo.com echoes an allow-origin for https://www.iolo.com and https://stage1.iolo.com only — not for https://iolo.com. The apex 301-redirects to www before any page script runs.
What to do: No action.
intentional GeoIP header is not consumed
WP reads nginx’s HTTP_X_COUNTRYNAME to pick a locale server-side. Astro pages are prerendered, so there is no request to read it from.
What to do: No action while pricing is USD-only.
IOLO UPDATOR:
Short code: UPD
Product name: Updater
Product ID (GUID): D8F85E47-5164-4358-8F74-E0F527AF642A
Sticky ID: –
Static ock (cart-links.ts): upd-1y-ltc-1m
Fallback prices: $34.95 regular / $19.95 sale
Price: $34.95
SaveAmt:
SavePct:
SavePrice: $19.95
Buy: https://secure1.iolo.com/sm/carts/?view=1.10.13&ock=upd-1y-ltc-1m&coupon=upd15
API return data:
waiting for API response…
SYSTEM MECHANIC:
Short code: SM
Product name: System Mechanic
Product ID (GUID): 5488CB36-BE62-4606-B07B-2EE938868BD1
Sticky ID: 288
Static ock (cart-links.ts): sms-1y-ltc-1m-v2024
Fallback prices: $49.95 regular / $39.95 sale
Price: $49.95
SaveAmt:
SavePct:
SavePrice: $39.95
Buy: https://secure1.iolo.com/sm/carts/?view=1.10.13&ock=sms-1y-ltc-1m-v2024&coupon=iolo20
API return data:
waiting for API response…
SYSTEM MECHANIC PROFFESSIONAL
Short code: SMP
Product name: System Mechanic Professional
Product ID (GUID): 68B717EE-E309-41DF-8D19-F82B1E591419
Sticky ID: 289
Static ock (cart-links.ts): smp-1y-ltc-1m-v2024
Fallback prices: $69.95 regular / $59.95 sale
Price: $69.95
SaveAmt:
SavePct:
SavePrice: $59.95
Buy: https://secure1.iolo.com/sm/carts/?view=1.10.13&ock=smp-1y-ltc-1m-v2024&coupon=iolo20
API return data:
waiting for API response…
SYSTEM MECHANIC ULTIMATE DEFENSE
Short code: P360
Product name: System Mechanic Ultimate Defense
Product ID (GUID): A50DE83F-EFEC-48D0-B4DC-3E98620FC509
Sticky ID: 290
Static ock (cart-links.ts): smu-1y-ltc-1m-v2024
Fallback prices: $99.95 regular / $99.95 sale
Price: $99.95
SaveAmt:
SavePct:
SavePrice: $99.95
Buy: https://secure1.iolo.com/sm/carts/?view=1.10.13&ock=smu-1y-ltc-1m-v2024&coupon=iolo20
API return data:
waiting for API response…
PRIVACY GUARDIAN:
Short code: PG
Product name: Privacy Guardian
Product ID (GUID): 1E38E75F-AC2C-4B27-ADA5-C0EA08862383
Sticky ID: 285
Static ock (cart-links.ts): pg-1y-v2024
Fallback prices: $34.95 regular / $34.95 sale
Price: $34.95
SaveAmt:
SavePct:
SavePrice: $34.95
Buy: https://secure1.iolo.com/sm/carts/?view=1.10.13&ock=pg-1y-v2024&coupon=iolo20
API return data:
waiting for API response…
MALWARE KILLER:
Short code: MK
Product name: Malware Killer
Product ID (GUID): A852BE1C-512F-49B9-A420-541AA6FB2FEB
Sticky ID: 284
Static ock (cart-links.ts): mk-1y-v2024
Fallback prices: $24.95 regular / $24.95 sale
Price: $24.95
SaveAmt:
SavePct:
SavePrice: $24.95
Buy: https://secure1.iolo.com/sm/carts/?view=1.10.13&ock=mk-1y-v2024&coupon=iolo20
API return data:
waiting for API response…
BYEPASS:
Short code: BP
Product name: ByePass
Product ID (GUID): EED7C0B1-1E12-4709-AB58-2551B1243F42
Sticky ID: 282
Static ock (cart-links.ts): bp-1y-v2024
Fallback prices: $19.95 regular / $19.95 sale
Price: $19.95
SaveAmt:
SavePct:
SavePrice: $19.95
Buy: https://secure1.iolo.com/sm/carts/?view=1.10.13&ock=bp-1y-v2024&coupon=iolo20
API return data:
waiting for API response…
SYSTEM MECHANIC BUSINESS:
Short code: SMB
Product name: System Mechanic Business
Product ID (GUID): 34727AC2-C35B-4F3D-8942-A23A4FFC80DF
Sticky ID: –
Static ock (cart-links.ts): smb3-1y
Fallback prices: – regular / – sale
Price:
SaveAmt:
SavePct:
SavePrice:
Buy: https://secure1.iolo.com/sm/carts/?view=1.10.13&ock=smb3-1y&coupon=iolo20
API return data:
waiting for API response…
SYSTEM SHIELD:
Short code: SS
Product name: System Shield
Product ID (GUID): 882362E0-C71A-411B-B16F-46D1B66E1890
Sticky ID: 287
Static ock (cart-links.ts): ss-1y-v2024
Fallback prices: $39.95 regular / $31.95 sale
Price: $39.95
SaveAmt:
SavePct:
SavePrice: $31.95
Buy: https://secure1.iolo.com/sm/carts/?view=1.10.13&ock=ss-1y-v2024&coupon=iolo20
API return data:
waiting for API response…
SEARCH & RECOVER:
Short code: SR
Product name: Search & Recover
Product ID (GUID): 882362E0-C71A-411B-B16F-46D1B66E1890
Sticky ID: 286
Static ock (cart-links.ts): sr-1y-v2024
Fallback prices: $39.95 regular / $31.95 sale
Price: $39.95
SaveAmt:
SavePct:
SavePrice: $31.95
Buy: https://secure1.iolo.com/sm/carts/?view=1.10.13&ock=sr-1y-v2024&coupon=iolo20
API return data:
waiting for API response…
DRIVESCRUBBER:
Short code: DS
Product name: DriveScrubber
Product ID (GUID): 36ED6646-A91F-4078-8781-9F2EB056D706
Sticky ID: 283
Static ock (cart-links.ts): ds-1y-v2024
Fallback prices: $29.95 regular / $23.95 sale
Price: $29.95
SaveAmt:
SavePct:
SavePrice: $23.95
Buy: https://secure1.iolo.com/sm/carts/?view=1.10.13&ock=ds-1y-v2024&coupon=iolo20
API return data:
waiting for API response…