Prove that Shopify holds a Refund record for the order. The created level proves that the Refund record exists with the requested amount and a refunds/create webhook. It does not prove that money moved.

Contract identity.
FactValue
Contract idshopify.refund.created
Version1.0.0
Hash3b0c1707cf0adcf1
Completion levelcreated
CertificationCommunity
SkillShopify Admin API 0.1.0
Valid for provider API versions2025-07

What is the intent?

Create the refund record on the order.

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.
refund_eventsE3provider eventwebhookThe refunds/create webhooks of this refund. The type name is the WebhookSubscriptionTopic value. The resource id is the global id of the refund. The webhook verifier returns {events, count, latest, earliest, types, duplicates_dropped}, so a condition reads the count.
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.refund_readback.data.refund.createdAttime_after$operation.created_atrefund_readback
refund_presentThe shop holds the refund with the returned global id.$observed.refund_readback.data.refund.ideq$action.result.refundCreate.refund.idrefund_readback
refund_webhook_presentAt least one refunds/create webhook of this refund arrived.$observed.refund_events.countgte1refund_events

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
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
transaction_failed$observed.refund_readback.data.refund.transactions[0].status in ["FAILURE","ERROR"]FAILEDThe refund record exists, but its transaction failed at the gateway. The refund will not complete.

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/p1: shopify.docs.refunds, 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/webhooks/p1: shopify.docs.refunds, retrieved 2026-09-05
  • shopify.graphql#/types/Refund/fields/createdAt: shopify.graphql, retrieved 2026-09-05
  • shopify.graphql#/types/Refund/fields/id: shopify.graphql, retrieved 2026-09-05
  • shopify.graphql#/queries/refund: shopify.graphql, retrieved 2026-09-05
  • shopify.graphql#/enums/WebhookSubscriptionTopic/values/REFUNDS_CREATE: shopify.graphql, retrieved 2026-09-05

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

No. The minimum evidence level is E2. The action response is E1. The completion conditions read refund_readback and refund_events.

What happens after the timeout?

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