=== PrintPrice: STL & 3MF Price Calculator for WooCommerce ===
Contributors: sebastiankumor
Tags: woocommerce, 3d-printing, stl, calculator, quote
Requires at least: 6.0
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 1.3.9
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Let customers upload STL, OBJ, 3MF or STEP files, see an automatic 3D-print price, and add the quote straight to the WooCommerce cart.

== Description ==

**Requires WooCommerce.** PrintPrice is a WooCommerce add-on, the WooCommerce plugin must be installed and active for PrintPrice to do anything. If WooCommerce isn't present, PrintPrice will refuse to activate.

PrintPrice turns any WooCommerce store into a 3D-print quote shop. Customers upload an STL, OBJ, 3MF or STEP file, choose material / colour / infill, and get an instant price based on your own material costs and profit-margin tiers. The price becomes a regular WooCommerce cart item, they check out the same way they would any other product.

This plugin is a thin client to the **PrintPrice Cloud** service at https://wp.printprice.one. The cloud service does the heavy lifting: parsing the mesh, computing volume / mass / print time, applying your pricing rules, and storing the uploaded file so you can download it from the order detail in WordPress admin. **No 3D-printing background needed**: sensible defaults work out of the box, then you tune materials and margins to match your shop.

The free tier (5 paid orders per month, STL, OBJ and 3MF uploads) is unlocked the moment you activate the plugin, no opt-in, no signup form, no credit card. Paid tiers (50 / 100 / 300 orders per month) add STEP / STP CAD file support and unlock through a Freemius checkout from the admin **Upgrade** menu when you're ready.

= Features =

* **STL, OBJ, 3MF and STEP** upload with an in-browser 3D preview, on any WooCommerce product page (STEP / STP CAD files on paid plans)
* **Multi-color 3MF detection**: recognises sliced files with multiple filaments and adds a "Multi-color" badge plus a configurable purge-waste allowance to the quote
* **Print-time estimation**: pulled directly from sliced 3MF gcode where available, or estimated from filament mass when not
* **Material catalogue you control**: name, colour, price per kg, density, currency, used directly in price calculations
* **Profit-margin tiers**: different multipliers for different cost bands (e.g. higher margin on small prints, lower on bulk)
* **Bulk pricing**: automatic per-unit discount above a quantity threshold you set
* **Multi-file orders**: customers upload several files in one transaction with per-file quantities
* **Per-file materials**: each uploaded file can have its own material and colour, priced individually and shown as a per-file breakdown on the order
* **Minimum price per part** (optional): set a floor so very small prints still cover your handling; off by default
* **18 languages**: the storefront widget follows the WordPress site language automatically; your own custom labels always take priority
* **Order admin block**: every order's admin detail page shows uploaded files (downloadable), material, infill, print status, multi-color badge, and the per-file material breakdown
* **Customisable widget**: colours, button labels, fonts, and uploader styling configurable from a hosted React dashboard
* **Gutenberg block**: drag "PrintPrice Calculator" straight into any page; also works as the legacy `[print_price_widget]` shortcode

== External services ==

This plugin connects to **PrintPrice Cloud** (https://wp.printprice.one), operated by PrintPrice, to provide the STL / OBJ / 3MF / STEP upload, price calculation, and quote-product creation that customers see on your storefront.

**Customer data is processed by this third party.** Specifically:

Data sent to PrintPrice Cloud on each customer interaction:

* The STL, OBJ, 3MF or STEP file the customer uploads (uploaded directly from the customer's browser; the file never touches your WordPress server)
* Material / colour / infill selections and quantity
* Your store domain
* Your PrintPrice plugin identifier (a random ID generated locally on first activation, plus, for paid subscribers, a Freemius license key)

Data sent during plugin setup (one-time):

* Your WooCommerce REST API consumer key + secret, used by PrintPrice Cloud to create the quoted "product" in your WooCommerce catalogue and add it to the customer's cart

Data sent on payment (paid subscribers only):

* Your email and chosen plan are processed by Freemius (https://freemius.com), our billing provider, to issue and validate paid licenses. Freemius's terms apply: https://freemius.com/terms/

Nothing is transmitted until the plugin is activated. Uploaded files are stored on AWS S3 in the Frankfurt region (eu-central-1), encrypted in transit (HTTPS) and at rest. Files associated with deleted orders are removed within 7 days. The full data flow and retention policy is documented in our Privacy Policy.

* Terms of Service: https://printprice.one/terms
* Privacy Policy: https://printprice.one/privacy
* Refund Policy: https://printprice.one/terms#refund

== Installation ==

**Prerequisite:** WooCommerce must be installed and active before you install PrintPrice. PrintPrice will refuse to activate without it.

1. Install the plugin via the WordPress.org Plugin Directory, or upload the `print-price` folder to `/wp-content/plugins/`.
2. Activate. The plugin generates a free-tier identifier for you automatically, no signup required.
3. Go to **PrintPrice → Settings**.
4. Generate WooCommerce REST API keys at **WooCommerce → Settings → Advanced → REST API → Add Key** with **Read/Write** permission. Paste the consumer key and secret into the PrintPrice settings page and save.
5. Click **Test connection** to verify your store can talk to PrintPrice Cloud.
6. Add the **PrintPrice Calculator** block to any page in the block editor (or use the `[print_price_widget]` shortcode in a Shortcode block). You're live.

To unlock higher monthly order limits, open **PrintPrice → Upgrade** and pick a Basic / Pro / Business plan.

== Frequently Asked Questions ==

= Do I need a separate PrintPrice account? =

No. On activation, the plugin generates a random free-tier identifier locally, no signup form, no email confirmation, no credit card. You're on the free plan (5 paid orders per month) immediately. If you want a higher limit you can upgrade in-place via Freemius from **PrintPrice → Upgrade**.

= Which file formats can customers upload? =

STL, OBJ and 3MF on every plan, including the free tier. STEP and STP (CAD) files are available on the paid plans (Basic / Pro / Business). All formats get the same instant price and in-browser 3D preview.

= Where does the uploaded file go? =

Directly from the customer's browser to PrintPrice Cloud's AWS S3 storage in Frankfurt. It does not pass through your WordPress server. We retain it for the lifetime of the resulting order plus 7 days after the order is deleted, then permanently remove it. You can also delete individual files at any time from your order admin.

= Can I customise the calculator UI? =

Yes, colours, button labels, fonts, and uploader styling are configurable in **PrintPrice → Design** (the hosted dashboard that opens in your WordPress admin).

= Does it work with the block editor / Gutenberg? =

Yes. Drag the **PrintPrice Calculator** block from the inserter into any page. The legacy `[print_price_widget]` shortcode is also supported for sites still using the classic editor.

= What happens if I hit my monthly plan limit? =

The plugin will continue serving existing customers who already added items to their cart. New customers attempting to start a calculation see a "this shop is currently at capacity" message until you either wait for next month or upgrade to a higher tier.

= Can I uninstall and get my data back? =

Yes. Uninstalling keeps your settings (so re-activation works) but stops sending data to PrintPrice Cloud. To request deletion of your stored files and merchant data on our side, contact us via the support form in **PrintPrice → Support**.

= Do I have to use a paid plan? =

No, the free tier covers 5 paid orders per month forever. Most hobby print shops never need to upgrade. Paid tiers exist for higher-volume sellers (Basic 50/mo, Pro 100/mo, Business 300/mo).

== Screenshots ==

1. PrintPrice merchant dashboard, total print calculations, paid orders, total / print / profit revenue, with a per-period chart.
2. Materials and Pricing, your filament catalogue (name, colour, price per kg, density) plus per-shop print settings (purge waste, machine-hour rate, minutes per gram).
3. Appearance customiser, live preview of the storefront calculator on the left with theme, corner radius and typography controls on the right.
4. Orders list, every customer print order, filterable by status, with totals and print-status badges.
5. Subscription details, current plan, usage this period, and a one-click upgrade path through Freemius.
6. "How to Setup" walkthrough, in-admin onboarding that walks new merchants through WooCommerce REST keys, materials, profit margins, and the PrintPrice Calculator block.

== Changelog ==

Version numbers match the PrintPrice product line (same numbering as
our Shopify app). The WordPress plugin debuts at 1.0.3 with feature
parity to the Shopify side as of the same date.

= 1.3.9 =

* Legal confirmation records now show every checkbox presented to the customer, including confirmations they left unchecked.
* Order-routing rules now support up to 100 conditions, with pagination for large rule sets.
* Button hover and pressed colours now save reliably, and invalid colour values safely fall back to usable colours.
* Store connections are only accepted after WooCommerce access and webhook registration are fully verified.
* Reinstalled or disconnected stores now receive clear recovery instructions without creating duplicate store identities.
* PrintPrice emails recovery guidance after detecting an identity problem.

= 1.3.8 =

* Add optional legal confirmation checkboxes under Pricing. Start with suggested intellectual property declarations or write your own, and choose whether each checkbox is required.
* Customer confirmations are saved with the quote and resulting order, so you can review exactly what was accepted.
* General bug fixes and reliability improvements.

= 1.3.7 =

* PrintPrice now checks in automatically every six hours, even when you do not open the dashboard. This helps us distinguish an active shop that needs help from a plugin that was intentionally deactivated.
* Paid stores always remain in active support monitoring. If billing is interrupted, your store remains protected for 14 days while you update the payment details.

= 1.3.6 =

* General bug fixes and reliability improvements.

= 1.3.5 =

* If you change the WordPress home or site address, PrintPrice now reconnects your store automatically. It verifies your existing WooCommerce connection at the new address and restores the order webhooks without sending credentials through the old domain.

= 1.3.4 =

* If an earlier update left your dashboard showing a new, empty shop while your storefront kept the real settings, PrintPrice now reconnects it automatically. It proves ownership through your existing WooCommerce connection, then restores access to the materials, pricing and appearance that were never deleted.

= 1.3.3 =

* Your settings could appear to reset themselves, with your materials and pricing replaced by defaults while your live site kept showing the real ones. Nothing was ever deleted. This release stops it happening. If your dashboard still looks empty after updating, contact support and we will reconnect it.

= 1.3.2 =

* Set your nozzle size and wall count under Pricing, so quotes are weighed on the printer you actually use instead of a 0.4 mm assumption. Shops running a wider nozzle, or more walls, were undercounting the plastic in every part they sell.
* A post-processing add-on priced as a percentage was saved as a fixed amount, so "50% of the order" became a flat 50. The percentage now sticks, and it is charged on the print price, so it scales with the size of the job.
* Buying a plan now takes effect by itself. An upgrade was not reaching PrintPrice, so a paying shop kept its free monthly limit, and while trying to sync the plugin could lose track of which shop it was set up as.

= 1.3.1 =

* PrintPrice now checks your store every hour: it puts back missing order webhooks by itself, reconnects a store that was switched off by a passing outage, and emails you once, only if something needs you.
* A brief outage at your host no longer counts as several failures. Setup calls arrive together, so one bad second used to spend most of a store's allowance in one go and switch the connection off.
* Uploads with more than one file quoted too much material. The markup was applied to the whole upload and then again for each file, so a four-file order carried it four times over. One file printed several times was always priced correctly.
* A quote could fail outright, showing your customer an error instead of a price, on stores where a material had no currency recorded. The currency is now taken from your other materials, and a quote is never held up by it.
* Deleting a material left it in the list until you reloaded the page, and opening it produced a server error rather than saying it had gone. The list now refreshes itself after every add, edit or delete.

= 1.3.0 =

* **Handling time**: charge the setup and finishing minutes every print costs you, billed at your own labour rate. That is a separate setting from the machine-hour rate, which covers what the printer costs to run unattended. Choose per order, per file or per printed part under Pricing, with a live example of what each choice adds. Customers still see one price; handling is never itemised for them.
* Two ceilings keep handling in proportion, both on by default: at most one hour per order, and at most half the print price. A batch of small parts sharing one plate is never quoted as hours of labour, and a cheap print never costs more in handling than in printing.
* Customers now get a "?" beside each filament saying what it is for: PETG for outdoor parts, TPU where it must flex. In all 18 storefront languages, and it works even if you have renamed your materials.
* A "?" beside Infill density now explains what infill is, that more of it means a stronger and heavier part, and that it costs more to print. In all 18 storefront languages, so fewer customers guess high and abandon the quote.
* Materials now carry a family (PLA, PETG, TPU, ...), prefilled when you add from the filament library, and worked out from the name for materials you already have.
* A "new quote is waiting" email that never arrived left nothing to look at. Each one is now recorded against the quote, so a missing notification can be traced.
* Customers now see one line under Infill density saying what the percentage they picked is actually for, from decorative at 10% to solid at 100%. Written for you in all 18 storefront languages, and you can replace the wording with your own under Pricing.
* Model units are now tucked behind "My model is not in millimetres", and only appear for STL and OBJ files at all. 3MF and STEP already state their own units, so the question was being asked when it could not change anything.
* Materials are now listed by material, with their colours folded underneath, so a dozen filaments in ten colours is twelve rows instead of a hundred and twenty. Add several colours at once, and set a price, density, name or on/off state for a whole material in one go. Colours can still be priced individually for specialty spools.
* Labels, hints, buttons and the quote email field were rendering too small to read, and on wider themes the calculator sat against the left edge instead of centred. Every size now comes from one scale your theme cannot shrink, and nothing customer-facing is under 12px.
* Uploading a .step file failed as an unsupported type, while the same model saved as .stp worked. The upload was quietly renaming the file and cutting its extension short, so a valid CAD model arrived looking like a format we do not accept.
* The admin pages now fit a phone. Materials, the dashboard, quote approvals and Appearance each needed sideways scrolling to reach half of what was on them. Rows, cards and the two-column Appearance layout stack instead.
* The calculator no longer changes width when a customer picks a file. It settles on one size from the start, decided by where you put the 3D preview, so nothing on the page shifts mid-quote.
* Unpaid quotes were counting against your monthly order allowance, so a busy month of enquiries could stop the calculator quoting for everyone. Only orders that were actually paid count now, which is what your plan always said.
* On quote approvals, Reject now looks like the destructive action it is, and a failure there shows as an error rather than an ordinary notice.
* If your shop moves to a new web address, or starts redirecting to one, PrintPrice now notices and emails you the one step that reconnects it. Before, it looked like a rejected API key and orders quietly stopped.
* A shop whose connection had switched itself off now gets an email saying exactly that, and what to do about it, instead of a note about one failed checkout.
* Retrying add to cart while the shop connection was broken showed a hard error page. It now shows the same short message as the first attempt, and notifies the shop owner.

= 1.2.4 =

* The buttons on the Plans page did nothing when clicked. Each plan now opens the checkout for that plan, and the page lists what every plan includes — only the monthly order allowance and the support channel differ.
* When a WooCommerce API key was rejected, stores running WordPress in a language other than English were told to regenerate the key even when the real problem was its permissions. The message now names the actual fix in any language.
* A dropped connection while the calculator was starting up left "we could not load this shop's materials" on screen for good — common on a phone that changes network. It now retries, and reloads itself when the customer returns to the tab.
* Links in the dashboard now open in place instead of loading a page outside the WordPress admin.

= 1.2.3 =

* A customer whose browser cannot show 3D was told the preview was unavailable for their file, which sent them off to re-export a model that was fine. The calculator now says their browser does not support 3D preview, in their own language, and the quote works as normal.
* Housekeeping: uploads left behind by abandoned quotes are now cleared on a schedule, as they already were on our Shopify service.

= 1.2.2 =

* **Optional customer notes**: switch on "Let customers add a note" under Pricing and customers can send print instructions with their quote. The note lands in the order's "Customer provided note", on the quote in Approvals, and in your quote emails. Off by default.
* **Automatic theme**: a new Appearance option, now the default. The calculator matches your site's light or dark background on its own. Light and Dark remain for a fixed choice.
* **Files per quote**: now yours to set under Appearance. The old fixed limit of five made customers merge a multi-part job into one file, which arrives as a single object you cannot split on the print bed. Choose up to 20.
* Fixed light-theme colours showing on dark sites, where the buttons blended into the page, Reset was a white block and the email field was a pale panel.
* A mistyped email on a quote request failed with "We couldn't reach our servers" and the quote was lost. The calculator now flags the address before sending, in the customer's own language.
* Add-on checkboxes could show as a bare tick, or not at all, on themes that replace the browser's own checkbox. The calculator keeps the standard one now, so add-ons are selectable whatever your theme.
* With the Dark theme on a light site, field labels and add-on text took the site's colour and disappeared into the dark card. Both themes now set their own text colour.

= 1.2.1 =

* **OBJ file support**: customers can now upload .obj files alongside .stl, .3mf and .step/.stp, on every plan including the free tier. They are measured with the same geometry maths as an STL and get the same interactive 3D preview. Like STL, an OBJ stores no units, so the customer chooses the unit at upload.
* Storefront calculator readability on dark themes: several labels, the quantity controls and the customer email field could render as text the same colour as the surface behind them, and the widget card had no visible edge on a dark page.
* The Browse button now follows the same styling rules as the price button, so it uses your brand colour instead of a fixed white block.
* The wireframe view in the 3D preview drew near-black lines, so on a dark theme the model looked like a black blob. It now draws in the selected filament colour.
* When the calculator cannot reach PrintPrice Cloud it now says so plainly, instead of showing a placeholder material list and an unusable price button.

= 1.2.0 - 2026-08-07 =
* **One-click filament library**: add a material from a built-in library of popular brands, with density and common colours pre-filled. You still set your own price per kilogram.
* **Quality tiers (Draft / Standard / Fine)**: optional. Turn them on to add a Quality dropdown to your storefront calculator; each tier multiplies the quote by a factor you choose. Off by default, so your current prices are unchanged.
* **Turnaround tiers (Standard / Express)**: optional rush upcharge you set. Off by default.
* **Post-processing add-ons**: optional paid services such as sanding or painting. You define each add-on (charged per order or per part) and customers pick them on the quote. Off by default.
* **Draft orders (quotes)**: instead of paying instantly, an order can become a draft order that sends the customer a pay link, with no temporary product added to your store. Choose the default for your store, or add rules such as "orders over a set amount become a draft." Quotes count towards the same monthly order allowance as instant checkout, and only once the customer pays.
* **Approvals page**: every quote waits for your review before the customer is asked for money, so nothing is priced without you seeing it. Open a quote to see the material, colour, infill, dimensions and volume, download the customer's files to check them in your slicer, adjust the price if the job needs it, then send the invoice. If you change the price the customer sees both the original estimate and the updated total, so the new amount is not a surprise. If you cannot take a job you can decline it with a short explanation, which is emailed to the customer.
* **Quote emails carry your shop name**: the confirmation, invoice and reminder emails a customer receives are branded as your store, not as PrintPrice, and replies go to you.
* **Quote reminders**: you get an email if a quote has been waiting for review, and a warning before a quote is removed. A customer with an approved quote they never paid gets their payment link again a few days later. Each reminder is sent at most once, and each can be switched off.
* **Wireframe view in the 3D preview**: customers can inspect a model's structure on the storefront.
* **Clearer settings**: Materials and Pricing are now two focused pages.

= 1.1.4 - 2026-07-31 =
* **Multi-object 3MF files now price reliably**: some 3MF projects that contain several separate parts (for example a plate exported from a slicer such as Bambu Studio) could fail to price and show a "servers are busy" message. These files now calculate correctly.
* **Spread-out projects no longer flagged as too large**: when a project lays several parts out across the print plate, PrintPrice no longer treats the whole arrangement as one giant object. Each part is now checked against your build volume on its own, and the quote still covers every part.
* **More forgiving maximum-size check**: a part only slightly over your configured build volume is no longer rejected outright, since in practice it can often still be printed.

= 1.1.3 - 2026-07-29 =
* **Clearer calculator labels**: the storefront calculator now shows a label above the infill and model-units dropdowns, and infill starts on a recommended setting, so customers know what each control is for.
* **Price refreshes after changes**: changing the quantity, material, colour, or units after calculating now clears the old quote so a fresh price is shown, instead of keeping the previous one.
* **More reliable support form**: "Send us a message" now saves your message the moment you send it, so nothing is lost if notifications are briefly delayed.

= 1.1.2 - 2026-07-28 =
* **Currency now follows your store**: prices across the plugin use your WordPress store currency automatically, including after you change it. Previously some stores could see the wrong currency.
* **Currency-change heads-up banner**: if you change your store currency, PrintPrice updates the currency shown on your materials and pricing but does not convert the amounts, so a banner reminds you to re-check your prices. It clears once you confirm them.
* **Cart page respected on Add to cart**: after a customer adds a quote to the cart they are sent to your actual cart page, including a custom cart page or slug, instead of always /cart. A new optional Cart URL override under PrintPrice, Settings lets you set it explicitly; leave it blank to auto-detect.

= 1.1.1 - 2026-07-20 =
* **Preview color per material**: set a colour swatch on each material under Materials and Pricing. Single-colour models are tinted to that colour in the storefront 3D preview. Preview only, it never changes the price.
* **Upgrade button** on the Subscription and Billing page, alongside the existing menu link.
* Refreshed the PrintPrice icon in the WordPress admin menu.

= 1.1.0 - 2026-07-20 =
* **Interactive 3D preview**: customers now see a rotatable, zoomable preview of their uploaded model in the widget before they order, for STL, 3MF and STEP files.
* **Native STEP support (paid plans)**: customers can upload .step and .stp CAD files and get an instant price and 3D preview, alongside the STL and 3MF formats available on every plan.
* **Per-file material and color**: when a customer uploads several files, each file can have its own material and color. The full per-file breakdown, with the price of each part, appears on the order detail page and on the WooCommerce order screen.
* **Minimum price per part**: new optional floor under Settings so very small models still cover your handling. Off by default, so existing pricing is unchanged.
* **Multicolor 3MF & material colors**: multicolor 3MF files show their real colors in the preview; single-color models are tinted to match the selected material. Set a "Preview color" swatch on each material under Settings.
* **18 languages**: the storefront widget now follows the WordPress site language automatically (including Chinese Simplified, Chinese Traditional and Korean). Your own custom labels always take priority.
* **Preview placement**: choose stacked, side-by-side, or off under Design.

= 1.0.12, 2026-07-01 =
* **Rate PrintPrice from the app**: once your store has had some success with the calculator, a small banner offers a one-click way to leave a review on WordPress.org. Choose "Remind me later" to hide it for two weeks.

= 1.0.11, 2026-06-27 =
* **Larger uploads**: file size limit raised from 25 MB to 250 MB, so bigger, more detailed STL and 3MF models are now supported on the storefront calculator.
* Oversized or unusually-compressed 3MF files now show a clear "file too large" message instead of a generic error.

= 1.0.10, 2026-06-19 =
* Maintenance and version alignment with the PrintPrice 1.0.10 release. No functional changes on WooCommerce this update.

= 1.0.9, 2026-06-12 =
* Bug fixes and minor improvements.

= 1.0.8, 2026-06-10 =
* **Profit margins save fix**: on some stores the "Save" request on the Profit Margins screen failed and your changes wouldn't persist. Saving now works reliably.
* **Storefront button visible on dark themes**: the widget's main button (Add to Cart / Calculate) now stays clearly visible on dark WordPress themes; previously the dark button could blend into a dark page.

= 1.0.7, 2026-06-02 =
* **Dark theme support on the storefront calculator**: title, subtitle, pickers, and the file dropzone now inherit your WordPress theme's colours. The widget no longer renders as a glaring white card on dark themes. Light themes look identical to before.
* Internal: block editor cache-bust version now matches the plugin release (was a leftover 1.0.5 string in the 1.0.6 build because Freemius rejected the re-upload; clean now).

= 1.0.6, 2026-06-02 =
* **Printer build volume setting**: new field in PrintPrice → Settings → Print Settings. Tells the calculator your printer's maximum object size (defaults to the Bambu X1/P1S/A1 at 256 × 256 × 256 mm). Uploads larger than this are rejected with a clear "model too big" message instead of producing an unbillable quote.
* **Customer-side units dropdown**: the storefront calculator now asks the customer what unit their STL/3MF coordinates are in (mm / cm / m / inches; mm by default). Helps catch architectural or engineering CAD exports that come out at the wrong scale.
* **Object dimensions shown next to the price**: "Object size: 12 × 8 × 5 mm" appears alongside the calculated price so customers can sanity-check the scale before adding to cart.
* Bug fix: defensive guard against pathologically-oversized model uploads (typically architectural or engineering CAD exports at real-world scale). Previously these could slip through and generate nonsensical quotes; now they're rejected before pricing with a clear "model too large" message.

= 1.0.5, 2026-06-02 =
* **Email alerts when something breaks the storefront calculator**: if a customer hits Add-to-Cart and WooCommerce rejects the quote-product creation (Read-only API key, expired keys, plugin conflict, etc.), PrintPrice now emails the WordPress admin address with the specific issue and how to fix it. Throttled to one notice per issue per day, so a misconfigured key won't flood the inbox.
* **Generic storefront error message**: customers who can't add a quote to their cart now see "We couldn't add this quote to your cart right now. The shop owner has been notified." instead of leaked WC error details. Cleaner UX + smaller information-leak surface.
* PrintPrice plugin now passes the WordPress admin email + site name to the SaaS backend when saving Settings, so the alerts above can be delivered.

= 1.0.4, 2026-06-01 =
* **Setup-prompt notice**: first-time admins now see a welcome banner with a one-click link to PrintPrice → Settings, reminding them to add their WooCommerce REST API keys. Auto-hides once both keys are saved; dismissible per-user.

= 1.0.3, 2026-05-26 =
* **First public WooCommerce release**: full feature parity with the PrintPrice Shopify app
* **Native Gutenberg block**: "PrintPrice Calculator" appears in the block inserter; legacy `[print_price_widget]` shortcode still supported
* **Freemius-backed paid plans**: Basic / Pro / Business unlock via in-plugin Upgrade modal; cancellation handled through the Freemius account page
* **Free-tier identifier is auto-generated on activation**: no signup form, no opt-in modal; plugin works immediately on the free 5-orders/month tier
* **Per-tier monthly quotas** enforced server-side (Free 5 / Basic 50 / Pro 100 / Business 300); polite "at capacity" message on the storefront when the limit is hit
* **Merchant dashboard** with revenue, print-profit, paid-order metrics and per-period chart
* **Order detail file downloads**: single file or zip of all files for any order
* **Multi-color 3MF detection** with configurable purge-waste allowance
* **Print-time estimation** from sliced 3MF gcode or filament mass
* **Default materials + profit margin seeded on first load** (PLA Black + PETG Black; 3× of material cost)
* **License field is read-only**: managed automatically, replaced by a Freemius license once you upgrade
* Reliability under load: server queues concurrent calculations and adapts to available memory

== Upgrade Notice ==

= 1.3.9 =
Adds complete legal confirmation records, larger paginated order-routing rule sets, reliable button colours, and safer store connection recovery. No breaking changes.

= 1.3.8 =
Adds configurable legal confirmation checkboxes and reliability improvements. No breaking changes.

= 1.3.7 =
Adds an automatic six-hour health check-in so inactive plugins no longer look like broken stores. No breaking changes.

= 1.3.6 =
General reliability improvements. No breaking changes.

= 1.3.5 =
Automatically reconnects PrintPrice after you change the WordPress home or site address. No breaking changes.

= 1.3.4 =
Automatically reconnects a dashboard that an earlier update separated from its original shop. Your materials, pricing and appearance were never deleted. No breaking changes.

= 1.3.3 =
Fixes your saved settings appearing to reset themselves, with materials and pricing showing as defaults while your live site still served the real ones. Nothing was deleted. Update as soon as you can. No breaking changes.

= 1.3.2 =
Adds nozzle size and wall count to your print settings, so quotes are weighed on the printer you actually use. Fixes a percentage-priced add-on being saved as a fixed amount, and a paid plan not taking effect after purchase. Recommended for anyone on a paid plan. No breaking changes; safe to update.

= 1.3.0 =
Adds optional handling time to your pricing (off until you switch it on), plain-language help for filaments and infill, a materials list grouped by material, and a more legible calculator. No breaking changes; safe to update.

= 1.2.4 =
Fixes the Plans page buttons, which did nothing when clicked, and the calculator giving up for good after a dropped connection. No breaking changes; safe to update.

= 1.2.3 =
Fixes the message shown to customers whose browser cannot display 3D, which wrongly blamed their file. No breaking changes; safe to update.

= 1.2.2 =
Adds an optional customer notes box, and fixes the calculator using light colours on dark sites. No breaking changes; safe to update.

= 1.2.1 =
Adds .obj upload support on every plan, and fixes storefront calculator readability on dark themes (some labels and the email field could be invisible). No breaking changes; safe to update.

= 1.1.4 =
Reliability fixes for the price calculator: multi-object 3MF files now price correctly, projects with parts spread across the plate are no longer wrongly flagged as too large, and the maximum-size check is a little more forgiving. No breaking changes; safe to update.

= 1.1.3 =
Clearer calculator labels, and a fix so the price refreshes when you change quantity, material, colour, or units after calculating. No breaking changes; safe to update.

= 1.1.2 =
Prices now follow your store currency automatically, with a heads-up banner if you change it (amounts are not auto-converted, so re-check your prices). Add to cart now respects a custom cart page, with an optional Cart URL override under Settings. No breaking changes; existing pricing is unchanged. Safe to update.

= 1.1.1 =
Adds a per-material preview colour for the 3D preview, an Upgrade button on the Subscription page, and a refreshed admin menu icon. No breaking changes; existing pricing is unchanged. Safe to update.

= 1.1.0 =
Adds native STEP / STP CAD support (paid plans), a per-file material breakdown, an optional minimum price per part, 18 storefront languages, and the 3D preview now covers STEP too. No breaking changes; existing pricing is unchanged. Safe to update.

= 1.0.12 =
Adds an in-app prompt to rate PrintPrice on WordPress.org. No changes to the calculator itself. Safe to update.

= 1.0.11 =
File upload limit raised from 25 MB to 250 MB, larger STL/3MF models now supported. Safe to update.

= 1.0.10 =
Maintenance / version-alignment release. No functional changes on WooCommerce. Safe to update.

= 1.0.9 =
Bug fixes and minor improvements. No breaking changes; safe to update.

= 1.0.8 =
Fixes saving on the Profit Margins screen (some stores couldn't persist changes) and makes the storefront button clearly visible on dark themes. No breaking changes; safe to update.

= 1.0.7 =
Storefront calculator now adapts to your WordPress theme's colours instead of forcing a white card with dark text. Critical fix for dark-themed stores. No breaking changes; safe to update.

= 1.0.6 =
Adds a printer build-volume setting + a customer-facing units dropdown so wrong-scale CAD exports are caught before they generate runaway quotes. Existing setups keep working unchanged; the build-volume defaults to the Bambu X1/P1S/A1 (256 mm cube), raise it in Settings if you run a larger printer. No breaking changes; safe to update.

= 1.0.5 =
PrintPrice now emails the WordPress admin if a customer ever hits Add-to-Cart and the calculator can't talk to WooCommerce, so misconfigured stores get caught immediately instead of silently losing sales. Storefront error messages are cleaner too. No breaking changes; safe to update.

= 1.0.4 =
First-time admins get a welcome banner pointing at PrintPrice → Settings so they know where to add their WooCommerce REST API keys. No breaking changes.

= 1.0.3 =
First public WooCommerce release. Install or upgrade to get the full PrintPrice 3D-print quoting suite, Gutenberg block, automatic free tier, multi-color 3MF support, and an in-admin upgrade path to paid plans via Freemius.
