=== MevvCart — Funnels, Checkout, Cart Recovery & Swatches for WooCommerce ===
Contributors: mevvsoft
Tags: woocommerce, sales funnel, abandoned cart, checkout, upsell
Requires at least: 6.0
Tested up to: 7.1
Requires PHP: 8.1
Stable tag: 1.2.1
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Sales funnels, checkout takeover, order bumps, one-click offers, cart
recovery, smart coupons and swatches — in one plugin.

== Description ==

Most WooCommerce stores end up buying five separate plugins to do this
job: a funnel builder, a cart recovery plugin, a coupon engine, a side
cart and a variation swatches plugin. Five licences, five update cycles,
and five stylesheets fighting over the same checkout page.

MevvCart is those five things in one plugin, with one look across the
whole flow.

= Sales funnels =

Build an ordered path — landing, checkout, upsell, downsell, thank you.
Take over the store checkout so everyone who reaches payment goes through
your funnel, not just people who arrive from its link.

Each step is a real WordPress page with its own editor, permalink and
revisions, so your page builder keeps working.

= Ready-made funnel templates =

Steps no longer open as a blank page. Twenty-six starting points ship with
the plugin — at least four for every step type (landing, checkout, upsell,
downsell, thank you) — written in real English rather than filler text, so
you edit a page instead of facing an empty one.

There are also four end-to-end funnels: pick "Single product sale" and you
get the landing page, the checkout with its order bump wording already
written, and the thank-you page, in order and ready to publish.

Templates that use WooCommerce product blocks are only offered when those
blocks are actually registered on your site, so no template can ever put a
"this block is not recognised" box on your page.

= Order bump and one-click offers =

An order bump is a single tick box inside the payment form — the customer
never leaves the page, so it converts better than a separate offer step.

A one-click offer is shown after the order is paid and charged without
asking for the card again. Where the payment gateway supports saved cards,
the offer is charged against the stored token; where it does not, the
offer is created as an order awaiting payment rather than silently marked
as paid.

= Abandoned cart recovery =

Capture guest and logged-in carts, then send reminders over email, SMS,
WhatsApp and web push. Recovered revenue is attributed from the actual
order total, not the stale cart value, so the numbers survive the customer
changing quantities or accepting an order bump.

Consent is asked for explicitly at checkout and stored per channel. Email
addresses are masked in the event log.

= Rule-based coupons =

A flat discount for everyone costs you margin on customers who would have
bought anyway. Rules let you spend the discount where it changes the
decision: first order, cart threshold, product, category, returning
customer, country, day of week, hour of day.

Tiered discounts, buy X get Y, coupons applied automatically, and an
"add X more" progress bar in the cart.

= Modern cart and checkout =

A slide-out cart that updates without a page reload. A free shipping
progress bar that reads the threshold from your own WooCommerce shipping
zones. Cross-sell suggestions inside the cart. A step indicator across
cart, payment and confirmation. Two-column checkout with the order summary
pinned and product images in it.

= Variation swatches =

Colour, image and button swatches instead of a dropdown — for global
attributes and for the plain per-product attributes that most small stores
actually use. Out-of-stock options can be crossed out, dimmed or hidden.

The dropdown is kept in the page and hidden, so WooCommerce's own
variation logic — price, image, stock, add-to-cart — keeps working
untouched.

= Appearance =

Four ready-made looks, an accent colour, and a custom CSS box that loads
only on the flow pages. Any template can be overridden from your theme at
`your-theme/mevvcart/`, which survives plugin updates.

= Free and Pro =

The free version is a complete, working plugin: cart tracking, one email
reminder, one funnel with three steps, store checkout takeover, one coupon
rule, the modern cart and checkout layouts, colour and button swatches,
the role manager and the event log.

MevvCart Pro is a separate add-on plugin, installed alongside this one
and available from mevvsoft.com. It lifts the limits and adds the revenue
features: unlimited reminder sequences with SMS, WhatsApp and web push;
unlimited funnels and steps; order bumps and one-click offers; A/B
testing; unlimited coupon rules; image swatches and swatches on shop
listings; step-level analytics; and custom CSS.

This plugin is complete on its own and never asks for a licence key. If
you never install the add-on, nothing here stops working and nothing
phones home.

Full documentation: https://mevvsoft.com/docs/mevvcart

== Installation ==

1. Upload the plugin folder to `/wp-content/plugins/` or install it from
   Plugins → Add New.
2. Activate it. WooCommerce must be active.
3. Open **MevvCart** in the admin menu. The dashboard tells you what is
   on and what is not.

== External services ==

This plugin connects to no third-party service, and it makes no outbound
HTTP request of any kind. There is no telemetry, no licence check, no
remote font, no CDN asset and no analytics beacon. The chart library and
the two typefaces used by the admin screens are bundled inside the plugin
and served from your own site.

The paid MevvCart Pro add-on is a separate plugin. It is the one that
verifies a licence key against mevvsoft.com, and that request is declared
in its own readme. Installing this plugin alone never contacts us.

Cart recovery messages are sent by your own store: email through
WordPress' `wp_mail()`, and SMS, WhatsApp or web push only through
credentials you enter yourself for a provider you already have an account
with. No message and no customer record passes through us.

== Frequently Asked Questions ==

= Does it work with my theme? =

The cart, checkout and thank-you layouts go through WooCommerce's own
template layer, so they behave the same on any theme. Where a theme styles
WooCommerce aggressively, the ready-made looks and the custom CSS box are
there to settle it, and any template can be overridden from your theme
folder.

= Will it break my checkout? =

Every WooCommerce hook, field name and nonce is preserved, so payment
gateways, consent boxes and the terms checkbox keep working. Each layout
can also be switched off on its own, leaving WooCommerce's default in
place.

= Does it send data anywhere? =

No. This build makes no outbound request at all — see "External services"
above. Chart libraries and fonts are bundled with the plugin, so the admin
screens load nothing from outside your site.

The Pro add-on is a separate plugin and it is the one that checks a
licence against mevvsoft.com. This plugin contains no licence client and
makes no such request.

= Another swatches plugin is active. What happens? =

MevvCart's swatches switch themselves off and tell you why. Two swatch
plugins fight over the same dropdown and neither ends up working.

== Screenshots ==

1. Funnel builder — ordered steps with drag-to-reorder
2. Checkout with an order bump inside the payment form
3. One-click offer shown after the order is placed
4. Slide-out cart with free shipping progress
5. Coupon rules — each rule summarised in one line
6. Variation swatches on a product page
7. Funnel reports with the step breakdown

== Changelog ==

= 1.2.1 =
* WordPress.org submission build. `tools/package.sh --wporg` produces a
  package that contains neither the store update client nor the optional
  usage-statistics sender, and proves their absence with `unzip -Z1`
  before it exits. A plugin hosted on WordPress.org may not update itself
  from elsewhere, and the usage statistics only ever benefited us. The
  mevvsoft.com package is unchanged: the plugin reads whether those files
  are present rather than guessing where it was installed from. On the
  WordPress.org build the setting, the scheduled event and the request all
  cease to exist.
* The cart, checkout and thank-you template overrides now use this
  plugin's own text domain. The wording is unchanged and the translations
  were already shipped in all eighteen catalogues, so those strings are
  now translated where previously they fell back to WooCommerce.
* Every database read and write was reviewed: table names are interpolated
  from `$wpdb->prefix` directly, every value goes through
  `$wpdb->prepare()`, and the few remaining string fragments in a query
  are prepared before they are joined.
* Admin request handling was tightened throughout: nonce verification sits
  in the handler that reads the request, and every query and form value is
  unslashed and sanitised where it is read.
* Output escaping completed across the admin screens and the default email
  template, direct file access protection added to every PHP file, and the
  translator comments the catalogues need are now in place.
* Guest email capture, which is a public endpoint, now requires a nonce, and
  the attribute-swatch term fields verify the term form's nonce before
  writing.

= 1.2.0 =
* A library of ready-made funnel templates. Adding a step now offers a
  "starting point" picker beside the step-type picker: 26 templates, at
  least four for every step type. A template writes the STEP SETTINGS as
  well as the page — offer headline, accept button and decline link text
  arrive filled in, leaving only the product to choose.
* Four end-to-end ready flows: single-product sale (landing → checkout with
  an order bump → thank you), one-offer express checkout, landing to
  upsell, and the full flow with a downsell. The first two fit inside the
  free edition's three-step limit; when a longer flow hits the limit, the
  screen states how many steps were created and which were not.
* Template copy is real English, not lorem ipsum. The sentences are
  plausible enough to stand on a real page and still announce themselves
  as placeholders, so they do not go live by accident.
* Templates never overwrite existing content and never touch a setting the
  merchant saved by hand. Order bump settings are written only when a
  licence is present — in the free edition those fields are disabled
  anyway.
* The five templates that use WooCommerce product blocks live in a separate
  file and enter the list only when those blocks are actually registered; a
  template referring to an unregistered block rendered an "unrecognised
  block" box on the page.

= 1.1.0 =
* Coupon countdown in the recovery email: the new {{coupon_countdown}} tag
  prints expiry wording calculated at send time ("until 5 September 18:00
  — 23 hours left") and works in every email client. Optionally a live
  image, served from your own site and redrawn on each open, can be added
  as well. The image URL carries no personal data — only a signed
  timestamp — and returns an "expired" graphic once the deadline passes.
  Where the server has no GD extension the setting arrives disabled with
  the reason stated on screen.
* Measurement plumbing for email A/B testing: which variant went to which
  cart is recorded, and conversion is attributed per variant using the real
  order total. Variant creation, weighted delivery and the report live in
  MevvCart Pro; the free edition keeps sending its single reminder template
  as a single variant.
* On existing installations the table schema now refreshes itself during a
  plugin update — new columns no longer wait for a reactivation.

= 1.0.3 =
* A store update mechanism was added to the free edition. The plugin was
  not on WordPress.org and had no way to learn that a new version existed;
  the response is Ed25519-signed and pinned to mevvsoft.com. (This file is
  not part of the WordPress.org package — see 1.2.1.)

= 1.0.2 =
* The plugin now speaks fifteen more languages: German (CH and the formal
  form), Spanish (ES/MX/AR/CL/CO), French, Italian, Japanese, Dutch
  (NL/BE), Polish, Brazilian Portuguese and Russian. The catalogues had
  been produced for 1.0.1 but never made it into the published package:
  1.0.1 in the store carried only Turkish, German and Portuguese, and every
  installation in the remaining fifteen languages silently fell back to
  English.

= 1.0.1 =
* Fix: a cart is no longer closed when payment for the order fails, so the
  recovery reminder can still be sent. The hook ran as soon as the order
  record was created — before payment resolved — so customers whose payment
  did not go through never received a reminder at all.
* Conversion is now read from the order status, so bank-transfer (on hold)
  and card (processing) orders are counted correctly regardless of the
  setting.

= 1.0.0 =
* First release.
* Sales funnels with landing, checkout, upsell, downsell and thank-you steps.
* Store checkout takeover and checkout field control.
* Order bump and one-click upsell / downsell.
* Abandoned cart recovery over email, SMS, WhatsApp and web push.
* Rule-based coupons with tiered discounts and buy X get Y.
* Modern cart, checkout and thank-you layouts, slide-out cart, free
  shipping progress and cross-sell.
* Variation swatches for global and per-product attributes.
* Funnel and coupon analytics, A/B testing, role manager, event log.
* Turkish, English and German.

== Upgrade Notice ==

= 1.0.0 =
First release.
