ShipToVerified connects your WooCommerce store with the ShipToVerified service to automate identity verification and adult signature compliance for regulated product shipments.
The plugin handles the full verification lifecycle:
wc-await-verify) that qualifying orders are placed into until verification completes, so unverified orders are easy to spot and filter in WooCommerce.Retailers that ship age-restricted, regulated, or compliance-sensitive products (such as firearms accessories, tobacco, cannabis, or adult goods) to jurisdictions that require adult signature delivery or government-issued identity verification at the point of purchase.
This plugin connects to the ShipToVerified API (https://api.shiptoverified.com). A ShipToVerified merchant account is required. Connection is established by the store administrator during initial setup via OAuth.
Checkout eligibility check
Triggered automatically on the checkout page for every customer session (including guests) while the plugin is active and connected. This call determines whether the current cart requires an adult signature fee or identity verification notice.
Order created notification
Triggered once per order, when the order status first moves to processing or completed.
Widget initialization
Triggered on the order confirmation page (and optionally the account order-detail or order tracking page) when an order requires identity verification.
/widget.js) is then loaded directly from https://api.shiptoverified.com to render the verification interface. This file is served by the ShipToVerified service and is part of the core service functionality (similar to how payment processors serve their checkout scripts).Webhook (inbound)
ShipToVerified sends a signed POST request to /wp-json/shiptoverified/v1/webhook when a verification event occurs (e.g., the customer completes verification, the verified shipping address changes, the address cannot be validated, or address validation is awaiting customer input).
verification.completed, address.updated, address.unverified, address.review_required.reason and/or a suggested address — address.updated sends the corrected address, address.unverified sends a reason, and address.review_required sends a reason plus an optional suggested_address.address.review_required, the plugin adds a private order note recording the pending state and any suggested address, and takes no other action (the order stays awaiting the customer’s response).Order data endpoint (inbound)
ShipToVerified may request full order details via GET /wp-json/shiptoverified/v1/order/{id} to display order context inside the ShipToVerified merchant dashboard.
X-API-Key header.Store roles endpoint (inbound)
ShipToVerified may request the store’s configured WordPress roles via GET /wp-json/shiptoverified/v1/roles so a merchant can scope ID Verification rules to specific customer roles in the ShipToVerified dashboard.
X-API-Key header.Connection management (OAuth)
Used once during initial setup and optionally to test or re-establish the connection.
By installing, activating, and connecting this plugin, the store administrator consents to the transmission of the above data to ShipToVerified on behalf of the store and its customers, in accordance with the service terms.
Merchants are responsible for disclosing the use of this service to their customers in their store’s privacy policy.
The plugin stores all verification data in WooCommerce order meta. Keys are defined as constants in src/App/Domains/Orders/Order.php (and the reminder-timestamp keys in src/Units/Admin/Actions/ManualVerifyOrderAction.php).
Meta keys use more than one prefix for historical reasons. _stv_* is the canonical ShipToVerified namespace used for newer keys. Keys without that prefix (_is_ffl, _requires_id_verification, _order_id_*, _id_verification_*_reminder_sent_at) predate the namespace standardization and are retained as-is so existing orders keep their verification history; they are not renamed because doing so would orphan compliance data on already-processed orders. Plugin options use a single stv_ prefix (see Uninstall Cleanup).
_requires_id_verification — Set to 'yes' when the STV backend determines the order requires identity verification._order_id_verified — Set to 'yes' when the customer successfully completes the verification flow (via widget or manual override)._is_ffl — Set to 'yes' when the order is flagged as an FFL (Federal Firearms License) order. FFL orders are excluded from identity verification and adult signature workflows._order_id_verified_name — Full name as verified by STV (string)._order_id_verified_address — Verified shipping address (serialized array)._order_id_verification_timestamp — MySQL datetime string recording when verification completed._stv_verification_id — The STV-side verification UUID. Use this to look up the verification record in the ShipToVerified dashboard._stv_widget_token — Short-lived, single-use token used to initialise the frontend verification widget. Generated by STV and stored temporarily; do not rely on its value after the order is verified._stv_order_created_notified — Set to 'yes' after the plugin has successfully notified the STV backend of a new order. Prevents duplicate notifications on status re-changes._stv_webhook_processed_{event_id} — Idempotency guard. Written once per processed webhook event to prevent duplicate processing if STV delivers the same event more than once. {event_id} is the event UUID from the STV webhook payload._id_verification_first_reminder_sent_at — Timestamp recorded when ShipToVerified sent the customer the first verification reminder. The plugin does not send email itself; it stores these timestamps and clears them when an order is manually verified._id_verification_second_reminder_sent_at — Timestamp recorded when ShipToVerified sent the customer the second verification reminder.= Filters the plugin listens to =
woocommerce_order_actions (priority 10, 2 args) — Adds the Mark ID Verified entry to the order action dropdown in the admin order screen (ManualVerifyOrderFilter::addManualVerificationOrderAction).Third-party code can hook into these to react to verification events.
do_action( 'shiptoverified_order_id_verification_complete', int $order_id )
Fired when an order is marked as successfully verified — either by the STV webhook completing the customer flow, or by the admin using the manual verify order action.
* $order_id (int) — The WooCommerce order ID that was just verified.
do_action( 'shiptoverified_add_ca_signature_fee', bool $requires )
Fired during checkout eligibility evaluation after the cart rules are checked against the STV backend.
* $requires (bool) — true if the current cart requires an adult signature fee; false otherwise. Hook into this to add or remove a fee line item on the cart.
Four endpoints are registered under the namespace shiptoverified/v1.
Returns order details to the ShipToVerified merchant dashboard.
X-API-Key request header must match the stv_api_key WordPress option.order_id, status, total, currency, billing_email, customer (id, email, first_name, last_name, name, roles), shipping_address (first_name, last_name, address_1, address_2, city, state, postcode, country), and items (product_id, name, quantity, categories).Returns the list of available WooCommerce order statuses (id + label) to the ShipToVerified dashboard.
X-API-Key request header must match the stv_api_key WordPress option.{ "id", "name" } objects derived from wc_get_order_statuses().Returns the store’s WordPress user roles so a merchant can choose which roles ID Verification applies to.
X-API-Key request header must match the stv_api_key WordPress option.{ "id", "name" } objects derived from wp_roles()->get_names().Receives verification event callbacks from ShipToVerified.
X-Stv-Signature header using the stv_webhook_secret option. Requests with an invalid signature or a timestamp outside the 5-minute window are rejected with 401.event_type, event_id, order_id, verification_id, verified_name, verified_address.200. For verification.completed it marks the order ID-verified, applies the verified shipping address, and fires shiptoverified_order_id_verification_complete. The address.* events update the shipping address (address.updated), flag the order for manual review (address.unverified), or add a pending-customer note (address.review_required); these do not fire shiptoverified_order_id_verification_complete.This section is intended for WordPress.org and WooCommerce plugin reviewers. It explains how to test each feature end-to-end.
A sandbox/test account can be requested from the ShipToVerified team at [email protected]. Please mention that you are reviewing the plugin for WordPress.org.
Things to verify:
stv_oauth_start).stv_api_key and stv_webhook_secret are stored in wp_options.When an order moves to processing or completed, the plugin notifies ShipToVerified.
processing.Things to verify:
_stv_order_created_notified = yes (notification was sent).wc-await-verify)._is_ffl = yes) are skipped entirely._stv_order_created_notified).The plugin injects a JavaScript widget on customer-facing order pages so the customer can complete identity verification.
The widget appears on these pages (controlled by settings checkboxes):
woocommerce_thankyou) — enabled by default.woocommerce_view_order) — enabled by default.woocommerce_order_tracking) — disabled by default.Things to verify:
_requires_id_verification = yes._order_id_verified = yes).wp_register_script / wp_enqueue_script (not echoed directly).For orders shipping to California, the plugin can display a notice at checkout.
Things to verify:
#ca-adult-signature-notice.= …