Prove that the refund transaction succeeded at the gateway. A Refund record does not prove money movement. This level proves the SUCCESS status on the refund transaction with the requested amount.

Contract identity.
FactValue
Contract idshopify.refund.financially_completed
Version1.0.0
Hash183f55df6169b4e5
Completion levelfinancially_completed
CertificationCommunity
SkillShopify Admin API 0.1.0
Valid for provider API versions2025-07

What is the intent?

Return the amount to the customer.

What is the subject and the action?

MemberValue
Subject typeshopify.refund
Subject identityrefund_id = $action.result.refundCreate.refund.id
Canonical effectmoney.refund
Provider operationmutation refundCreate
Idempotencynot stated

How does the evidence correlate with this operation?

StrategyAssuranceKeysRequired
resource_idstrongrefund_id from $action.result.refundCreate.refund.idyes
fingerprintweakorder from $input.order_id; amount from $input.amountno

Which evidence does the contract require?

Minimum evidence level E2. An independent channel is required. Minimum channels: 1.

ChannelLevelIndependenceVerifierDescription
refund_readbackE2provider readbackhttpRead the Refund record with its order and its transactions. It proves the record, not the money movement. The http verifier returns the parsed GraphQL response body, so a condition path starts with $observed.<channel>.data. The connection of the shop gives the base URL.
transaction_readbackE2provider readbackhttpRead the refund transactions through the Refund record. The status of a transaction carries the money movement state. The http verifier returns the parsed GraphQL response body, so a condition path starts with $observed.<channel>.data. The connection of the shop gives the base URL.
order_refund_eventsE3provider eventwebhookThe refunds/create webhooks for the order since the operation started. A count above one shows a second refund. The webhook verifier returns {events, count, latest, earliest, types, duplicates_dropped}.

Which conditions must all hold for VERIFIED?

ConditionMeaningPathOperatorExpectedEvidence
refund_created_in_windowThe shop created the Refund record after the operation started.$observed.transaction_readback.data.refund.createdAttime_after$operation.created_attransaction_readback
transaction_status_successThe refund transaction shows the SUCCESS status.$observed.transaction_readback.data.refund.transactions[0].statuseqSUCCESStransaction_readback
transaction_kind_refundThe transaction is a refund transaction.$observed.transaction_readback.data.refund.transactions[0].kindeqREFUNDtransaction_readback
transaction_amount_matchesThe refund transaction carries the requested amount.$observed.transaction_readback.data.refund.transactions[0].amountSet.shopMoney.amounteq$input.amounttransaction_readback

Which conditions give CONTRADICTED?

ConditionClassReasonPathOperatorExpected
refund_on_wrong_orderwrong subjectThe refund belongs to another order.$observed.refund_readback.data.refund.order.idne$input.order_id
refund_amount_mismatchwrong amountThe provider recorded a different refund amount.$observed.refund_readback.data.refund.totalRefundedSet.shopMoney.amountne$input.amount
refund_predates_operationpre existing stateThe refund is older than the operation. It proves nothing.$observed.refund_readback.data.refund.createdAttime_before$operation.created_at
more_than_one_transactionpartial completionThe refund holds more than one transaction. This contract proves one refund transaction. Use one refund per transaction.$observed.transaction_readback.data.refund.transactionsarray_length{"min":2}
duplicate_refund_presentduplicate side effectShopify created more than one refund on the order since the operation started. Do not retry.$observed.order_refund_events.countgt1

Which observed states map to a verdict before completion?

RuleMatchVerdictReason
terminal_failure$observed.transaction_readback.data.refund.transactions[0].status in ["FAILURE","ERROR"]FAILEDThe gateway rejected the refund transaction.
still_transitional$observed.transaction_readback.data.refund.transactions[0].status in ["PENDING","AWAITING_RESPONSE"]PENDINGThe gateway has not processed the refund yet. The runtime observes again later.
status_unknown$observed.transaction_readback.data.refund.transactions[0].status eq "UNKNOWN"UNVERIFIABLEThe gateway reports an unknown status. The runtime cannot prove the outcome.

How long does the runtime observe?

Timing memberValue
Initial delay1000 ms
Poll interval5000 ms
Backoffexponential factor 2, max 60000 ms
Maximum attempts40
Timeout604800000 ms
Stale read window20000 ms
On timeoutUNVERIFIABLE (evidence_unavailable_before_timeout), escalated to a person

Where do these rules come from?

  • shopify.graphql#/mutations/refundCreate: shopify.graphql, retrieved 2026-09-05
  • shopify.docs.refunds#refunds-in-the-admin-graphql-api/refund-objects-and-money-movement/p1: shopify.docs.refunds, retrieved 2026-09-05
  • shopify.docs.refunds#refunds-in-the-admin-graphql-api/refund-objects-and-money-movement/p2: shopify.docs.refunds, retrieved 2026-09-05
  • shopify.docs.refunds#refunds-in-the-admin-graphql-api/refund-objects-and-money-movement/p4: shopify.docs.refunds, retrieved 2026-09-05
  • shopify.graphql#/types/Refund/fields/createdAt: shopify.graphql, retrieved 2026-09-05
  • shopify.graphql#/enums/OrderTransactionStatus/values/SUCCESS: shopify.graphql, retrieved 2026-09-05
  • shopify.graphql#/types/OrderTransaction/fields/status: shopify.graphql, retrieved 2026-09-05
  • shopify.graphql#/enums/OrderTransactionKind/values/REFUND: shopify.graphql, retrieved 2026-09-05
  • shopify.graphql#/types/OrderTransaction/fields/kind: shopify.graphql, retrieved 2026-09-05
  • shopify.graphql#/types/OrderTransaction/fields/amountSet: shopify.graphql, retrieved 2026-09-05
  • shopify.graphql#/inputs/OrderTransactionInput/fields/amount: shopify.graphql, retrieved 2026-09-05

Can shopify.refund.financially_completed return VERIFIED from the action response alone?

No. The minimum evidence level is E2. The action response is E1. The completion conditions read transaction_readback.

What happens after the timeout?

The verdict is UNVERIFIABLE with the reason evidence_unavailable_before_timeout. The operation goes to a person for review.