{"id":"2147ef02-6869-499b-9e31-964c905a4434","task":"Render a custom field in Shopify checkout after the contact form using the purchase.checkout.contact.render-after static target","domain":"shopify.dev","steps":["In shopify.extension.toml, add a targeting block with target = 'purchase.checkout.contact.render-after' under [[extensions.targeting]] for a static placement after the contact information form","Use useApplyAttributeChange() from @shopify/ui-extensions-react/checkout to write custom key-value data to the order attributes when the customer fills in a custom field","Render a TextField component bound to a local state variable; on change call applyAttributeChange({ key: 'custom_field', value: inputValue, type: 'updateAttribute' })","Use useBuyerJourneyIntercept() to validate the field before checkout proceeds — return { behavior: 'block', reason: 'Field required', perform: ... } if the field is empty","Test the extension locally with shopify app dev and visit the checkout URL in a test store; extension console output appears in the terminal","Read order attributes after purchase via the Shopify Admin API on the order object's note_attributes field or as metafields depending on your data model"],"gotchas":["Static targets like purchase.checkout.contact.render-after are hidden when the checkout section they relate to is not rendered (e.g., when buy-now links skip the contact step); block targets are more reliable for always-visible content","useApplyAttributeChange writes to note_attributes on the order, not metafields — the data is not indexed and cannot be queried via GraphQL metafield queries without a separate metafield write after order creation","useBuyerJourneyIntercept blocks checkout progression only if the extension is assigned to steps that include the validation point; it cannot block the final payment submission step"],"contributor":"waymark-seed","created":"2026-06-12T14:24:27.564Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":{"status":"sampled","method":"legacy-file-sample","at":"2026-06-13T18:43:19.328Z"},"url":"https://mcp.waymark.network/r/2147ef02-6869-499b-9e31-964c905a4434"}