Skip to content

Powered by Grav CMS + Helios Theme

Printful

Printful is the most complete of the three. You can import what you designed in Printful's own designer, put your own print files on Printful's blanks, quote Printful's live shipping at checkout, send orders after a review, cancel them, and follow every parcel through signed webhooks.

Setting up the account

  1. Make a store of its own for this shop. In Printful's dashboard, go to Stores, choose to connect a store, and pick Manual order platform / API. A store linked to Shopify or Etsy takes its orders from there, so don't reuse one.
  2. Add billing in Printful before you send a real order. Printful charges your card or your Printful Wallet when an order is sent to production, and an order sent without billing set up fails. Drafts need no billing.
  3. Open developers.printful.com/tokens and sign in.
  4. Make a store-level private token. Choose the store from step 1 (not "all stores") and tick these scopes:
    • orders
    • sync_products/read
    • webhooks
  5. Copy the token, because Printful shows it once, and write down the expiry date it asks you for.
  6. Paste the token into KahunaCart → Print on demand → Settings → Printful → Private token, type the expiry date into Token expires on, switch Use Printful on and save.
  7. Press Check connection on the Printful card under Providers. It names the store the token reached, lists the scopes it has, and says which of the three are missing.

An account-level token reaches every store on the account. It works, but then Store id has to say which store to use. A store-level token needs nothing there.

The token

  • Stored encrypted. No screen and no API answer shows it again; a read says only whether one is pasted.
  • Printful does not tell the store when a token expires. With Token expires on filled in, you get a reminder every day for the fourteen days before. An expired token cannot be renewed, only replaced, so make a new one before the old one runs out.
  • A token Printful refuses is reported as "expired or revoked" by the connection check, and every Printful method at checkout goes unavailable until a new one is pasted.

What the add-on does with Printful

Synced import Yes. Products you designed in Printful, with their variants, pictures and costs. See Products and import.
Auto-sync Yes, as drafts, when Products made in Printful is set to Bring them in as drafts.
Custom products Yes. Your print files on a Printful catalogue blank. See Custom products.
Live rates at checkout Yes, in the order's currency.
Review before sending Yes. Every order is made as a draft first.
Cancel Yes, while Printful still allows it.
Signed webhooks Yes, registered by the add-on itself.
Stock updates Yes. A blank Printful runs out of goes unavailable here.

How an order goes

  1. The order is paid. The add-on looks Printful up for an order under this order's reference first, and only makes one if there is none. A timeout or a second worker can never make two.
  2. The order is made at Printful as a draft, named by your order number on the packing slip. A draft is free and Printful's warehouses never see it.
  3. Printful works out the cost, usually within a minute. The order's panel shows it with your margin.
  4. In review mode you press Send to Printful for …. In auto mode the add-on sends it the moment the cost is known. Sending is the call that charges you.
  5. Printful prints, packs and ships. Each parcel becomes a shipment on the order with its carrier and tracking link, and KahunaCart's shipped email goes out.

A draft you delete stays in Printful's dashboard as archived. That is Printful's behaviour, and it costs nothing.

Webhooks

Register webhook on the card (or bin/plugin kahunacart-print-on-demand webhook printful) gives Printful a secret address for this store and keeps the signing secret Printful answers with. Every delivery is checked against that signature before anything is written. Registering again replaces the old webhook.

The add-on registers these events:

  • the order events: order_updated, order_failed, order_canceled, order_put_hold, order_remove_hold
  • the parcel events: shipment_sent, shipment_returned, shipment_canceled, shipment_delivered
  • order_refunded
  • catalog_stock_updated, for the catalogue products your custom links use
  • with auto-sync on, product_synced, product_updated and product_deleted

shipment_delivered and order_refunded are missing from Printful's own list of events, so each is tried on its own; on a live Printful store both are accepted. Printful sends nothing when you edit a draft, so the order panel's Check again is how you see a change you made in Printful's dashboard straight away.

Printful gives up retrying a delivery after about a day. The poll every four hours is what keeps tracking right after that.

What Printful does not do here

  • Designing. The artwork goes on the shirt in Printful's designer, or arrives as a print file you upload here. The add-on has no designer.
  • Personalisation. A customer cannot add their own name or photo.
  • Returns and reprints. Use the Open in Printful link on the order and handle them in Printful's dashboard.
  • Repricing. When Printful raises a cost you get a notification and an entry on the Review tab. Your prices never change by themselves.

Printful's own limits

  • 120 calls a minute per token, and 5 a minute for a shipping quote of more than 100 items. Going over locks the token out for a minute. Checkout never waits that out; the Printful methods show as unavailable for that page and the next page asks again.
  • Cancelling works while the order is a draft or still waiting for fulfilment. Once Printful has started on it, it cannot be cancelled, and the order says so. A cancelled order's money goes back to your Printful Wallet, not your card.
  • A changed draft is rewritten at Printful. Once it has been sent, Printful refuses changes, and the order tells you Printful still has the old version.
  • Brazil needs the customer's CPF or CNPJ. See Shipping.