Sample report

What a staging copy of WooCommerce, Magento 2 or Laravel carries

Excerpts from scans of three test databases filled with made-up customers, by prodmask 0.12.0 on 11 November 2026. The full reports are longer; the scanner also writes them as Markdown and JSON, plus a starter config.

A report lists table and column names, counts, categories and evidence. It never contains the values the scanner sampled.

What the scanner prints

The WooCommerce scan below, as it appears in the terminal.

Real output, trimmed. Reports list names, counts and categories. They never contain the values the scanner sampled.

WooCommerce: 28 tables, 9,100 rows sampled

WordPress with WooCommerce 9.3.3, orders in HPOS tables, on MariaDB 11.8.9.

What staging could do to real people

SeverityWhatWhereFix in the copy
Critical6 subscription renewal payments are scheduled; staging would try to charge customers when they fall duewp_actionscheduler_actions woocommerce_scheduled_subscription_paymentCancel these actions in the copy, or make sure WooCommerce Subscriptions starts in staging mode
HighOutgoing email is sent through WP Mail SMTP (mailer: sendgrid)wp_options wp_mail_smtpPoint the mailer at a mail catcher such as Mailpit, or turn it off, in the copy
HighPayment gateway "stripe" is enabled in live modewp_options woocommerce_stripe_settingsSwitch the gateway to test or sandbox mode and remove the live keys in the copy
High2 active webhooks would send order and customer data from staging to their delivery URLswp_wc_webhooksSet status to 'disabled' (or delete the rows) in the copy
HighUpdraftPlus backups are scheduled and go to Amazon S3; staging would send its backups there toowp_options updraft_serviceRemove the remote storage in UpdraftPlus's settings in the copy, or turn its backup schedule off
High2 WooCommerce Memberships emails are enabled; staging would send them to members, for example when a membership endswp_optionsTurn these emails off in WooCommerce > Settings > Emails in the copy, or route mail to a catcher such as Mailpit
HighThe copy keeps the live site's Jetpack connection; connected services would act for the live site, and WooCommerce Shipping, Tax or Payments are activewp_optionsDisconnect the copy: delete the blog token in jetpack_private_options and the auth entry in woocommerce_helper_data, or define JETPACK_STAGING_MODE in its wp-config.php
Medium40 pending scheduled actions would run on staging (most common: woocommerce_cleanup_draft_orders (20), wc-admin_import_orders (14), woocommerce_scheduled_subscription_payment (6))wp_actionscheduler_actionsCancel pending actions in the copy, or turn off WP-Cron and Action Scheduler there
Medium5 WP-Cron events would run on staging, including UpdraftPlus backups, WPForms email summaries, WooCommerce usage tracking and Ultimate Member jobs (most common: um_daily_scheduled_events (1), updraft_backup (1), woocommerce_tracker_send_event (1))wp_options cronTurn cron off on the copy's host (DISABLE_WP_CRON stops runs on page loads, not a system cron), and change the plugins' own settings, since they schedule their events again
MediumWooCommerce emails store staff about new and cancelled orders; staging would email them toowp_options woocommerce_new_order_settingsSet these emails to off in WooCommerce > Settings > Emails in the copy, or route mail to a catcher such as Mailpit
Medium1 plugin setting sends notification emails to staff addresses (for example fixture_admin_recipient)wp_optionsPoint these settings at a test address, or route mail to a catcher such as Mailpit, in the copy
Medium1 Contact Form 7 form emails its submissions to the addresses in its settingswp_postmeta _mailRoute mail to a catcher such as Mailpit in the copy, or add demo_mode: on to each form's Additional Settings

A few of the 157 findings

SeverityWhereDataEvidenceSuggested mask
Criticalwp_options.option_value[woocommerce_stripe_settings] → secret_keysecret, key or tokenname contains "secret key"; secret formats found: Stripe secret key (1 live)null
Criticalwp_options.option_value[wp_mail_smtp] → sendgrid.api_keysecret, key or tokenname contains "api key"; secret formats found: SendGrid API key (1 live)null
Highwp_options.option_value[logged_in_salt]secret, key or tokenknown field (wordpress preset); authentication key or salt; a copy that keeps it trusts production login cookiesnull
Highwp_commentmeta.meta_value[akismet_as_submitted] → comment_author_emailemail addressname contains "email"; 121 of 121 sampled values match the email address formatfake_email
Mediumwp_commentmeta.meta_value[akismet_as_submitted] → comment_contentfree text with personal dataname contains "comment"; of 121 sampled text values, 8 contain email addresses, 10 contain phone numbersredact

Magento 2: 17 tables, 2,895 rows sampled

Magento 2 with two store views, on MariaDB 11.8.9.

SeverityWhat staging could doWhereFix in the copy
HighPayment method "braintree" is active in live modecore_config_data payment/braintreeSwitch it to sandbox or test mode and replace the live credentials in the copy
High7 order emails are queued; with asynchronous sending, staging cron would send them to customerssales_orderSet send_email = 0 on unsent orders in the copy
MediumEmail sending is on (system/smtp/disable is not set)core_config_data system/smtp/disableSet system/smtp/disable to 1 in the copy, or route mail to a catcher such as Mailpit
Medium50 pending cron jobs would run on staging (most common: sales_send_order_emails (24), indexer_reindex_all_invalid (17), newsletter_send_all (9))cron_scheduleEmpty cron_schedule in the copy and keep cron off until the copy is checked

It also made 87 findings of personal data or secrets, among them sales_order_payment.cc_number_enc. That card number is encrypted with the store's crypt key, which a copy usually shares. It confirmed 9 relationships that the schema never declared, such as sales_order.customer_id → customer_entity.entity_id.

Laravel: 12 tables, 1,094 rows sampled

SeverityWhat staging could doWhereFix in the copy
Medium12 queued jobs would run when a queue worker starts on staging (queues: default (6), emails (6))jobsEmpty the jobs table in the copy

It also finds personal data hiding in JSON: customer emails in queued job payloads and notification data, and failed job stack traces that contain email addresses. It suggests emptying failed_jobs, password_reset_tokens, personal_access_tokens and sessions in any copy.