설명
IT-Services Mertineit – Shop Connector for Papierkram connects WooCommerce with Papierkram and allows you to manually create draft invoices directly from WooCommerce orders.
The plugin deliberately keeps Papierkram as the leading system for invoice numbers, document status and invoice history while eliminating repetitive manual data entry.
Features
- Manual creation of draft invoices directly from WooCommerce orders
- Customers are found by email address and reused or automatically created if they do not already exist
- Product line items with original quantity, unit price and product number
- Coupons are transferred as separate negative line items
- Shipping costs are transferred as a separate line item
- Small-business mode according to German Section 19 UStG (0% VAT)
- Invoice number and document status synchronization
- Shipping status and optional tracking number management in WooCommerce
- Duplicate protection
- Order notes, including a record of the previous address whenever a matched customer’s billing address changes
- Persistent connection and system status overview on the settings page
- WooCommerce logging
- Connection test
Workflow
Create the draft invoice manually from the WooCommerce order Review and finalize the invoice in Papierkram Update the invoice number and status in WooCommerce.
Requirements
- WordPress
- WooCommerce
- Papierkram account (Plan M or L)
- API access enabled
- Papierkram API token
Product numbers are mandatory
Every product and every product variation requires its own product number.
For variable products, only the variation’s product number is used.
If at least one order item has no product number, the transfer is aborted. No customer and no invoice are created. An order note and a WooCommerce log entry explain the problem.
Professional Edition
The Community Edition intentionally focuses on manual invoice creation.
Automatic synchronization, PDF download, PDF email attachments and additional automation features are available separately in the Professional Edition.
This plugin is an independent integration and is not affiliated with or endorsed by WooCommerce, Automattic Inc., Papierkram or odacer finanzsoftware GmbH.
External services
This plugin communicates directly with the Papierkram API (papierkram.de), operated by odacer finanzsoftware GmbH, Konrad-Adenauer-Ring 13, 65187 Wiesbaden, Germany.
When you manually transfer an order or perform a connection test, your web server sends requests directly to your own Papierkram account.
Depending on the order, the following information may be transferred:
- Customer name
- Company name
- Billing address
- Email address
- Phone number (if available)
- Order number
- Product names
- Product numbers
- Quantities
- Prices
- Coupons
- Shipping costs
- Tax information
The communication takes place server-to-server.
No customer data is transmitted from the visitor’s browser.
No data is sent to any third-party service other than Papierkram.
Papierkram Terms of Service:
https://www.papierkram.de/agb
Papierkram Privacy Policy:
https://www.papierkram.de/datenschutz
설치
- Upload the plugin via Plugins Add New Upload Plugin.
- Activate the plugin.
- Open WooCommerce Papierkram.
- Enter your Papierkram subdomain and API token.
- Click Test connection.
- Configure your payment term ID.
- Create your first draft invoice from the WooCommerce order actions.
FAQ
-
Does the plugin create final invoices?
-
No.
The plugin creates draft invoices only.
The invoice is reviewed and finalized inside Papierkram.
-
Are invoices created automatically?
-
No.
The Community Edition creates invoices manually.
Automatic synchronization is available in the Professional Edition.
-
Does the plugin transfer PDF invoices?
-
No.
PDF transfer is part of the Professional Edition.
-
Does the plugin support variable products?
-
Yes.
Each variation requires its own product number.
-
What happens if a product has no product number?
-
The transfer is aborted.
No customer and no invoice are created.
-
Is customer data stored on external servers?
-
Yes, when an authorized order editor manually transfers an order, the customer and invoice data listed in the External services section is sent to and processed in the configured Papierkram account.
The plugin communicates directly between your WordPress installation and the Papierkram API and does not use an additional connector cloud service.
Review your Papierkram data-processing terms and privacy configuration before using the integration with personal data.
-
Is the plugin GDPR compliant?
-
The plugin is designed to transfer data only after an authorized order editor manually starts the invoice workflow and does not send data to unrelated third parties.
Whether a specific installation complies with the GDPR depends on the shop owner’s legal basis, privacy notice, data-processing agreement with Papierkram, retention settings and other configuration. Obtain legal advice where required.
-
Are shipping status and tracking numbers transferred?
-
No.
The currently supported Papierkram API does not provide documented fields for shipping status, carrier or tracking number.
This information remains inside WooCommerce.
-
What is written to the WooCommerce log?
-
The plugin writes technical diagnostics (order IDs, Papierkram record IDs, error codes and redacted error messages) to the WooCommerce log source itsmpc-papierkram-connector.
API tokens, authorization headers and personal customer data such as names, addresses and email addresses are not written to the log.
-
What happens when the plugin is deleted?
-
Deleting the plugin removes its configuration including the encrypted API token, the migration marker and its temporary locks and notices.
Order and user metadata that links WooCommerce orders to already created Papierkram invoices is intentionally kept, so the document references survive a reinstall. Remove that metadata manually if you want a complete cleanup.
후기
이 플러그인에 대한 평가가 없습니다.
기여자 & 개발자
“IT-Services Mertineit – Shop Connector for Papierkram”(은)는 오픈 소스 소프트웨어입니다. 다음의 사람들이 이 플러그인에 기여하였습니다.
기여자변경이력
1.0.13
- Removed non-essential comments from the production PHP, JavaScript and CSS files; no functional behavior was changed by this cleanup.
- Streamlined the public documentation and changelog to keep them focused on user-facing release information.
- Corrected the documented WooCommerce log source to
itsmpc-papierkram-connector. - Improved consistency between the public README, changelog and WordPress.org readme and corrected the published release history.
1.0.12
- Improved Papierkram contact handling: when a matched contact’s billing address has changed, the previous address is now archived with a date in the contact’s Papierkram notes field before the new address is saved, so existing customer data is never silently lost. An order note documents the update; an uncertain contact match (no longer confirmed) is now also recorded as an order note before falling back to search or creation.
- Batched the one-time legacy
mpc_-prefix migration for orders and users instead of loading them without limit, removing a documented scaling risk for stores with a large historical order or user base; behavior remains fully idempotent. - Distinguished “product deleted” from “SKU missing” when an order cannot be transferred: a deleted product no longer suggests adding a SKU that cannot be added. The order meta box now shows a proactive hint with a direct product-edit link for affected items before an authorized order editor attempts the transfer.
- Added a persistent connection/system status section to the settings page: result and time of the last manual connection test, time of the last successful invoice transfer, and the active order storage mode (HPOS or Classic). No additional API calls are made on page load; a failed test never overwrites the last successful transfer time.
- Made the settings-page product cards adopt the native WordPress admin card/description styling instead of fixed colors, so they blend into any admin color scheme.
- Added an optional, dismissible notice pointing to the Pro edition on the plugin’s own and on relevant WooCommerce pages only. It is visible immediately, stays hidden for 7 days after being dismissed once, for 14 days after being dismissed a second time, and disappears permanently after being dismissed a third time (tracked per WordPress user, no tracking or external requests).
1.0.10
- Added information about Shop Connector for Papierkram Pro and Product Sync for Papierkram to the plugin settings, shown directly after the introductory text, before the settings fields.
1.0.8
- Unified GPL-2.0-or-later license identification across the plugin header, readme.txt and README.md.
- Added the complete, unmodified GNU General Public License v2 text as LICENSE in the plugin root.
- Added copyright attribution for IT-Services Manuel Mertineit.
- No functional changes.
1.0.7
- Verify every field of the independent recovery record (order ID, attempt ID, status, remote ID, timestamp) strictly by type and canonical value when reading it back; tampered stored values such as “123abc” are no longer accepted via a lossy integer cast.
- Treat a failed removal of the recovery record as a controlled persistence error in every code path: the normal invoice-success path and the “invoice meanwhile saved” discard branch no longer report success or write a success note when the protection state could not be verifiably removed; retries stay blocked and no duplicate invoice is possible.
- Reject API follow-up URLs (e.g. PDF download links) that contain a bare “#” fragment separator even when no fragment content follows it.
1.0.6
- Make the manual “discard unclear status” action verify that the independent recovery record was actually removed before reporting success; an undeletable record now returns a clear persistence error and keeps the retry blocked instead of falsely announcing that the transfer can be restarted.
- Restrict the required-recipient-fields filter so all four mandatory fields (street, ZIP, city and country) must remain present; invalid values or filter exceptions fall back to the safe defaults instead of weakening validation or crashing the order action.
- Validate the recipient country strictly as a two-letter ISO code checked against the real WooCommerce country list; country names (e.g. “Germany”) and non-string values (arrays, objects, booleans, numbers) are rejected instead of being silently normalized or causing a PHP warning/error.
- Reject Papierkram contact IDs above PHP’s maximum integer instead of silently truncating them to that maximum and using the truncated value.
- Reject percent-encoded, double-encoded, backslash and control-character variants of a URL fragment in API follow-up links (e.g. PDF downloads), not only an unencoded “#fragment”.
- Shorten the 1.0.5 upgrade notice to meet the WordPress.org length limit.
1.0.5
- Verify every independent recovery write against the freshly read database state and treat any unresolved write, corrupt record or unknown status as unresolved; a failed or unproven recovery confirmation after a successful remote invoice now blocks the retry instead of allowing a second draft invoice.
- Remove the last silent fallbacks to a possibly stale order object in the duplicate-invoice safeguards (pre-transfer blocking check, post-transfer invoice-ID proof, manual “discard unclear status” action); a failed fresh reload now aborts the action instead of proceeding on outdated data.
- Stop storing customer name and email address in the order note when a Papierkram contact search finds an email match that belongs to a different person; only the local order number, an internal error code and the validated technical contact ID are recorded.
- Fall back to the fixed default required-recipient-fields when the
itsmpc_required_recipient_fieldsfilter returns an invalid value, instead of silently accepting an empty required-field list; validate the recipient country code against the real WooCommerce country list instead of only its two-letter format. - Require every Papierkram contact ID to be a strictly validated positive integer before it can be reused, matched or sent in an invoice request.
- Reject URL fragments on absolute same-origin follow-up URLs (PDF download links) for consistency with the existing follow-up URL policy.
- Treat a lock that expires in the exact current second as immediately reusable instead of waiting one additional second.
1.0.4
- Restrict all outgoing API and PDF targets to official Papierkram hosts over HTTPS; reject loopback, link-local, private and reserved addresses, embedded credentials, URL fragments and non-standard ports, and never pass the API token across hosts or redirects.
- Take over expired locks with a single atomic compare-and-swap operation and recover from corrupt lock values, so high concurrency can never create a second invoice or customer.
- Require the manual “discard unclear status” action to hold the same per-order lock, prove the pending marker from fresh database state before any remote write, and keep an independent recovery record that blocks blind retries until an authorized order editor resolves it.
- Reduce error logging to a fixed allowlist without remote error text or personal data.
- Reject empty or unknown order currencies and incomplete billing recipient data before any API call.
- Collect all exact email matches and abort on ambiguity instead of using the first match.
- Restrict connector configuration (API URL, token, connection test) to administrators (manage_options).
- Known limitation: the one-time legacy data migration still loads order IDs without batching (documented scaling risk for very large stores).
1.0.3
- Replace the invoice-creation lock with an atomic per-order lock (owner token, expiry, no foreign release); a reproducible two-process race that created duplicate invoices and customers is now prevented.
- Treat truncated or contradictory customer searches as failed instead of “customer not found”, so no duplicate customer can be created after an incomplete search.
- Record a transfer marker before every invoice POST; unclear outcomes (timeouts, server errors, missing invoice ID, failed local save after remote creation) block blind retries until an authorized order editor explicitly discards the state via a new order action.
- Preserve the remote invoice ID in an order note and the log when local saving fails after the invoice was created in Papierkram.
- Reject orders in non-EUR currencies before any API call instead of transferring foreign amounts as Euro values.
- Transfer the real VAT rate for negative fee lines and encode query parameters exactly once.
- Remove personal customer data from diagnostic logs (IDs and field names only).
- Add uninstall.php: configuration, token, locks and notices are removed on deletion; invoice reference metadata is intentionally kept and documented.
1.0.2
- Show redirect-safe success and error notices after manual invoice actions in Classic and HPOS order screens.
- Scope notices to the initiating user and affected order, consume them after display and expire stale notices.
- Prevent queued notices from overwriting each other and prevent duplicate error order notes.
- Return actionable, safely escaped messages for validation, configuration, customer, invoice and refresh failures.
- Redact tokens, authorization data and untrusted API HTML from user-facing messages and diagnostic logs.
- Reject malformed or unexpected Papierkram responses before continuing a write workflow.
- Harden the settings connection test against invalid nonce, missing capability and malformed API responses.
1.0.1
- Prevent customer creation when the Papierkram customer lookup fails.
- Verify updated country values using normalized ISO country codes.
- Render API-provided payment-term names without injecting HTML.
- Report payment-term lookup failures during the connection test.
- Correct query-parameter encoding and WordPress.org tag count.
1.0.0
- First public release.
- Manual transfer of WooCommerce orders as draft invoices.
- Customer lookup and automatic customer creation.
- Product, coupon and shipping line item support.
- Duplicate protection.
- Invoice number and status synchronization.
- WooCommerce logging.
- Connection test.
- Support for German Section 19 UStG.

