Troubleshooting
Start here
php craft fjord/flows/check
It catches most of what follows before a customer does.
The upsell page is skipped
Fjord walks a visitor past a post-purchase step it cannot serve. In order of likelihood:
- No reusable payment source. The commonest cause by far. The customer must have ticked
save my card, and the gateway must support payment sources and purchases.
fjord/flows/checkreports when no enabled gateway can do it at all. - The order is not paid. With Require a Paid Order on, an authorised-but-not-captured order does not qualify.
- The offer window has closed. 60 minutes by default, from the moment the order completed.
- The offer is already resolved for that order — accepted, or declined with replay off.
- The offer's condition does not match, or its product has been deleted. A condition that cannot be evaluated hides the offer on purpose.
- You are on Lite. Upsell and downsell steps are Pro, and a Lite install will not serve them.
A step 404s
php craft fjord/flows/routes
That prints exactly what Fjord contributes to the site's URL rules. If the step is missing from the list it is disabled, or its flow is; if it is listed at a different path, the slug or the flow's base URI changed. Routes are cached per site and cleared on every write, so a stale route means something wrote to the tables outside Fjord's services.
Also check the flow's Site — a flow scoped to one site is not served on the others.
"Which does not exist"
Fjord names the template it tried to render rather than falling back to its own. Either create it, or point the step's Template field at the one you have. A bare name resolves under the Template Root; a name with a slash is used as-is.
The bump discount disappeared
The discount comes from an adjuster reading options.fjordOffer on the line item. If the line was
recreated without its options — by a custom add-to-cart, or an edit in the control panel — the stamp
is gone and so is the discount. Untick and re-tick the bump.
If the discount is there but the tax looks wrong, check that no other plugin has re-registered the adjuster list in a way that puts Fjord's adjuster after tax.
The customer was taxed oddly on a bump
Fjord splices its adjuster in ahead of Commerce's tax adjuster. Another plugin appending to
EVENT_REGISTER_ORDER_ADJUSTERS after Fjord's init() can land between them. Compare the order of
craft\commerce\services\OrderAdjustments::getAdjusters().
The cart has two of everything
Stocking is once per session per step, so this is usually a second checkout step selling the same
product with Cart Mode set to Add, or a template calling commerce/cart/update-cart with the
product as well. Set the step to Replace the cart if it should be the only thing selling.
The auto-coupon is not applied
Commerce validates a coupon against the discount's own rules. A code that does not apply to the cart is put back rather than left on the order as a broken promise, and no error is shown — check the discount's conditions and dates. A coupon the customer typed themselves is never overwritten.
Reports are empty
Track Events may be off. Otherwise, check the window — the report defaults to 30 days — and remember that a step's conversion is recorded when the next step is seen, so a funnel whose last step is the only one being visited will show views and no conversions.
Webhooks are not arriving
They are queued, so first check the queue is running. Then that the plugin is on Pro — a Lite install keeps webhook rows and sends nothing. A delivery that fails is retried by the queue; the failure message names the endpoint.
A charge failed
Fjord → Reports lists recent offers with the gateway's own message. A gateway that has started asking for an interactive step — 3-D Secure on a stored card, for instance — cannot complete a one-click charge, and Fjord records the failure rather than parking the customer on a page that will not work.