Printful is a press, not a catalog dump

Field notes from satiresmart.com · 19 August 2026

Printful prints a garment after someone orders it. WooCommerce is the shop window on satiresmart.com. The plugin between them is a connector, not an importer. Most of the pain in this migration came from treating it as the second thing.

These notes are from moving SatireSmart off Hostinger Website Builder onto WordPress + WooCommerce, connecting Printful to that Woo store, changing the live domain, and then testing what actually syncs. They are dated. Printful’s API and dashboard will change. Correct them in public: github.com/elandrydenhall/printful-woocommerce.

If you are an agent following this as a skill, the operator rules live in SKILL.md. This page is the why. If you arrived from a search box or an AI answer, start at Questions people type.

Contents

  1. Questions people type
  2. Who this is for
  3. The one sentence
  4. Two Printful store types
  5. What SatireSmart actually connected
  6. What syncs
  7. What does not sync
  8. The two tests
  9. Hostinger Builder is not WordPress
  10. Do not Remove the store
  11. Rebuild the catalog on the Woo store
  12. Theme is a separate repo
  13. Checklist
  14. Glossary
  15. Fixes

Questions people type

Search already looks like a question. The AI sitting in front of Google, Brave, Firefox, and Edge answers that question in a paragraph, then cites a page. These are the questions we would actually type. The first sentence is the whole answer. Links go deeper into these notes, or out to the vendor’s own pages.

Tested here means SatireSmart ran it on the live Woo store. Printful’s docs means their public documentation, not our lab. Not tested means we did not do that step and will not pretend.

What is the connector

Does Printful import my WooCommerce catalog?

No. Printful does not import a Woo catalog; it pushes listings it created into Woo.

On SatireSmart, products that started in Woo never appeared in Printful. Tested here.

What does the Printful WooCommerce plugin actually do?

It connects a live Woo shop to a Printful store: OAuth, then Printful can write products into Woo and pull orders for fulfillment.

It is not a bulk catalog importer. The plugin we used is printful-shipping-for-woocommerce. Printful’s docs. SatireSmart used 2.2.12.

Is Printful my store, or is WooCommerce my store?

WooCommerce is the shop window customers see. Printful is the press that prints after they order.

Create the listing where the press lives. The public example is satiresmart.com.

Can I sell Printful products on WooCommerce?

Yes. That is the official Woo-connected store type: you add products in Printful, they show in Woo, orders can go back to Printful to print.

Connecting the plugin does not, by itself, put products on the catalog. Printful’s docs. SatireSmart’s catalog is empty until we create listings in Printful.

Why is my Woo catalog empty after I connected Printful?

Because Connect is a relationship, not a catalog copy.

Printful will not pull in Woo products you already had, and it will not clone another Printful store. You still have to create listings in Printful on this store. Tested here.

Where do products get created

Should I create products in Printful or in WooCommerce?

Create them in Printful.

On a Woo-connected store, Printful writes the Woo product. The other direction did not work on SatireSmart. Tested here.

If I create a product in Woo, will Printful pick it up?

No. Woo-created products do not attach to Printful on a Woo-connected store.

We created a throwaway Woo product with a real Printful dump SKU. Printful’s sync count did not move. The UI never showed it. Tested here.

Do Printful and Woo SKUs have to match?

No. Matching SKUs is not how this connector joins listings.

Printful issues SKUs when it creates variants. An old export’s SKUs look similar and are not a foreign key. Tested here.

Can I upload an old Printful JSON dump into Woo and have Printful attach it?

No. A dump is a souvenir of another store’s SKUs, not a join key for this Woo store.

That was Test A on SatireSmart. Tested here.

Can I copy a catalog from one Printful store to another?

No. Printful has no store-to-store catalog copy.

Template duplication in their dashboard is batch-limited. Rebuild from Studio onto the Woo store you will keep. Printful’s docs, plus SatireSmart’s dashboard use.

Why can’t I create products with the Printful Products API on a Woo store?

Because that API is not for WooCommerce or Shopify stores.

Printful’s own docs say the Products API is not intended and will never support creating products on those platforms. Use the dashboard (or the Ecommerce Platform Sync API for listings that already exist). A POST to create a store product on SatireSmart’s Woo store returned 400. Printful’s docs. Tested here.

Are Woo REST API keys how I create Printful products?

No. Woo REST keys are what Printful holds so it can write into Woo.

You generate ck_ / cs_ in WooCommerce → Settings → Advanced → REST API. They are not a back door to the Printful Products API. Never commit them. Printful’s docs.

What is Printful external_id?

It is Printful’s copy of the Woo product id, for a listing Printful pushed.

If there is no Woo product Printful created, there is no external_id to join. Printful’s docs.

What syncs, and what deletes

Does Printful sync both ways with WooCommerce?

For listings Printful created, yes: they appear in Woo, and trashing them in Woo removes them from Printful.

That is not true of Woo-created products. Those never entered the pipe. Tested here.

If I delete a product in WooCommerce, does it disappear from Printful?

Yes, if Printful created that listing.

We trashed a Printful-pushed product in Woo. It vanished from Printful. Tested here.

If I delete a product in Printful, does it disappear from Woo?

We did not delete from the Printful side after the Woo trash test.

The plugin’s job is a shared listing. Do not assume the reverse until you watch it once on your store. Not tested on SatireSmart after Test B.

Does trashing a Woo product (not permanently deleting it) remove it from Printful?

Yes, in our test. Woo trash was enough. We did not need to empty trash.

Tested here.

What does “unsynced” mean if Printful never saw the product?

On SatireSmart, unsynced stayed at zero while a Woo-only product existed. Printful was not treating it as a candidate.

Empty unsynced is not proof of success. It can mean Printful is ignoring the Woo product entirely. Tested here.

Will Printful fulfill WooCommerce orders automatically?

Printful’s Woo docs say that once you are connected and selling, orders import to Printful for fulfillment.

SatireSmart has not completed a paid test order on this Woo store, so we do not treat fulfillment as proven here. Printful’s docs. Not tested on this shop.

Should I mix the Orders API with a catalog rebuild?

No. One pipe at a time.

Listings and fulfillment are different APIs. Mixing an untested orders script with a manual catalog rebuild is how you get two sources of truth. Not tested as a combined pipe on SatireSmart, and we are not going to.

Connect, staging, and domain

Can I connect Printful to localhost while I build the theme?

No. Printful remembers the shop URL you Connected. Localhost is a different website.

Write CSS locally. Connect Printful only to the public HTTPS shop you will keep. Tested as law on SatireSmart (we never Connected localhost).

Can I connect Printful through a tunnel such as ngrok?

Do not. A tunnel is still not the shop URL you will keep, and it will rot.

Same rule as localhost: public HTTPS siteurl only.

Can I connect Printful to staging and switch to my live domain later?

You can change Printful’s website field from a staging URL to the apex. SatireSmart did that.

You should not Connect a URL you plan to throw away if you can avoid it. Do not Remove the store to “make a new one” on the new domain. Tested here.

Can I change the Printful store website URL without making a new store?

Yes. Edit the website field on the existing Woo-connected store.

SatireSmart moved it from the staging hostname to https://satiresmart.com/. Sync relationship stayed. Tested here.

Should I Remove my Printful store to start clean on a new domain?

No. Remove store is a divorce, not an empty catalog.

Keep the Woo-connected store. Trash the listings. Change the website URL. Recreate products in Printful on that same store. Tested here.

Will Hostinger Change Domain break Printful?

It will if you leave Printful pointing at a dead staging hostname.

Change Domain moves the WordPress site onto the apex. Then set Printful’s website field to the new public URL, and make sure DNS agrees. Tested here.

Do I need DNS and Printful’s website field to match?

Yes. Printful’s website field is not DNS.

Customers follow DNS. The plugin follows WordPress siteurl. Printful’s store setting has to name that same public HTTPS URL. All three have to agree. Tested here.

Hostinger Builder

Can Hostinger Website Builder run WooCommerce and Printful?

No. Hostinger Website Builder is not WordPress, so it cannot run this plugin stack.

SatireSmart had to stand up WordPress, then move the domain. Tested here.

Is Hostinger Website Builder the same as WordPress?

No. Builder is Zyro. WordPress is a different Hostinger website type.

You cannot edit Builder into WooCommerce. Printful’s docs do not apply until you are on WordPress.

How do I move a domain from Hostinger Builder onto WordPress without killing Printful?

Free the apex from Builder (Hostinger’s temp hostname is enough), attach the domain to the WordPress site, then edit Printful’s website field to the new URL. Do not Remove the Printful store.

SatireSmart did this: Builder → *.hostingersite.com, WordPress took satiresmart.com, Printful website became https://satiresmart.com/. Tested here.

Rebuild

How do I rebuild a Printful catalog on WooCommerce the safe way?

Keep the Woo-connected store. Create listings in Printful. Check the public catalog after 3, then 10, then 100.

Do not dump SKUs. Do not make a second store. Do not script the dashboard. Tested here as far as the empty slate and the listing pipe.

How many products should I create first to test sync?

Three real products. Then look at the public catalog.

If mockups, variations, or the plugin are wrong, you want to know at 3, not at 200. SatireSmart’s next step is those three. Tested here as the listing pipe; the three live designs are still ahead.

Why did Printful POST /store/products return 400?

The store is type woocommerce. Create is not allowed on that type.

Printful documents this as a Products API limitation, not a bad token. Printful’s docs. Tested here.

My Printful templates take forever to duplicate. Does that mean I should script the dashboard?

No. A slow official UI does not make an unofficial script legal, and it does not unlock Products API create on a Woo store.

Rebuild from Studio onto this Woo store. That is the path Test B proved. Tested here as the legal pipe, not as a speed hack.

Theme vs catalog

Does deploying a WordPress theme upload Printful products?

No. A theme deploy is PHP, CSS, and JS.

If the catalog is empty after a theme push, that is not a theme bug. Tested here.

Why don’t products live in the theme git repo?

Because products are Printful listings pushed into Woo, not files.

The theme repo must not hold wp-config.php, database dumps, Woo REST secrets, Printful OAuth, or product JSON.

Who this is for

Someone who already sells through Printful and is putting a real shop in front of it — especially someone leaving a website builder for WooCommerce.

You do not need this if you are starting a Manual / API Printful store and will create every product through Printful’s Products API. That is a different store type. The trap is using Woo docs on a Manual store, or API-store docs on a Woo store.

SatireSmart is the worked example: a satire apparel shop, Printful as the press, Woo as the window, Hostinger as the host.

The one sentence

Printful is the press. Woo is the shop window. Create the listing where the press lives.

Once that is true, a lot of adjacent advice becomes harmful:

  • “I’ll create the products in Woo and Printful will pick them up.”
  • “I have a JSON dump of 200 products; I’ll POST them into Woo with the old SKUs.”
  • “I’ll Connect Printful to my laptop and switch the URL later.”
  • “I’ll Remove the Printful store and make a new one on the new domain.”
  • “I’ll copy the catalog from the old Printful store to the new one.”

Each of those sounds reasonable. Each one failed, or would have failed, on SatireSmart.

Two Printful store types

Printful does not have one product API that works on every store. The store type you chose when you clicked Connect decides which APIs are legal.

WooCommerce / Shopify store Manual / API store
How it is born You Connect Printful to a live shop. Printful stores Woo REST keys and pushes products in. You create a store that is not an ecommerce platform.
Who creates a listing You, in Printful (dashboard or, for some platforms, their UI). Printful then writes the Woo product. You, via the Products API or the dashboard.
Ecommerce Sync API Get, update, delete existing synced listings. Not create. Not the pipe you want for create.
Products API (/store/products POST) No. Create returns an error. Yes.
“I’ll just script the catalog into Printful” You are on the wrong store type. That is what this type is for.

SatireSmart’s connected store is type woocommerce. A GET on Printful’s store endpoint reports that. A POST to create a store product returns 400. That is not a bug in your token. It is the store type.

Woo REST consumer keys (ck_ / cs_) that you generate in WooCommerce → Settings → Advanced → REST API are the credentials Printful holds so it can write products, orders, and stock-shaped data into Woo. They are not a way for you to create Printful products from Woo.

The official plugin we used is printful-shipping-for-woocommerce (2.2.12 at the time of writing). It does OAuth to Printful, scoped to that one store. It is not a bulk importer.

What SatireSmart actually connected

Live shop: https://satiresmart.com/

  • WordPress + WooCommerce on Hostinger.
  • Printful store type: WooCommerce.
  • Plugin: Printful Integration for WooCommerce, connected with OAuth.
  • Printful website field: https://satiresmart.com/ (it used to be the staging hostname; we changed it).
  • Theme: a custom SatireSmart theme. Chrome only. No products in git.

Local WordPress was used to write the theme. Printful was never Connected to localhost. That is load-bearing. Printful remembers the shop it was connected to. A laptop URL is a different shop as far as the connector is concerned.

What syncs

For a listing Printful created on a Woo-connected store:

  1. Printful writes a Woo product (variable product, colors, sizes, mockups, SKUs of Printful’s choosing).
  2. The Woo product id is what Printful stores as external_id.
  3. The listing shows on the public catalog.
  4. If you trash that Woo product, Printful drops the listing too.

Step 4 is the one we did not want to believe until we watched it. It is also the good news: you have one catalog, visible from both sides, for products that entered through Printful.

Fulfillment is a different pipe. When a customer checks out on Woo, the plugin can send the order to Printful. We did not treat that as proven on SatireSmart. Do not mix an untested Orders API script with a listing rebuild. One pipe at a time.

What does not sync

Woo-created products. If you add a product in Woo Admin, Printful does not adopt it because the SKU looks familiar. We tried.

Old dump SKUs. SatireSmart had a JSON dump of the original Printful catalog (hundreds of products, pulled earlier). The SKU on a Builder-era variant is not the SKU Printful issues when it pushes a fresh copy into Woo. They look related. They are not a join key.

Store-to-store copy. Printful will not copy a catalog from store A onto store B. Template duplication in their dashboard is batch-limited (in our use, eleven at a time). There is no supported “clone this store onto my new Woo store” button. If you need a clean Woo-connected catalog, you rebuild from Studio / files onto that Woo store.

Localhost. Connecting Printful to http://localhost:8080 (or a tunnel in front of it) is a different website. Do not do it “just to see.” Use a public HTTPS URL that will still be the shop next month.

Theme files. Committing a theme does not upload products. Rsyncing a theme does not upload products. A Hostinger “Change Domain” does not upload products.

The two tests

We ran two throwaway products on the live Woo store. Names were ugly on purpose so they could not hide in the catalog.

Test A — SS SYNC TEST (dead)

Hypothesis: if Woo already has a product whose variation SKU matches a Printful variant from the old dump, Printful will attach it.

We created a Woo variable product in wp-cli, one variation, dump SKU from the old TIFU Black S. Printful’s sync count did not move. The product did not appear in the Printful Woo-store UI. Unsynced stayed at zero — Printful was not even seeing it as a candidate.

Result: Woo-side SKU matching is not how this connector works. Do not import a dummy catalog and hope.

Then we trashed it.

Test B — REST TEST (the pipe)

Hypothesis: a product created in Printful and pushed to Woo is the real listing, and deleting it in Woo deletes it in Printful.

We created a product in Printful, let the plugin push it, confirmed it in Woo (id 1321, twenty variations). Then we trashed it in Woo.

It disappeared from Printful.

Result: the official path is bidirectional for listings Printful created. Create in Printful. Manage or delete in either place. Do not create in Woo first.

Those two tests are the whole connector, as far as listings go.

Hostinger Builder is not WordPress

SatireSmart.com used to be a Hostinger Website Builder site (Zyro). That is a different product from Hostinger WordPress.

You cannot “turn Builder on” and get WooCommerce. You cannot edit Builder into a Printful Woo connector. You stand up a WordPress site, put Woo and the Printful plugin on it, then you move the domain.

What we actually did:

  1. WordPress lived on staging.satiresmart.com while Builder held the apex.
  2. Builder was moved off the apex onto a Hostinger temporary hostname (*.hostingersite.com). That is how you free the domain. There is no “park this on a junk name” control that helps you here.
  3. In Hostinger, Change Domain / connect domain attached satiresmart.com to the WordPress site. The files that used to be under the staging folder are now the apex public_html. The staging hostname 403s.
  4. In Printful → store settings, the website field was changed from the staging URL to https://satiresmart.com/. That part does work. You do not need a new Printful store to change the URL.

Warnings you will see in Hostinger (email, SSL, “this cannot be undone”) are real enough to read. They are not a reason to stay on Builder. Builder cannot run this shop.

DNS must point the apex at the WordPress host before Printful and Woo will look like the same site to a customer. Printful’s website field is not DNS. Both have to be true.

Do not Remove the store

Printful’s Remove store is not a catalog empty. It is a divorce. OAuth, the plugin’s store id, the push relationship — gone. You would Connect again, maybe against a different URL, and you would still have to recreate every listing, plus you would have thrown away the one relationship that already knew how to talk to this Woo.

Clean slate means:

  • Keep the Woo-connected Printful store.
  • Delete or trash the listings (from Woo or from Printful; Test B says both sides drop).
  • Change the website URL if the shop moved.
  • Recreate products in Printful on that store.

SatireSmart did this. After the tests and a catalog wipe, Printful reported 0 synced listings and the public catalog rendered 0 styles. The store type was still woocommerce. The website was still https://satiresmart.com/. That is the correct empty.

Rebuild the catalog on the Woo store

Do it in Printful. Check the public catalog. Do not skip the small numbers.

  1. 3 products. Real designs, real colors, real sizes. Confirm they appear at satiresmart.com/catalog/, that the PDP has mockups, that add-to-cart is a variable product.
  2. 10. Same check. If something is wrong (wrong siteurl, plugin disconnected, products stuck in draft) you want to know at 10, not at 200.
  3. 100, then the rest. Same pipe. No dump import. No SKU attach. No second store.

Printful’s template UI is slow if you are duplicating many garments. That is a Printful dashboard fact, not a Woo fact. It does not make the API-create path legal on a Woo store. It does not make store-to-store copy exist. Studio → this Woo store is the path that Test B proved.

As of 19 August 2026 the SatireSmart catalog is empty on purpose, waiting on those first three.

Theme is a separate repo

The shop chrome (header, catalog grid, cart, checkout voice) is a WordPress theme. SatireSmart’s is public-facing at /wp-content/themes/satiresmart/ and versioned in git as its own repo.

That repo must not contain:

  • wp-config.php
  • Database dumps
  • Woo REST secrets
  • Printful OAuth
  • Product JSON

Deploying a theme is rsync/git of PHP, CSS, JS. It does not create a Printful product. If the catalog is empty after a theme push, that is not a theme bug.

Local theme work is fine. Connecting Printful to the machine you use to write CSS is not.

Checklist

Do

  • Connect Printful to the public HTTPS shop you will keep.
  • Create listings in Printful.
  • Confirm a new listing on the public catalog before you make a hundred more.
  • Trash a test listing in Woo and confirm it left Printful, once, so you trust the pipe.
  • Change Printful’s website field when the shop URL changes.
  • Keep the Woo-connected store through a domain cutover.
  • Keep theme git and catalog as two different jobs.

Do not

  • Connect Printful to localhost, a LAN IP, or a tunnel.
  • Create Woo products and wait for Printful to notice.
  • Import an old dump by SKU.
  • Remove the Printful store to start clean.
  • Expect store-to-store catalog copy.
  • Script the Printful dashboard.
  • Put tokens or REST secrets in the theme repo, a skill file, or this article.
  • Mix an untested orders script with a listing rebuild.

Glossary

Printful — The press. Print-on-demand fulfillment. Not your shop.

WooCommerce — The shop window. Products, cart, checkout, on WordPress.

Website Builder — Hostinger’s Zyro builder. Not WordPress. Cannot run this stack.

Connect — Printful OAuth to a platform store. Picks the store type. Hard to undo cleanly. Never point it at localhost.

Ecommerce Sync API — Printful API for listings already tied to a platform store. Get / update / delete. Not create, on Woo.

Products API — Printful API that can create products on Manual / API stores. Not on a Woo-connected store.

external_id — Printful’s copy of the Woo product id, for a listing Printful pushed.

siteurl / home — WordPress’s idea of its own public URL. Printful and Woo both need this to be the real shop.

Woo REST keysck_ / cs_ pair. Printful uses them to write into Woo. Rotate if they were ever pasted into chat. Never commit them.

SKU — Printful issues these when it creates variants. An old dump’s SKUs are souvenirs, not foreign keys.

Fixes

Corrections and shorter rules: github.com/elandrydenhall/printful-woocommerce.

The agent-facing checklist is SKILL.md. This article is the canonical prose, also published at satiresmart.com/printful-woocommerce/.

License: CC BY 4.0. Reuse it. Name SatireSmart as the example if you keep the story. Fix the dates when Printful changes the API.

Dated 19 August 2026. Q&A pass the same day. SatireSmart catalog at time of writing: empty, on purpose.