{"id":379187,"date":"2026-10-10T07:57:18","date_gmt":"2026-10-10T07:57:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/facturamx-for-woocommerce\/"},"modified":"2026-10-10T07:57:03","modified_gmt":"2026-10-10T07:57:03","slug":"facturamx-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/su.wordpress.org\/plugins\/facturamx-for-woocommerce\/","author":20882796,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.1.0","stable_tag":"0.1.0","tested":"7.1.3","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"FacturaMX for WooCommerce","header_author":"FacturaMX","header_description":"Autofacturaci\u00f3n CFDI 4.0 para WooCommerce a trav\u00e9s de la API p\u00fablica de FacturaMX.","assets_banners_color":"58a6f4","last_updated":"2026-10-10 07:57:03","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/facturamx.top\/plugin-woocommerce","header_author_uri":"https:\/\/facturamx.top","rating":0,"author_block_rating":0,"active_installs":0,"downloads":56,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.0":{"tag":"0.1.0","author":"gameygv","date":"2026-10-10 07:57:03","revision":3737720}},"upgrade_notice":{"0.1.0":"<p>First release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3737720,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3737720,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3737720,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3737720,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3737720,"resolution":"1","location":"assets","locale":"","width":1280,"height":602},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3737720,"resolution":"2","location":"assets","locale":"","width":646,"height":987},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3737720,"resolution":"3","location":"assets","locale":"","width":1280,"height":401},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3737720,"resolution":"4","location":"assets","locale":"","width":280,"height":814},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3737720,"resolution":"5","location":"assets","locale":"","width":1078,"height":1257},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3737720,"resolution":"6","location":"assets","locale":"","width":780,"height":379}},"screenshots":{"1":"The public invoicing page: the customer enters the order number and the\namount paid.","2":"The tax data form, with the SAT catalogs already loaded.","3":"The issued CFDI, with its PDF and XML download links.","4":"The FacturaMX metabox on the order screen.","5":"The plugin settings, under WooCommerce.","6":"The FacturaMX tab on a product, where its SAT keys are set."}},"plugin_section":[],"plugin_tags":[139793,26218,126659,165612,286],"plugin_category":[45],"plugin_contributors":[285491],"plugin_business_model":[],"class_list":["post-379187","plugin","type-plugin","status-publish","hentry","plugin_tags-cfdi","plugin_tags-invoicing","plugin_tags-mexico","plugin_tags-sat","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-gameygv","plugin_committers-gameygv"],"banners":{"banner":"https:\/\/ps.w.org\/facturamx-for-woocommerce\/assets\/banner-772x250.png?rev=3737720","banner_2x":"https:\/\/ps.w.org\/facturamx-for-woocommerce\/assets\/banner-1544x500.png?rev=3737720","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/facturamx-for-woocommerce\/assets\/icon-128x128.png?rev=3737720","icon_2x":"https:\/\/ps.w.org\/facturamx-for-woocommerce\/assets\/icon-256x256.png?rev=3737720","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/facturamx-for-woocommerce\/assets\/screenshot-1.png?rev=3737720","caption":"The public invoicing page: the customer enters the order number and the\namount paid."},{"src":"https:\/\/ps.w.org\/facturamx-for-woocommerce\/assets\/screenshot-2.png?rev=3737720","caption":"The tax data form, with the SAT catalogs already loaded."},{"src":"https:\/\/ps.w.org\/facturamx-for-woocommerce\/assets\/screenshot-3.png?rev=3737720","caption":"The issued CFDI, with its PDF and XML download links."},{"src":"https:\/\/ps.w.org\/facturamx-for-woocommerce\/assets\/screenshot-4.png?rev=3737720","caption":"The FacturaMX metabox on the order screen."},{"src":"https:\/\/ps.w.org\/facturamx-for-woocommerce\/assets\/screenshot-5.png?rev=3737720","caption":"The plugin settings, under WooCommerce."},{"src":"https:\/\/ps.w.org\/facturamx-for-woocommerce\/assets\/screenshot-6.png?rev=3737720","caption":"The FacturaMX tab on a product, where its SAT keys are set."}],"raw_content":"<!--section=description-->\n<p>In Mexico, a customer who needs a tax receipt (CFDI) for an online purchase\nusually has to email the store, wait, and hope somebody types their tax details\ncorrectly. This plugin turns that into a page on your own site.<\/p>\n\n<p>The customer opens the invoicing page, types the order number and the exact\namount they paid, fills in their tax data, and receives a stamped CFDI 4.0. The\nstore owner does nothing.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li><strong>A public invoicing page.<\/strong> Add the <code>[facturamx_portal]<\/code> shortcode to any\npage. No customer account is required: the order number plus the exact amount\npaid is what proves the order is theirs.<\/li>\n<li><strong>An admin invoicing box.<\/strong> Every order gets a FacturaMX metabox so you can\nissue the CFDI yourself when a customer asks by phone or email, or send the\norder to FacturaMX as a draft quotation and turn it into an invoice from the\nFacturaMX panel.<\/li>\n<li><strong>The invoice reaches the customer by email.<\/strong> When the customer leaves an\nemail address, FacturaMX sends the CFDI with its PDF and XML attached.<\/li>\n<li><strong>Tax data is validated before anything is issued.<\/strong> RFC, postal code, tax\nregime and CFDI use are checked against the SAT catalogs first, so the\ncustomer fixes a typo in a form instead of finding out through a rejected\nstamp.<\/li>\n<li><strong>SAT keys per product.<\/strong> The store has a global product key, unit key and VAT\nrate; any product can override them from its own FacturaMX tab. A shipping\nline and a bag of coffee do not share a ClaveProdServ.<\/li>\n<li><strong>Totals must reconcile.<\/strong> If the sum of the invoice lines does not match what\nthe customer actually paid, the plugin refuses to issue and explains the\ndifference. A CFDI that disagrees with the payment is worse than no CFDI.<\/li>\n<li><strong>The PDF and the XML are served from your site.<\/strong> Download links go through\nyour own site, so your API token is never exposed to the browser.<\/li>\n<li><strong>Guided setup.<\/strong> Nothing is issued until the connection has been tested with\nthe current token and every product has its own SAT key. The settings screen\nlists what is missing, product by product, so the first CFDI is not a\nplaceholder.<\/li>\n<\/ul>\n\n<h4>What it does not do<\/h4>\n\n<ul>\n<li>It does not stamp anything by itself. Stamping is done by FacturaMX, an\nexternal service \u2014 see <em>External services<\/em> below.<\/li>\n<li>It does not replace your accountant, and it does not decide which products are\nVAT-exempt. You declare that.<\/li>\n<\/ul>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WooCommerce 8.0 or newer.<\/li>\n<li>PHP 8.0 or newer.<\/li>\n<li>An account at FacturaMX (https:\/\/facturamx.top) with a public API token, and\na valid SAT digital seal certificate (CSD) uploaded there.<\/li>\n<\/ul>\n\n<h4>Pricing<\/h4>\n\n<p>The plugin is free. Issuing a CFDI is done by FacturaMX and consumes one\n\"stamp\" (timbre) from your FacturaMX account: new accounts get 3 free stamps,\nvalid for 30 days, and further stamps are sold in packages at\nhttps:\/\/facturamx.top. The plugin never\nissues anything on its own: only when a customer or an administrator submits the\ninvoicing form.<\/p>\n\n<h4>En espa\u00f1ol<\/h4>\n\n<p><strong>FacturaMX for WooCommerce<\/strong> permite que tus clientes generen su propia factura\nelectr\u00f3nica (CFDI 4.0) desde tu tienda, sin escribirte y sin que t\u00fa entres al\nportal del SAT.<\/p>\n\n<ul>\n<li><strong>P\u00e1gina de facturaci\u00f3n<\/strong> con la etiqueta <code>[facturamx_portal]<\/code>: el cliente\nescribe su n\u00famero de pedido y el monto que pag\u00f3, llena sus datos fiscales y\ndescarga su factura en PDF y XML. Tambi\u00e9n le llega por correo.<\/li>\n<li><strong>Facturar desde el pedido<\/strong> en el administrador de WooCommerce, o mandarlo a\nFacturaMX como cotizaci\u00f3n para convertirlo en factura desde el panel.<\/li>\n<li><strong>Valida RFC, c\u00f3digo postal, r\u00e9gimen y uso del CFDI<\/strong> contra los cat\u00e1logos del\nSAT antes de timbrar.<\/li>\n<li><strong>Un pedido no se factura dos veces<\/strong>, aunque ya se haya facturado desde el\npanel de FacturaMX.<\/li>\n<li><strong>El CFDI cuadra con lo que pag\u00f3 el cliente<\/strong>; si no cuadra, no se emite.<\/li>\n<\/ul>\n\n<p>El plugin es gratuito. Para timbrar necesitas una cuenta en\n<a href=\"https:\/\/facturamx.top\">FacturaMX<\/a>, con tu CSD cargado: al registrarte recibes\n3 timbres gratis, v\u00e1lidos por 30 d\u00edas. Gu\u00eda de instalaci\u00f3n en espa\u00f1ol:\nhttps:\/\/facturamx.top\/plugin-woocommerce<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to FacturaMX (https:\/\/facturamx.top), a third-party CFDI\nstamping service, to issue the tax receipts (CFDI 4.0) your customers request.\nAn account and an API token are required; the plugin does nothing until you\nenter one in its settings.<\/p>\n\n<p>Data is sent in these situations, and only then:<\/p>\n\n<ol>\n<li>When the invoicing form loads the SAT catalogs it needs (tax regimes and\nCFDI uses), the plugin calls <code>GET \/api\/public\/catalogs<\/code>. No customer data is\nsent in this request.<\/li>\n<li>When a customer or an administrator submits the invoicing form, the plugin\ncalls <code>POST \/api\/public\/invoice<\/code> sending:\n\n<ul>\n<li>the customer's tax data: legal name, RFC (Mexican tax ID), tax regime,\npostal code and, if provided, email address;<\/li>\n<li>the CFDI use, the payment method and the payment form;<\/li>\n<li>the order's line items: description, quantity, unit price, VAT rate, the\nSAT product and unit keys, and the SKU when the product has one;<\/li>\n<li>the order identifier, as an external reference, so that two simultaneous\nsubmissions cannot produce two invoices for the same order.\nIf an email address is provided, FacturaMX uses it to email the invoice\n(PDF and XML) to the customer.<\/li>\n<\/ul><\/li>\n<li>When somebody downloads an already issued invoice, the plugin calls\n   GET \/api\/public\/invoice\/{id}\/{format} to fetch its PDF or XML. Only the\nidentifier of that invoice is sent.<\/li>\n<li>When a customer looks up an order on the invoicing page and the order has no\ninvoice in the store yet, the plugin calls\n   GET \/api\/public\/invoice?external_id={order} to check whether the store\nalready invoiced it from the FacturaMX panel. Only the order identifier is\nsent.<\/li>\n<li>When an administrator clicks \"Enviar a FacturaMX como cotizaci\u00f3n\" (send to\nFacturaMX as a quotation) on an order,\nthe plugin calls <code>POST \/api\/public\/quotation<\/code> with the same data as in point 2\n(as far as it has been filled in). Nothing is stamped.<\/li>\n<\/ol>\n\n<p>Nothing is sent when a visitor merely browses your store, and nothing is sent\nabout orders that nobody asks to invoice.<\/p>\n\n<p>Service provided by FacturaMX:<\/p>\n\n<ul>\n<li>Terms of service: https:\/\/facturamx.top\/terminos<\/li>\n<li>Privacy policy: https:\/\/facturamx.top\/privacidad<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin. WooCommerce must be active first.<\/li>\n<li>In your FacturaMX account, open <strong>Empresas \u2192 your company \u2192 API para\nfacturaci\u00f3n externa<\/strong> and generate a token. It starts with <code>fmx_live_<\/code> and is\nshown only once.<\/li>\n<li>Go to <strong>WooCommerce \u2192 FacturaMX<\/strong>, paste the token and save.<\/li>\n<li>Click <strong>Probar conexi\u00f3n<\/strong> (Test connection). The plugin will not issue any\nCFDI until the current URL and token have passed this test.<\/li>\n<li>Set the defaults for your store: SAT unit key, unit name, VAT rate, payment\nform and series. The invoicing window (30 days by default) controls for how\nlong after the purchase a customer may still self-invoice.<\/li>\n<li>Give every product its own SAT product key (ClaveProdServ) in its\n<strong>FacturaMX<\/strong> tab. The default <code>01010101<\/code> means \"not in the catalog\": the\nplugin refuses to issue a CFDI with it, and the settings screen lists the\nproducts that still need one.<\/li>\n<li>Create a page for your customers and add the <code>[facturamx_portal]<\/code> shortcode\nto it. Link that page from your footer or your order emails.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20my%20customers%20need%20an%20account%20on%20my%20site%3F\"><h3>Do my customers need an account on my site?<\/h3><\/dt>\n<dd><p>No. The invoicing page asks for the order number and the exact amount paid.\nOnly somebody holding the receipt knows both.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20a%20customer%20types%20the%20wrong%20amount%3F\"><h3>What happens if a customer types the wrong amount?<\/h3><\/dt>\n<dd><p>The page answers exactly as it would for an order that does not exist. That is\ndeliberate: otherwise the form would tell a stranger which order numbers are\nreal.<\/p><\/dd>\n<dt id=\"can%20the%20same%20order%20be%20invoiced%20twice%3F\"><h3>Can the same order be invoiced twice?<\/h3><\/dt>\n<dd><p>No. Once an order has a CFDI, the plugin shows the existing one instead of\nissuing another. This also covers invoices issued outside the plugin: if the\norder was invoiced from the FacturaMX panel (for example, from a quotation), the\ninvoicing page finds that invoice and offers it for download.<\/p><\/dd>\n<dt id=\"which%20orders%20can%20be%20invoiced%3F\"><h3>Which orders can be invoiced?<\/h3><\/dt>\n<dd><p>Paid orders, in MXN, not refunded, and still inside the invoicing window you\nconfigured. The SAT expects the CFDI to be issued within the same month as the\npurchase, so windows longer than 30 days are rarely useful.<\/p><\/dd>\n<dt id=\"my%20store%20does%20not%20charge%20vat.%20can%20i%20still%20issue%20cfdis%3F\"><h3>My store does not charge VAT. Can I still issue CFDIs?<\/h3><\/dt>\n<dd><p>Yes. Mexican law considers advertised prices to already include VAT, so when\nWooCommerce did not calculate tax on a line, the plugin extracts the configured\nrate from the price instead of adding it on top. If a product is legally exempt,\nset its VAT rate to 0 in its FacturaMX tab \u2014 that is a declaration, not a\ndefault.<\/p><\/dd>\n<dt id=\"the%20plugin%20refuses%20to%20issue%20a%20cfdi.%20why%3F\"><h3>The plugin refuses to issue a CFDI. Why?<\/h3><\/dt>\n<dd><p>Look at <strong>WooCommerce \u2192 FacturaMX \u2192 Antes del primer timbre<\/strong>. Either the\nconnection has not been tested with the current token (click <strong>Probar\nconexi\u00f3n<\/strong> again after changing it), or some product in the order still has the\nplaceholder key <code>01010101<\/code>. When a customer is blocked for this reason they see\na polite message, and the order gets a note explaining exactly what is missing.<\/p><\/dd>\n<dt id=\"is%20the%20plugin%20free%3F\"><h3>Is the plugin free?<\/h3><\/dt>\n<dd><p>Yes. Each issued CFDI consumes one stamp from your FacturaMX account; see\n<em>Pricing<\/em> above.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20hpos%20%28high-performance%20order%20storage%29%3F\"><h3>Does it work with HPOS (High-Performance Order Storage)?<\/h3><\/dt>\n<dd><p>Yes. The plugin declares compatibility with custom order tables and uses the\nWooCommerce CRUD API throughout.<\/p><\/dd>\n<dt id=\"in%20which%20language%20is%20the%20interface%3F\"><h3>In which language is the interface?<\/h3><\/dt>\n<dd><p>Spanish. The people who issue CFDIs invoice in Mexico. A POT file ships with the\nplugin so it can be translated.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<li>Public self-service invoicing page via the <code>[facturamx_portal]<\/code> shortcode.<\/li>\n<li>Invoicing metabox on the order screen.<\/li>\n<li>SAT product key, unit key, unit name and VAT rate, globally and per product.<\/li>\n<li>CFDI 4.0 issuing through the FacturaMX public API, with PDF and XML downloads\nproxied through the site.<\/li>\n<li>Guided setup: no CFDI is issued until the connection is tested with the\ncurrent token and every product has its own SAT key.<\/li>\n<li>\"Enviar a FacturaMX como cotizaci\u00f3n\" (send as a quotation) button on the order\nscreen.<\/li>\n<li>Orders invoiced from the FacturaMX panel are detected and offered for download.<\/li>\n<li>Store-domain email addresses (e.g. created by a chat bot) are not suggested as\nthe customer's email.<\/li>\n<\/ul>","raw_excerpt":"Self-service CFDI 4.0 invoicing for Mexican WooCommerce stores. Customers invoice their own orders; you never touch the SAT portal.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/su.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/379187","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/su.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/su.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/su.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=379187"}],"author":[{"embeddable":true,"href":"https:\/\/su.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/gameygv"}],"wp:attachment":[{"href":"https:\/\/su.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=379187"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/su.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=379187"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/su.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=379187"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/su.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=379187"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/su.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=379187"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/su.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=379187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}