Keep Staging and Local Copies From Emailing Customers
A staging site is a full copy of the live store: the same customers, the same invoice schedules, the same gateway keys. Without a guard, a copy can email a real customer an invoice reminder, or charge a saved card for a renewal the live store already charged.
GT Extensions remembers which site is the live store. On any other copy (staging, a local site or a migrated domain) it pauses customer emails and payment provider actions until you confirm the site is the live one. Nothing on the copy is changed: settings, keys and records stay as they were.
How It Knows
When GT Extensions is activated, or first runs on a production site, it records that site as the live store. A site is treated as a copy when:
- its address doesn’t match the live store, for example after a migration,
- its WordPress environment type differs from the one recorded (production, staging, local), or
- no live store has been recorded yet and it is not a production site.
What a Copy Shows
Store managers see this notice on a copy:

- This is the live store confirms the site, for example after you move the store to a new domain. Emails and payment actions resume, and anything held runs straight away.
- Keep paused and hide this notice leaves the copy paused and hides the notice for that address. It still shows on GT Extensions screens.
Paused and Refused on a Copy
| Held until confirmed | Refused |
|---|---|
| Invoice reminders and overdue notices | Refunds at the payment provider |
| Proposal reminders | Canceling a subscription at the payment provider |
| Back-in-stock alert emails and their sign-up confirmations | Saved-card and saved PayPal renewal charges |
| Recurring invoices (created once confirmed) | Capturing or releasing a PayPal authorization, accepting a Stripe dispute |
- Sending an invoice or a proposal by hand saves it and explains that customer emails are not sent from a copy.
- FluentCRM automations from GT Extensions wait, and start once the site is confirmed.
- GT Stripe, GT PayPal and GT Paddle don’t take over the live store’s webhook from a copy. Use test or sandbox mode there.
- Checkout still works, so you can test orders with test keys.
- Held jobs are checked again before they run. A reminder for an invoice paid in the meantime sends nothing.
Decide It in wp-config.php
Hosts and agencies can settle it per environment instead of clicking the button:
// On the live server:
define('GTFC_LIVE_STORE', true);
// On staging and local copies:
define('GTFC_LIVE_STORE', false);
The constant wins over everything, and hides the confirm button. Without it, developers can decide with the gtfc/live_store filter, which receives the current answer and the reason, such as moved or environment. When a held job is skipped, the gtfc/live_store/held action runs, and gtfc/live_store/released runs after a confirmed site releases them.