Sellat Proof for WooCommerce

Description

When a customer says they never accepted your terms, or disputes what they ordered and when, a screenshot of your admin is your word against theirs. Sellat Proof for WooCommerce keeps independent, timestamped evidence of both, from the moment the order is confirmed.

What it records

  • Every confirmed order, paid or on hold waiting for a bank transfer. The order number, dates, amounts, products, status and payment method, the version of your terms and privacy policy in force at checkout, and a fingerprint of the customer’s email. This proof record never includes the customer’s name, address, email or phone.
  • Every version of your legal pages. Terms and conditions, privacy policy, returns and shipping. Each time the content of one changes, a new version is recorded with its exact text, and each order points to the version in force when it was placed.

How it is protected

The record is sent to Sellat, which anchors its fingerprint on public blockchains (Polygon and Bitcoin). Nothing personal is published: only a hash.

  • Free daily protection. The day’s orders are grouped into one proof of your shop, anchored once a day. Each order keeps its record and its path in the day’s tree. Any order you choose can also get an eIDAS qualified timestamp by hand, with its own proof, spending one of your account’s seals.

Verifiable without Sellat

From each order you can download a proof pack: the record, the exact text of the accepted terms, the public proof on the blockchains and a README that explains how to check everything with standard tools. Once downloaded, a pack checks without Sellat. Your shop also keeps its own copy of every record and, once each proof is final, of the proof itself (the day’s tree and anchor, an order’s own proof and seal, each legal version’s proof): if Sellat cannot be reached, the plugin builds the same pack from those copies.

Built for WooCommerce

  • Classic checkout and the Cart and Checkout blocks.
  • High-Performance Order Storage (HPOS).
  • Background jobs with Action Scheduler: the checkout never waits for Sellat. If Sellat cannot be reached, orders wait and are sent later, with retries.
  • A Usage screen: everything protected in the last 7, 30 or 90 days, sales covered, eIDAS seals issued and left, a chart per day, and what your plan has left.
  • A Sellat box on each order, a Sellat column in the orders list, and WooCommerce Sellat with the connection, the protection settings, the orders, the legal pages and a log of every call.
  • The API key is stored encrypted. Personal data tools: the acceptance IP joins WooCommerce’s export and erasure, and a suggested text is added to Settings Privacy.

More about the plugin, and a sample of the certificate it gives each legal page version: sellat.app/en/woocommerce.

Please note: this plugin helps you keep evidence. It does not by itself make your shop compliant with any law, and whether a proof is accepted, and with what weight, is for the court or authority that sees it to decide.

External services

This plugin connects to Sellat (https://sellat.app), the service that records and timestamps the proofs. Nothing is sent until you connect your shop in WooCommerce Sellat, either by signing in to Sellat from there or by pasting an API key.

Once connected, the plugin sends to Sellat’s API (https://sellat.app/api/v2):

  • When you click “Create an account and get the key”: your browser opens sellat.app with your shop’s random identifier, its domain and the address to come back to.
  • When you connect, and when you test the connection: your shop’s domain, its name, its random identifier, and the versions of WordPress, WooCommerce, PHP and the plugin.
  • To show what your plan allows: your plan, seals and limits are read from Sellat when you open the plugin’s screens (at most every 5 minutes) and once a day.
  • When you connect and when you save your protection settings (and later, if Sellat could not be reached): your protection settings (how orders are proven, the eIDAS seal and whether the acceptance IP is included), which Sellat checks against your plan.
  • When a legal page changes: the fingerprint (SHA-256) of the page’s content, its URL, type, language and version number, and the text of the page itself, so that every proof pack can carry the exact terms. Once a day the plugin checks the pages for changes and asks Sellat for the state of their proofs.
  • When an order is confirmed (paid, or on hold waiting for an offline payment such as a bank transfer): the order record: its number, dates, amounts, products, status, payment method and language; the customer’s account number, if they have one, and the fingerprint of their email; the version and address of the terms they accepted and of the privacy policy shown at checkout; and your shop’s name, domain and, if you enter it, tax ID. It includes the acceptance IP only if you turn that option on.
  • Only if your Sellat account includes custody and you turn it on: a full copy of the order, including the customer’s name, addresses, email and phone. Until Sellat keeps it, the copy waits on your server encrypted; a server that cannot encrypt it (PHP without OpenSSL) neither keeps nor sends it.
  • When you download a proof pack: the order’s billing email, so that Sellat can check it against the fingerprint in the record and include it in the pack. Sellat does not keep it.
  • When you ask for it from an order or a legal version: an eIDAS qualified timestamp, a certificate or a pack, or removing a copy from custody.
  • To keep states up to date: requests for the state of your orders, every 15 minutes while some are not final, and the address where Sellat can notify your shop (only for shops served over https). When you delete the plugin, it asks Sellat to stop those notifications.

Sellat anchors fingerprints on Polygon and on Bitcoin (through OpenTimestamps), and requests eIDAS qualified timestamps from a qualified trust service provider. The plugin itself never contacts them.

Sellat’s terms and conditions and privacy policy.

The plugin also makes one request to your own site: when a legal page changes, it fetches the page as a visitor sees it and keeps that copy as context, in your uploads folder.

Installation

  1. In WordPress, go to Plugins Add New, search for “Sellat Proof for WooCommerce”, install and activate it. WooCommerce must be active.
  2. Go to WooCommerce Sellat and click “Create an account and get the key”. You sign in to Sellat (or create a free account), and you come back connected. If you already have an API key, you can paste it instead.
  3. In the Protection tab, choose the legal pages the plugin should watch. Your WooCommerce terms page and your privacy policy page are chosen for you.

From then on, every confirmed order is recorded. Orders confirmed before you connect wait and are sent once you do.

On nginx, add this rule to your server block so the plugin’s private folder is never served directly (Apache uses the .htaccess the plugin writes):

location ~* /wp-content/uploads/sellat-proof/ { deny all; }

FAQ

Do I need a Sellat account?

Yes. The proofs are made by the Sellat service. The free account includes the daily protection of your orders, the recording of your legal pages and the eIDAS qualified timestamp by hand, paid with seal credits.

What does the eIDAS qualified timestamp cost?

It is optional. Each one uses a seal credit from your Sellat account: every account gets one free, and more are sold in packs. Nothing is spent unless you press “Add eIDAS seal” on an order and confirm. See Sellat’s prices.

What if my legal pages use shortcodes, blocks or a page builder?

Sellat records each legal page as WordPress renders it for a visitor, and “Local copy” in WooCommerce Sellat Legal pages opens each version exactly as it was recorded. Every WordPress is different: check that what is recorded is what your customers see. A shortcode, block or plugin that changes the page for each visitor, or hides part of it, may not have been foreseen. If something does not match, write to us at help@sellat.app.

Can someone recover my customer’s email from the record?

No. The record carries a fingerprint of the email, not the email. Whoever holds the record, though, can check whether a given email is the one in it: that is what lets anyone verify a proof pack, which carries the email.

What happens if Sellat is down?

Nothing at checkout: the plugin never makes the customer wait. The order is marked as waiting and is sent later, with retries, and the WooCommerce Sellat Log tab shows each attempt. Proofs that are already final do not need Sellat at all: your shop keeps a copy of each one and builds the proof pack from it.

What happens to my proofs if I delete the plugin?

They stay in Sellat, and by default the plugin leaves each order’s link to its proof and your local copies in place. Deleting the plugin forgets the API key and the settings. To remove everything, define SELLAT_PROOF_REMOVE_ALL_DATA as true in wp-config.php before deleting it.

Does it need the PHP mbstring extension?

No. Without it, the plugin lowercases only ASCII letters when it fingerprints the customer’s email, so an email with an accented letter would get a fingerprint different from the one Sellat computes; with mbstring (installed on nearly every host) they always match.

Does it work with the block checkout and with HPOS?

Yes, both.

Reviews

There are no reviews for this plugin.

Contributors & Developers

“Sellat Proof for WooCommerce” is open source software. The following people have contributed to this plugin.

Contributors

Changelog

1.0.0

  • First public release: daily proofs of confirmed orders, legal page versions, the eIDAS qualified timestamp by hand, proof packs (also built by the shop from its own copies of the final proofs), a Usage screen, block checkout and HPOS support.