EP Ecommerce — POD
EP Ecommerce — POD is the print-on-demand engine for EP Ecommerce. It lets you sell physical products from your PageMotor site: apparel, mugs, prints, and so on. You design the products at a print-on-demand provider, sync them into PageMotor, and they sell as normal products with their own pages. When a customer pays, the order is routed to the provider for printing and shipping, and tracking is returned to the customer automatically.
The engine is provider-agnostic. It does not talk to any one print house directly; a small connector plugin supplies the account credentials and the API mapping for a given provider. EP Ecommerce — Printify is the first connector. Others can follow without changing the engine.
Published by ElmsPark Studio.
The print-on-demand family
Section titled “The print-on-demand family”| Plugin | Role | Required? |
|---|---|---|
| EP Ecommerce | Base. Products, orders, fulfilment hooks. | Yes (0.1.22+) |
| EP Ecommerce — POD | This engine. Sync, storefront, checkout, routing, tracking. | Yes |
| EP Ecommerce — Printify | Printify connector (API token + Store ID). | One connector required |
| EP Ecommerce — Stripe | Card payment. | Yes |
This page covers the engine. The connector is documented separately.
How it works
Section titled “How it works”- Design at your provider. Build your products in your print-on-demand account as usual (for example, in Printify).
- Sync. In PageMotor, click Sync products. Each provider product is pulled in (enabled variants, retail price, mockup image) and becomes an EP Ecommerce product with its own checkout page.
- Customer buys. On the product page the customer picks a variant (size / colour), enters their delivery address, and sees a live shipping quote. They pay by card through EP Ecommerce — Stripe; the chosen delivery cost is added to the total. If the provider’s quote is slow or unavailable, the engine falls back to your configured flat rate so checkout never stalls.
- Order is routed. The paid order is created at the provider as an on-hold order (no charge), carrying the variant and the full delivery address.
- Fulfilment. You review and send the order to production from the provider’s dashboard (or switch on auto-send). Tracking comes back automatically, and the customer is emailed their tracking link.
Requirements
Section titled “Requirements”- PageMotor 0.7 or later
- EP Ecommerce 0.1.22 or later — adds the generic
podproduct type the engine uses. Older versions will reject the synced products. - A connector — currently EP Ecommerce — Printify. Without a connector the engine has no provider to talk to.
- EP Ecommerce — Stripe — for taking card payment.
- An external cron service (such as cron-job.org) to call the background-sync URL shown in settings. PageMotor has no scheduler of its own; the cron is what drives retries and tracking updates.
Installation
Section titled “Installation”Install in this order, activating each before the next:
- EP Ecommerce (0.1.22+).
- EP Ecommerce — POD (this engine).
- Your connector — EP Ecommerce — Printify.
- EP Ecommerce — Stripe.
Database tables are created automatically on first load.
- Connect your provider first. For Printify, open EP Ecommerce — Printify, paste your token, run Test Connection, and Save. (See the connector page.)
- Open Plugin Settings → EP Ecommerce — POD.
- Under Print-on-Demand, tick Enable print-on-demand.
- Under Products, click Sync products. Your products are imported and a checkout page is created for each one. Re-sync any time to pick up price, image, or availability changes.
- Set your Delivery pricing fallback and your Fulfilment preference (below), and copy the background-sync URL into your external cron.
Settings
Section titled “Settings”| Setting | Section | What it does |
|---|---|---|
| Enable print-on-demand | Print-on-Demand | Master switch. Orders only route to the provider when this is on and a connector is connected. |
| Sync products | Products | Imports the connected provider’s catalogue and creates a checkout page per product. |
| Flat-rate fallback | Delivery pricing | If on, and the live shipping quote is slow or unavailable, checkout uses your flat rate so it never stalls. |
| Flat rate | Delivery pricing | The fallback delivery cost in major units (for example, 4.99). |
| Flat-rate label | Delivery pricing | The customer-facing name for the fallback method (defaults to “Standard delivery”). |
| Auto-send paid orders to production | Fulfilment | Off by default. When on, paid orders are sent to production automatically (this charges your provider balance). When off, orders are held for your review. |
Fulfilment: on-hold vs auto-send
Section titled “Fulfilment: on-hold vs auto-send”Every paid order is first created at the provider as on hold, which does not charge you. From there:
- Hold for review (default). Orders wait in your provider dashboard. You open each one and click Send to production when you are ready. Nothing is charged or printed until you do.
- Auto-send to production. Tick Auto-send paid orders to production under Fulfilment to have orders sent automatically once payment clears. This charges your provider balance and prints the item, so only switch it on when you are confident in your setup.
Background sync (retries and tracking)
Section titled “Background sync (retries and tracking)”PageMotor has no built-in scheduler, so the engine exposes a secret URL on its settings page of the form:
https://your-site.example/?ep_pod_cron=<secret>Point a free cron service (cron-job.org, or your server’s crontab) at this URL every 5 to 10 minutes. It:
- retries any order submissions to the provider that failed (with backoff), and
- polls the provider for order status and tracking, updating the order and emailing the customer their tracking link when the parcel ships.
Keep the URL private. Anyone with it can trigger background processing, though it cannot read or change your data.
Shortcode
Section titled “Shortcode”| Shortcode | Purpose |
|---|---|
[ep-checkout product=my-product-slug] | The print-on-demand checkout for a synced product. A page with this shortcode is created automatically for each product on sync. |
Database tables
Section titled “Database tables”{prefix}ep_pod_product_map— synced provider products (variants, price, mockup, links to the EP product + page).{prefix}ep_pod_order_map— one row per order routed to the provider (provider order id, status, tracking, retry state).
No change is made to the core EP Ecommerce orders table; the variant and delivery address for an order are stored in the order’s metadata.
Troubleshooting
Section titled “Troubleshooting””Data truncated for column ‘type’” when I sync
Section titled “”Data truncated for column ‘type’” when I sync”Your EP Ecommerce is older than 0.1.22. Update EP Ecommerce to 0.1.22 or later, which adds the generic pod product type, then sync again.
Nothing syncs
Section titled “Nothing syncs”Check that a connector is installed and connected. For Printify, open EP Ecommerce — Printify and confirm Test Connection succeeds. Then, on this engine’s page, make sure Enable print-on-demand is ticked before clicking Sync products.
Orders are paid but nothing reaches the provider
Section titled “Orders are paid but nothing reaches the provider”Make sure Enable print-on-demand is ticked and that the connector’s Test Connection succeeds. Orders only route when the engine is enabled and a connector is connected.
Checkout hangs on the shipping step
Section titled “Checkout hangs on the shipping step”The live shipping quote depends on the provider’s API. Turn on Flat-rate fallback under Delivery pricing and set a flat rate; the engine then uses it whenever the live quote is slow or unavailable, so checkout never stalls.
Tracking never updates / “your order has shipped” email never arrives
Section titled “Tracking never updates / “your order has shipped” email never arrives”Tracking is pulled in by the background-sync cron. Make sure an external cron is calling the ?ep_pod_cron= URL from the settings page every few minutes. Without it, statuses and tracking will not update on their own.
Feedback and corrections
Section titled “Feedback and corrections”For a quick question about this plugin, EP Support inside your admin is the fastest option. The chat widget sits on every EP plugin settings page and knows which one you’re on, with starter questions and links preloaded for that exact screen.
For anything bigger — a bug report, a feature request, or a “how do I…” that needs a real reply — open a ticket at help.elmspark.com. A real person, helped by AI, writes the reply. Usually within a few hours. Tickets don’t disappear into the void.
Changelog
Section titled “Changelog”1.3.19
Section titled “1.3.19”- Needs PageMotor 0.11.5 or later.
- EP GDPR now covers print-on-demand orders. A data export includes the person’s print jobs with their tracking and delivery address.
- Erasing a person still lets a paid print go out. A print the provider has not yet accepted keeps its delivery address so it can still be sent, for up to 30 days; the erasure result tells you how many, to run again once they have shipped. Every other print job keeps its order number, carrier and dates and loses the address and tracking.
- The erasure also counts orders held by your print provider, which keeps its own copy of the address that this site cannot remove.
- The error log no longer records a customer’s email address when a shipped email fails.
1.3.18
Section titled “1.3.18”- “Your order has shipped” emails now use EP Email’s sending method. These are sent by the background order check, and went through your server’s built-in mail instead of the sending method set in EP Email. A shipped email that failed that way was never retried. It now goes out through EP Email, using the sending method you set there (Mailgun, Brevo, SMTP and so on), and shows in EP Email’s delivery log.
1.3.17
Section titled “1.3.17”- Settings language menu. The language menu in this plugin’s settings now lists only the languages it is actually translated into, plus English, so you can no longer pick a language that changes nothing.
1.3.16
Section titled “1.3.16”- Fixed: some customers could not pay for a print-on-demand product. On sites where EP Ecommerce happened to load after EP Ecommerce Stripe, the checkout could not find Stripe’s secret key, and the customer was told “Card payment is not available right now”. It now finds Stripe however your site loads its plugins.
- Works best with EP Ecommerce Stripe 0.1.32 (either order is safe to update in).
1.3.15
Section titled “1.3.15”- Delivery is always charged in your shop’s currency. A print provider could quote delivery in US dollars while your products are priced in, say, euros, and the number was charged as if it were euros. The engine now asks the provider for your shop’s currency, and if a provider still answers in another currency, that rate is not offered: the customer gets your flat-rate delivery instead, if you have it switched on.
- Clearer messages when delivery cannot be priced. Customers used to see technical text from the print provider, such as “Could not get delivery options: No valid line items” or “provider quoted delivery in USD, not EUR”. They now see plain wording: if the provider will not price delivery in your shop’s currency, they are asked to contact you so you can complete the order; for anything else, to check their address and try again. The technical reason is written to your site’s error log instead, so you can see what went wrong.
- Fixes card checkout for print-on-demand products. Since EP Ecommerce Stripe began storing its secret keys encrypted, every print-on-demand checkout stopped at “Card payment is not available right now”. The engine now asks EP Ecommerce Stripe for the key instead of reading the stored settings directly.
- Fixes background processing finding no provider. The background URL (retries, tracking, auto-send) and orders confirmed by Stripe’s webhook could run before your provider plugin had loaded, so they reported “no provider connected” and did nothing. The engine now loads its provider plugins itself on those paths. A paid order confirmed by Stripe’s webhook is no longer silently left unsent.
- Only paid orders are sent to your print provider. Retrying or sending an order that is unpaid, failed or refunded is now refused, so you are never charged by the provider for an order your customer did not pay for.
- Prodigi: tracking no longer stops after 20 completed orders. Completed Prodigi orders were never treated as finished, and once 20 had built up the background check never reached newer orders, so their tracking emails stopped.
1.3.14
Section titled “1.3.14”- Corrects the PageMotor 0.11.3 preparation shipped in 1.3.13. That release grouped this plugin’s API and MCP actions into families, but in a shape PageMotor 0.11.3 does not accept. On 0.11.3 the plugin would have registered none of its actions, and nothing on screen would have said so.
- This version uses the shape 0.11.3 expects, and keeps the earlier shape for sites still on an older PageMotor. One build serves both, so there is no order you have to update things in.
- Safe to install now. Nothing you can see changes.