eutervogel Posted June 29 Posted June 29 (edited) I'd like to showcase the demo shop for my ProcessWire shop system. The demo lets you explore both the frontend and the administration backend. Feel free to log in, place test orders, and try out the available features. The shop automatically resets to its default state every six hours, so you can't accidentally break anything. If you'd like to receive the email notifications using your real email address, please make sure to delete your order immediately after testing, as your email address will be visible in the backend. Because this shop system is primarily developed for the German market, the demo shop and the documentation are currently available in German only. The "Stammdaten" section and the payment methods cannot be edited in the demo to prevent misuse. Demo: https://demoshop.mholte.de/ I'd be happy to hear your feedback, suggestions, and bug reports. Edited June 29 by eutervogel 8 6
eutervogel Posted June 30 Author Posted June 30 There was an issue with email delivery because the six-hour reset also reverted the sender address in the "Stammdaten" section back to the placeholder. I've fixed it, so emails are being sent correctly again.
Stefanowitsch Posted July 1 Posted July 1 Hi @eutervogel! I am extremely surprised and impressed. This shop "module" basically came out of nowhere and solves a huge "black hole" in the ProcessWire community: A functional, up-to date and all-in-one shop solution. I made a shop with Padloper (Version 1) years ago which was one of my first PW projects ever. And in my main job I am working for one of germanys biggest e-commerce shops. Coming that way I now what immense work setting up, developing and not least maintaining an online shop is nowadays. You have tons or regularities that you have to take care of and each year something is added. For example: Last year all bigger online shops had to be be overworked due to the German Accessibility Improvement Act now the latest "addition" was the integration of the "electronic cancellation button". If you offer a shop solution for a client based on an existing system or "custom made" - you have to be in constant awareness of the legal changes and act immediately. Then you have to design the landing page, category pages, product pages, the checkout pages, search pages and the whole customer backend. Not to mention many many e-mail templates. Because of that the last shop that I set up for a client was actually a Shopify solution. That still was a ton of work, especially if you consider the countless hours for reading the developer docs and becoming familiar with the Shopify CLI and the whole template/development system (and so on!). So it's nice to see that there is a PW alternative now. I like the fact that everything is integrated and the documentation seems to be extremely well planned. I can remember that there was another shop module for PW around that looked promising but offered little to no documentation at all. What a bummer. 4
eutervogel Posted July 1 Author Posted July 1 (edited) Thank you so much for your kind and thoughtful feedback! It really means a lot, especially coming from someone with your experience in both ProcessWire and professional e-commerce. The main reason I started developing this shop system was exactly because I felt there was a gap in the ProcessWire ecosystem. I also spent some time looking at PWCommerce, but as you said, the documentation made it very difficult to work with. I also ran into issues with commercial rounding quite early on, and even after quite a bit of tinkering I couldn't really get it to a point where I'd feel comfortable using it for the German market. You're absolutely right about the long term challenge. Building the shop is one thing, but keeping it up to date with changing legal requirements, security updates and everything else that comes with e commerce is probably the biggest task. That's definitely something I'm aware of, and I'll do my best to keep the project actively maintained. Development is still moving forward. I actually added customer accounts to the demo shop just a few minutes ago, so it's slowly growing feature by feature. Thanks again for taking the time to write such detailed feedback. Comments like yours are really motivating and reassure me that building this for the ProcessWire community was the right decision. Edited July 1 by eutervogel 1
Klenkes Posted July 1 Posted July 1 Hi @eutervogel! I just wanted to tell you that I spent quite some time in the demo shop, testing everything out, and I am pretty impressed with the work you've done! Of course I lack the experience of Stefanowitsch in this matter, but I ckecked out all the other shop solutions for PW and all of them are not suited for EU use. This is something I could work with and/or suggest to a client. In the past I had to refuse all requests for a shop... If you are short of testers? I am more than willing to help! Bernd 2
eutervogel Posted July 5 Author Posted July 5 A small update on PWGermanShop: I've just finished adding support for digital products and license management. Current features include: Selling physical and digital products together Automatic license key generation after successful payment License key delivery by email Customer license overview in the frontend ("My Account") Device activation tracking with configurable activation limits License validation API for your applications Backend tools for managing and revoking licenses I've also added a demo product so you can try the complete workflow yourself: https://demoshop.mholte.de/shop/focusframe-timer/ After completing a purchase, you'll receive a license key that actually unlocks the demo application, so it's not just a mock-up. Documentation for the licensing module: https://mholte.de/docs/PWGermanShop/#/betreiber/lizenzen?id=lizenzschlüssel-germanshoplicenses Please note: There is currently a bug when using the "Auf Rechnung" payment method. The license generation and email delivery are not triggered, so for testing please use another payment method (for example "Vorkasse" and click "Zahlung erhalten" in the orders overview, that will trigger the flow). Once you've finished testing, please delete your order. Otherwise, your order details, including your email address, may remain visible in the demo shop's backend until the next automatic reset (up to about 6 hours). I'd really appreciate any feedback, especially if you're planning to sell software, plugins, digital downloads, or other licensed products with PWGermanShop. 2 1
Peter Knight Posted July 5 Posted July 5 Great stuff. Just two questions before I get around to testing Can we configure the license key format or is it random? Are subsequent licenses aware of the previous keys to avoid collision
eutervogel Posted July 5 Author Posted July 5 Quote Can we configure the license key format, or is it random? Both — the payload is random, the prefix is configurable, and the overall structure is fixed: Format: PREFIX-XXXX-XXXX-XXXX-XXXX — a prefix plus a 16-character payload in dash-separated groups of four. Prefix: configurable per product via the gs_license_key_prefix field (2–16 uppercase letters/digits, no dashes). If left empty it falls back to the module default PGSHOP. Payload: 16 characters drawn from random_bytes() over a confusion-resistant alphabet (ABCDEFGHJKMNPQRSTVWXYZ2345 — no 0/O/I/1/L/U, so hand-typed keys don't get misread), with rejection sampling to avoid modulo bias. That's ~75 bits of entropy. The block layout, separator and alphabet are fixed in code, only the prefix is a per-product knob. If you need a genuinely different scheme, the generator sits behind a LicenseKeyGenerator interface (RandomBytesLicenseKeyGenerator is the default impl) — you can drop in your own without touching the issuance logic. Quote Are subsequent licenses aware of previous keys to avoid collisions? Yes, guaranteed at the database level, not by in-memory bookkeeping: gs_license_keys.license_key carries a UNIQUE index. Issuance inserts the key; if MySQL returns a duplicate-entry error, the service generates a fresh key and retries up to 5 times (LicenseIssuanceService::persistNewKey). This is deliberately a race-safe atomic insert + retry, not a check-then-insert (which would have a TOCTOU gap). At ~75 bits of entropy a real collision is astronomically unlikely, but the guard is there and correct even under concurrent checkouts. 3
eutervogel Posted July 10 Author Posted July 10 A bigger update on PWGermanShop — quite a lot has landed since the digital products & licensing post, so here's a round-up. 🔁 Subscriptions (brand-new module) Recurring products are now fully supported: Sell recurring products (physical or digital) alongside one-off items Legally required recurring-price disclosures (PAngV / §312j) at product and checkout Automated billing cycles via an idempotent, drift-free cron "My subscriptions" area in the customer account; cancellation per §312k Backend "Subscriptions" overview Runs on SEPA direct debit (deliberately no Stripe dependency) Licenses can be bound to a subscription — renewal keeps the same key (Model B) Try it (digital + license + annual subscription): https://demoshop.mholte.de/shop/pwgermanshop-jahresabo/ And a simple physical monthly box: https://demoshop.mholte.de/shop/gemuesekiste-abo/ Docs: https://mholte.de/docs/PWGermanShop/#/betreiber/abonnements 🏦 SEPA direct debit pain.008.001.08 XML (EPC-compliant), IBAN validation Pre-notification and dunning/retry handling for returned debits (R-transactions) Automatic invoice, admin detail view + XML export Docs: https://mholte.de/docs/PWGermanShop/#/betreiber/sepa 🏷️ Discounts, coupons & automatic cart rules Percentage and fixed-amount coupon codes Free-shipping vouchers Tax-correct allocation across mixed-VAT carts (down to the cent, so the invoice stays right) Limits (total / per customer), validity window, minimum order value New: automatic rules without a code — e.g. "free shipping from €69", applied on its own Try it: add items on the demo shop — free shipping kicks in automatically above €69 Docs: https://mholte.de/docs/PWGermanShop/#/betreiber/rabatte 🔖 Strike-through / RRP pricing (§11 PAngV) Offer price shown alongside the previous/RRP price, in line with the German price-indication rules 👤 Customer accounts: double opt-in Email confirmation on registration (7-day token, login gate, resend route) Docs: https://mholte.de/docs/PWGermanShop/#/betreiber/kundenkonto 🚚 Checkout & shipping Delivery countries are now derived from your configured shipping zones (no longer hard-coded to Germany) As always, I'd really appreciate any feedback. 2 3
howdytom Posted July 15 Posted July 15 @eutervogel Wow. Impressive work Frankly, this is exactly what I am looking for a looong time! I always tried to avoid the Shopware route. Your PWGermanShop module is a real option and great argument to consider using ProcessWire. I would love to use it on small site projects. Most small sites have great potential but can’t afford big Shopware or Shopify budgets. I gave the demo a try. I like that you considered physical and digital products with stock option. The overall buying experience and card option for guest users, existing customer or new customer is perfect. No fancy Javascript. Really smart and fast loading. Product variations are essential to me. It looks like currently a global image set is used for all variations. Is that correct? I guess it needs to customised to show image previews for different variations for color, material, graphics... With ProcessWire these personalised customisation should be straightforward. From the end user site, filtering option as additional Taxonomy option would be nice. By the way, your documentation is excellent and really well planned out! Again, fantastic work!
eutervogel Posted July 16 Author Posted July 16 Hi, thanks for your kind words and the great feedback! You're absolutely right — variant-specific images weren't implemented yet. The funny thing is that variants have actually been able to store their own image galleries the whole time; the frontend renderer simply never used them. It turned out to be a very small change, and it's working now. You can have a look here: https://demoshop.mholte.de/shop/ohrstecker-tropfen/ The current demo only has a single image assigned to each variant, but each variant can have its own gallery with multiple images. I'm also working on a taxonomy-based product filter. You can already see it in action here: https://demoshop.mholte.de/kategorien/schmuck/ At the moment, though, there simply aren't enough products in that category to properly evaluate it, so I wouldn't consider it finished yet. I still need to add more test data and do some further testing before I'm happy with it. 1
eutervogel Posted July 21 Author Posted July 21 (edited) Time for a proper round-up on PWGermanShop — a lot has landed since the subscriptions/SEPA/discounts update, so here's the full picture. ↩️ Returns & refunds (new module) The cancellation form was always there, but the withdrawal is only the declaration. What comes after — taking goods back, meeting the refund deadline, paying out, correcting the invoices — is now handled end-to-end. §357 BGB deadline tracking, done right. The 14-day refund clock starts when the withdrawal reaches you — but you may withhold payment while the goods are still out (§357 Abs. 4). So the shop separates "deadline elapsed" from actual default and only flags the latter in red. You don't get trained to ignore warnings. Partial returns — return 1 of 3 items, with the shop tracking what's already been sent back so you can't over-refund the same position twice. Refund calculated to the cent — outbound shipping refunded only on a full withdrawal and capped at your cheapest standard shipping (§357 Abs. 2), proportional discount allocation, value-loss deduction (Wertersatz, §357 Abs. 7), never a negative payout. Documents the German way — not a credit note. The original invoice is fully cancelled (negative amounts, own sequential number, §14 Abs. 6 UStG) and a fresh invoice is issued for what the customer keeps. The original stays untouched (GoBD). One-click refunds via PayPal & Stripe, partial amounts included, with idempotency so a double-click or timeout can't pay out twice — a hung attempt is safely resumed with the same key. Docs: https://mholte.de/docs/PWGermanShop/#/betreiber/retouren 🔍 SEO & structured data (new module + catalog standard) Small shops rarely rank on brand — rich results in Google are the most realistic visibility win, so this got its own module. schema.org/Product JSON-LD on every product page (built into the catalog standard) — price, VAT, availability derived from stock, and hasMerchantReturnPolicy reflecting your actual withdrawal terms, so Google can show the return window right in the results. Meta description auto-generated from the product/short description, HTML-cleaned and trimmed on a word boundary. Open Graph & Twitter Cards for proper preview cards when links are shared (product image as large card, og:type=product, site name pulled from your Stammdaten). Canonical + robots — cart, checkout, account and download pages set to noindex,follow automatically. BreadcrumbList & ItemList JSON-LD — breadcrumb path and category product lists as structured data, generated from the page tree; nothing to maintain by hand. /sitemap.xml served via a URL path hook. Docs: https://mholte.de/docs/PWGermanShop/#/betreiber/seo 📦 Stock management for simple products — incl. one-of-a-kind items Stock tracking used to exist only for variants. Now every product can carry stock, with three modes: Unlimited (default) — no tracking, always orderable (made-to-order, services, digital). Counted — quantity counts down on sale, sold out at 0. Unique ("Unikat") — perfect for makers: a single one-off piece that's gone after one sale, without fiddling with quantities. A low-stock hint appears on the product card ("only X left"), and availability flows into the Product JSON-LD, so a sold-out item is marked correctly for search engines too. Docs: https://mholte.de/docs/PWGermanShop/#/betreiber/produkte 🏠 Run the shop as your whole site You can now choose whether the shop is a section of your site (/shop/) or is the homepage — for sites that are nothing but a shop. Product URLs live under a fixed /produkt/ parent regardless, so switching the layout never moves a product URL. 🖼️ Follow-ups Variant-specific image galleries are live (each variant can carry its own gallery), and the taxonomy-based product filter is coming along as I add more test data. As always, feedback, suggestions and bug reports are very welcome. Please delete your test orders when you're done — your email stays visible in the backend until the next reset. Edited July 21 by eutervogel 4
eutervogel Posted July 21 Author Posted July 21 (edited) !!SOLVED!! Oh, I just broke the example product seeding on the demo shop. Variants are gone. I'm fixing this right now. Edited July 21 by eutervogel
eutervogel Posted Thursday at 04:54 PM Author Posted Thursday at 04:54 PM I'm currently giving the dashboard a proper overhaul. It should be live by tomorrow at the latest. If you think there are other things I should address, or if it seems like I'm losing track of something, please let me know. 1
howdytom Posted Thursday at 05:14 PM Posted Thursday at 05:14 PM @eutervogel Wow. You did massive progress! This looks like and sounds great. I will look into it. I hope that doesn't sound rude. Another use case would be a product calculator with custom configurator option. Example: Users can choose and select a material, size with additional custom fields and it automatically calculates the total costs. It could be used for print, flower, art, wood, stone, food products or of any kind projects.
eutervogel Posted Thursday at 05:54 PM Author Posted Thursday at 05:54 PM @howdytom Thanks, that does not sound rude at all, feature requests and real-world use cases are very welcome. Do I understand you correctly that you mean configurable products where customers can select options such as the material and enter custom values such as width and height, while the final price is calculated using a product-specific formula? For example, a wooden panel could be calculated from material, width, height, thickness and optional finishing, rather than using only predefined variants. PWGermanShop currently supports variants and variant-specific prices, but not arbitrary custom fields and pricing formulas yet. I can definitely see this as a useful separate configurator module. Could you give me one concrete example including the required fields and how the price should be calculated? That would help me understand the intended sco pe. 1
eutervogel Posted Friday at 09:44 AM Author Posted Friday at 09:44 AM I shouldn't answer requests while walking my dog an let AI correct my English. 🙈 I guess I know what you are looking for. Something like this? That would definitely be a nice feature to have. I will look into that shortly. 1
eutervogel Posted Friday at 09:48 AM Author Posted Friday at 09:48 AM (edited) PWGermanShop - small update: switchable themes, a real dashboard, and more 1. Multiple storefront themes, switched from the backend You can now install more than one storefront theme and switch between them from a single admin page (Shop → Design / Theme) — no re-install, no data loss, and your own template overrides stay untouched. Switching between themes that ship the same set of templates costs zero file operations; it's just a setting. The demo shop now carries two looks you can compare: the default example theme and a new premium "Atelier" theme (a warm, editorial manufaktur style). Same shop, same data, same compliance logic underneath - only the skin changes. That's by design: themes are purely visual, all pricing/checkout/legal logic lives in the modules, so a theme can never quietly break a price or a legal page. (Building your own theme is still just a set of template files — the developer docs walk through it.) 2. A proper shop dashboard The admin overview went from a link list to an actual dashboard: revenue over the last 30 days, orders, customers, average order value, a payment-method breakdown, order status, top products, and the latest orders — all from real data. The charts are hand-drawn inline SVG on the server. No chart library, no third-party script — same self-hosted rule as everything else. There are now 70+ orders in the demo seed, so the dashboard always has something to show, even after the 6-hour reset. (I'm planning to add a date range selector) 3. Light/dark toggle in the storefront The Atelier theme has a light/dark switch in the header; the choice is remembered locally (no cookie banner needed for it, it's a pure display preference). System setting is respected by default. 4. Smaller polish Order list now paginates (25/page) with search that works across all orders, not just the current page. Demo: https://demoshop.mholte.de have a click around. Feedback always welcome. Edited Friday at 09:50 AM by eutervogel 2 1
howdytom Posted Friday at 03:28 PM Posted Friday at 03:28 PM You are pushing things really forward. Impressive! And you are right. A product configurator for custom orders would be a great feature. Honestly, prebuilt products, product variations and a custom configuration us a killer feature that unlocks so many possibilities. The configurator should be neutral and include custom text fields, lists with radio buttons and checkboxes, Dropdown selection list. As a reference I have attached examples from Shopware. It's very extensive. Just ideas... 1
jacmaes Posted Friday at 08:55 PM Posted Friday at 08:55 PM This looks impressive. Any chance you’d consider expanding the market to outside of Germany, to other European countries? Asking for a friend 😉
eutervogel Posted Saturday at 12:04 PM Author Posted Saturday at 12:04 PM (edited) @jacmaes Thanks! Yes, I'm planning to build dedicated versions for the major EU countries. I can't really say yet when I'll actually start, but, I will deliberately start with Austria, since it's the closest country when it comes to rules and taxes. This will help me find the right internationalization strategy. After that, I'll get to other countries. Non-EU countries would also be nice to have, but that is more of a "maybe" right now. What country is your market in, Spain? Maybe I can focus on that right after Austria... Edited Saturday at 12:07 PM by eutervogel 1
jacmaes Posted Saturday at 10:24 PM Posted Saturday at 10:24 PM @eutervogel Yes, Spain and France. That would be wonderful. Thanks for taking it into consideration!
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now