이 글의 목차
2026년 10월 14일 기준 Shopify Scripts의 두 일정이 모두 지났습니다. 4월 15일 편집·게시가 종료됐고, 6월 30일 Scripts 실행이 종료됐습니다. Shopify의 Customizations Report를 검토하고 Scripts에 의존했던 체크아웃 동작을 파악하세요.
이 가이드는 영향을 받은 맞춤 설정을 평가하고 지원되는 할인·배송·결제 로직에 Shopify Functions를 사용하는 방법을 설명합니다. Scripts는 체크아웃 동작을 처리했으며, 주문 후 배송지 변경 같은 구매 후 주문 수정을 구현하지는 않았습니다.

빠른 답변: Scripts에서 Functions로 이전하기 60초 안내
현재 상태: Shopify Scripts는 2026년 6월 30일 실행이 종료됐습니다. Shopify Functions는 할인, 배송, 결제 같은 체크아웃 맞춤 설정을 위한 지원 API를 제공합니다. Functions를 사용하는 공개 앱은 여러 요금제에서 제공되며, Functions를 포함한 맞춤 앱에는 Shopify Plus가 필요합니다. Shopify 이전 가이드와 현재 CLI가 생성하는 확장 템플릿으로 시작하고 개발용 스토어에서 동작을 검증하세요.
2026년에 달라진 점
Shopify가 발표한 날짜는 지났습니다. Script Editor는 4월 15일 읽기 전용이 됐고, 2026년 6월 30일 Scripts 실행이 종료됐습니다.
| 날짜 | 변경 사항 | 필요한 조치 |
|---|---|---|
| 2026년 4월 15일 (경과) | Shopify Scripts 편집·게시 종료 | 새 변경에는 지원되는 대체 수단 필요 |
| 2026년 6월 30일 (경과) | Shopify Scripts 실행 종료 | 영향을 받은 체크아웃 로직과 현재 대체 구현 점검 |
Script에 의존하던 동작은 교체하거나 재구성하지 않았다면 기한 후 실행이 멈췄습니다. 실제 스토어 체크아웃 동작을 확인하세요. 모든 영향받은 설정이 같은 방식으로 대체 작동한다고 가정하지 마세요.
팁: Shopify Admin의 Customizations Report로 Scripts 종료에 영향을 받은 맞춤 설정을 목록화하세요. 최신 이전 문서로 각 항목의 대체 수단을 확인하세요.
Functions와 Scripts: 실제로 달라진 점
| 항목 | Shopify Scripts: 사용 중단 | Shopify Functions: 대체 수단 |
|---|---|---|
| 언어 | Shopify 전용 Ruby DSL | Rust 또는 JavaScript. 선택한 실행 환경의 최신 도구 안내 참고 |
| 실행 환경 | Shopify 인프라의 샌드박스 Ruby | WebAssembly(WASM) 실행 환경 |
| 요금제 | Plus 전용 | Functions 공개 앱은 여러 요금제에서 제공. Functions 포함 맞춤 앱은 Plus 필요 |
| 편집기 | Admin의 Script Editor | 로컬 IDE + Shopify CLI |
| 버전 관리 | 없음. 실시간 수정 | Git 친화적인 전체 버전 관리 |
| 테스트 | 체크아웃에서 수동 | shopify app dev 로컬 개발, 미리 보기 링크 |
| 배포 | Admin에서 저장 클릭 | 터미널에서 shopify app deploy |
| 대상 | 상품 항목, 배송, 결제 | Discounts, Cart Transform, Validation, Delivery Customization, Payment Customization, Order Routing, Fulfillment Constraints 등 |
구조적 변화가 중요합니다. Scripts는 Script Editor의 Ruby 맞춤 설정이었고, Functions는 Shopify 지원 도구로 개발하는 앱 확장입니다. 확장 대상과 요금제 요건이 다르므로 이전 문서로 각 Script를 지원되는 대체 수단에 연결하세요.
각 Script에 맞는 Function 유형 연결하기
Script에 맞는 대체 수단은 Function, 공개 앱, 다른 지원 설정이거나 아예 없을 수도 있습니다. Shopify 이전 가이드에서 각 맞춤 설정의 올바른 선택지를 확인하세요.
| 기존 Script 유형 | 하던 일 | 새 Function API | Function 대상 |
|---|---|---|---|
| Line Item Script | 특정 상품·고객·장바구니 조건에 할인 적용 | Cart & Checkout Discounts API | cart.lines.discounts.generate.run |
| Shipping Script: 할인 | 장바구니 규칙에 따른 무료·할인 배송 | Cart & Checkout Discounts API | cart.delivery-options.discounts.generate.run |
| Shipping Script: 숨기기·이름·순서 변경 | $X 초과 시 요금 숨기기, ‘일반’을 ‘$50 초과 무료’로 변경 | Delivery Customization API | cart.delivery-options.transform.run |
| Payment Script | B2B에 PayPal 숨기기, $500 초과 시 COD 숨기기, 수단 순서 변경 | Payment Customization API | cart.payment-methods.transform.run |
| 장바구니 수정 Script: 드묾 | 상품 번들, 항목 교체 | Cart Transform API | cart.transform.run |
| 체크아웃 차단 Script | SKU 조합이 유효하지 않으면 장바구니 거부 | Cart & Checkout Validation API | cart.validations.generate.run |
여러 Scripts가 하나의 Function에 대응하거나 별도 대체 구현이 필요할 수 있습니다. 로직을 합치기 전에 각 경우의 대응 관계와 동작을 확인하세요.

사전 준비: 로컬 개발 환경 설정
Function의 기본 파일을 생성하기 전에 로컬에 세 가지가 설치돼 있어야 합니다. 터미널에서 확인하세요.
1. Node.js
현재 Shopify CLI 버전이 지원하는 Node.js를 사용하세요. 프로젝트 설정 전에 CLI 설치 요건을 확인하세요.
node --version
# Check the version required by your installed Shopify CLI버전이 낮다면 nvm으로 설치하거나 nodejs.org에서 다운로드하세요.
2. 최신 Shopify CLI
최신 Shopify CLI를 설치하고 shopify version으로 확인하세요. 현재 Rust Function 크레이트 2.0.0 이상에는 Shopify가 CLI 3.85.0 이상을 명시합니다.
3. Rust 도구 체인: Rust로 Functions를 작성할 때만 필요
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup target add wasm32-unknown-unknown
cargo --versionJavaScript Functions에는 Rust가 필요하지 않습니다. 팀에서 언어 하나를 선택해 유지하세요. 두 언어를 섞으면 유지 관리 부담이 늘어납니다.
4. 개발용 스토어
Partner 대시보드에서 새 개발용 스토어를 만들거나 기존 스토어를 사용하세요. 운영에 적용하기 전에 여기에 Functions를 배포합니다.
첫 Function의 기본 파일 생성하기
CLI가 기본 코드를 대부분 생성합니다. 아무 디렉터리에서나 시작하세요.
# Create a new Shopify app (skip if you already have one)
shopify app init --name my-checkout-functions
cd my-checkout-functions
# Generate a Function extension
shopify app generate extensionCLI가 선택 항목을 안내합니다. 할인 Function에는 다음을 선택합니다.
- 유형: Function
- 템플릿:
discount또는cart_checkout_validation,delivery_customization,payment_customization등 - 언어: Rust 또는 JavaScript
- 이름:
volume-discount-fn같은 이름
그러면 extensions/volume-discount-fn/에 다음 파일이 생성됩니다.
extensions/volume-discount-fn/
├── shopify.extension.toml # Function config — targets, build, version
├── src/
│ ├── cart_lines_discounts_generate_run.graphql # Input query
│ └── cart_lines_discounts_generate_run.rs # Function logic
├── Cargo.toml # Rust dependencies (Rust only)
└── README.md주로 수정할 파일은 .toml 설정, .graphql 입력, .rs / .js 로직 세 가지입니다. 이것이 전부입니다.
튜토리얼 1: Line Item Script 대체하기: 수량 할인
특정 컬렉션의 상품이 장바구니에 5개 이상이면 기존 Script가 주문 소계의 10%를 할인했다고 가정해 보겠습니다. 같은 기능의 Function은 다음과 같습니다.
1.1단계: 설정: shopify.extension.toml
api_version = "2026-10"
[[extensions]]
name = "volume-discount-fn"
handle = "volume-discount-fn"
type = "function"
[[extensions.targeting]]
target = "cart.lines.discounts.generate.run"
input_query = "src/cart_lines_discounts_generate_run.graphql"
export = "cart_lines_discounts_generate_run"
[extensions.build]
command = "cargo build --target=wasm32-unknown-unknown --release"
path = "target/wasm32-unknown-unknown/release/volume-discount-fn.wasm"
watch = ["src/**/*.rs"]1.2단계: 입력 쿼리: src/cart_lines_discounts_generate_run.graphql
query Input {
cart {
lines {
id
quantity
cost {
subtotalAmount {
amount
}
}
merchandise {
... on ProductVariant {
product {
inAnyCollection(ids: ["gid://shopify/Collection/123456789"])
}
}
}
}
}
discount {
discountClasses
}
}팁: Functions는 쿼리로 요청한 데이터만 봅니다. GraphQL을 최소화하세요. 불필요한 필드를 줄일수록 더 빠르고 적은 비용으로 실행합니다.
1.3단계: 로직: src/cart_lines_discounts_generate_run.rs
use super::schema;
use shopify_function::prelude::*;
use shopify_function::Result;
#[shopify_function]
fn cart_lines_discounts_generate_run(
input: schema::cart_lines_discounts_generate_run::Input,
) -> Result<schema::CartLinesDiscountsGenerateRunResult> {
// Bail if discount class doesn't match
let has_order_discount = input
.discount()
.discount_classes()
.contains(&schema::DiscountClass::Order);
if !has_order_discount {
return Ok(schema::CartLinesDiscountsGenerateRunResult { operations: vec![] });
}
// Sum quantities of items in the target collection
let qualifying_qty: i64 = input
.cart()
.lines()
.iter()
.filter(|line| {
if let schema::Merchandise::ProductVariant(v) = line.merchandise() {
*v.product().in_any_collection()
} else {
false
}
})
.map(|line| *line.quantity())
.sum();
if qualifying_qty < 5 {
return Ok(schema::CartLinesDiscountsGenerateRunResult { operations: vec![] });
}
// Apply 10% off the order subtotal
Ok(schema::CartLinesDiscountsGenerateRunResult {
operations: vec![schema::CartOperation::OrderDiscountsAdd(
schema::OrderDiscountsAddOperation {
selection_strategy: schema::OrderDiscountSelectionStrategy::First,
candidates: vec![schema::OrderDiscountCandidate {
targets: vec![schema::OrderDiscountCandidateTarget::OrderSubtotal(
schema::OrderSubtotalTarget {
excluded_cart_line_ids: vec![],
},
)],
message: Some("Volume discount: 10% off".to_string()),
value: schema::OrderDiscountCandidateValue::Percentage(
schema::Percentage { value: Decimal(10.0) }
),
conditions: None,
associated_discount_code: None,
}],
},
)],
})
} 1.4단계: 테스트, 배포, 활성화
# Local development with hot reload
shopify app dev
# When ready, deploy
shopify app deploy
# In the GraphiQL panel that opens (press `g` in the dev terminal),
# create the automatic discount that uses your Function:mutation CreateAutomaticDiscount($startsAt: DateTime!) {
discountAutomaticAppCreate(
automaticAppDiscount: {
title: "Volume Discount (5+ collection items)"
functionHandle: "volume-discount-fn"
discountClasses: [ORDER]
startsAt: $startsAt
}
) {
automaticAppDiscount { discountId }
userErrors { field message }
}
} GraphiQL의 Query Variables 창에서 startsAt을 미래의 ISO 8601 시각으로 설정하세요. 뮤테이션 실행 전에 해당 API 버전의 추가 필수 필드를 검토하세요.
그러면 배포된 Function을 호출하는 자동 할인이 생성됩니다. 이 사용 사례에서 Function이 Script 로직을 대체합니다.
튜토리얼 2: Shipping Script 대체하기: 장바구니 기준액 초과 시 옵션 숨기기
흔한 Script는 ‘큰 주문에 비싼 익일 배송이 적용되지 않도록 소계가 $500를 넘으면 특급 배송 숨기기’입니다. Delivery Customization Function으로는 다음과 같습니다.
튜토리얼 2와 3은 현재 JavaScript 템플릿을 사용합니다. 생성된 타깃과 src/index.js 내보내기를 유지하고, 각 확장 프로그램의 shopify.extension.toml에서 api_version = "2026-10"을 설정하세요. 입력 쿼리를 교체한 뒤 각 확장 프로그램 디렉터리에서 shopify app function typegen을 실행하세요.
2.1단계: 기본 파일 생성
shopify app generate extension --template delivery_customization --flavor vanilla-js --name hide-express-fn2.2단계: 입력 쿼리: src/cart_delivery_options_transform_run.graphql
query CartDeliveryOptionsTransformRunInput {
cart {
cost {
subtotalAmount {
amount
}
}
deliveryGroups {
deliveryOptions {
handle
title
}
}
}
} 2.3단계: 로직: src/cart_delivery_options_transform_run.js
// @ts-check
/**
* @typedef {import("../generated/api").CartDeliveryOptionsTransformRunInput} CartDeliveryOptionsTransformRunInput
* @typedef {import("../generated/api").CartDeliveryOptionsTransformRunResult} CartDeliveryOptionsTransformRunResult
*/
/** @type {CartDeliveryOptionsTransformRunResult} */
const NO_CHANGES = { operations: [] };
const THRESHOLD = 500.0;
const HIDE_TITLES = ["Express", "Overnight"];
/**
* @param {CartDeliveryOptionsTransformRunInput} input
* @returns {CartDeliveryOptionsTransformRunResult}
*/
export function cartDeliveryOptionsTransformRun(input) {
const subtotal = parseFloat(input.cart.cost.subtotalAmount.amount);
if (subtotal < THRESHOLD) return NO_CHANGES;
const operations = input.cart.deliveryGroups.flatMap((group) =>
group.deliveryOptions
.filter((opt) => HIDE_TITLES.some((t) => (opt.title ?? "").includes(t)))
.map((opt) => ({
deliveryOptionHide: { deliveryOptionHandle: opt.handle },
}))
);
return { operations };
} 2.4단계: 배송 사용자 지정 생성 및 활성화
shopify app deploy를 실행하고 대상 스토어에 앱을 설치한 뒤, write_delivery_customizations 범위가 부여된 해당 앱의 인증된 Admin GraphQL 클라이언트를 통해 deliveryCustomizationCreate를 실행하세요. functionHandle 변수에는 shopify.extension.toml에 있는 확장 프로그램의 handle(예: hide-express-fn)을 설정하세요.
mutation CreateDeliveryCustomization($functionHandle: String!) {
deliveryCustomizationCreate(deliveryCustomization: {
functionHandle: $functionHandle
title: "Hide express shipping above cart threshold"
enabled: true
}) {
deliveryCustomization { id enabled }
userErrors { field message }
}
}응답에 활성화된 사용자 지정이 반환되고 userErrors가 없는지 확인한 뒤, 설정 → 배송 및 배달 → 배송 사용자 지정을 확인하고 체크아웃 동작을 테스트하세요. 배포하면 Function을 사용할 수 있게 되며, 이 뮤테이션은 스토어의 사용자 지정을 생성하고 활성화합니다.

튜토리얼 3: Payment Script 대체하기: B2B에 COD 숨기기
기존 Script는 ‘B2B 태그가 있는 고객에게 대금 상환 숨기기’입니다. Payment Customization 버전은 다음과 같습니다.
3.1단계: 기본 파일 생성
shopify app generate extension --template payment_customization --flavor vanilla-js --name hide-cod-b2b-fn3.2단계: 입력 쿼리: src/cart_payment_methods_transform_run.graphql
query CartPaymentMethodsTransformRunInput {
cart {
buyerIdentity {
customer {
hasTags(tags: ["B2B"]) {
tag
hasTag
}
}
}
}
paymentMethods {
id
name
}
} 3.3단계: 로직: src/cart_payment_methods_transform_run.js
// @ts-check
/**
* @typedef {import("../generated/api").CartPaymentMethodsTransformRunInput} CartPaymentMethodsTransformRunInput
* @typedef {import("../generated/api").CartPaymentMethodsTransformRunResult} CartPaymentMethodsTransformRunResult
*/
/** @type {CartPaymentMethodsTransformRunResult} */
const NO_CHANGES = { operations: [] };
/**
* @param {CartPaymentMethodsTransformRunInput} input
* @returns {CartPaymentMethodsTransformRunResult}
*/
export function cartPaymentMethodsTransformRun(input) {
const tagCheck = input.cart?.buyerIdentity?.customer?.hasTags?.[0];
const isB2B = tagCheck?.hasTag === true;
if (!isB2B) return NO_CHANGES;
const codMethod = input.paymentMethods.find((pm) =>
pm.name.toLowerCase().includes("cash on delivery")
);
if (!codMethod) return NO_CHANGES;
return {
operations: [{ paymentMethodHide: { paymentMethodId: codMethod.id } }],
};
} 3.4단계: 결제 사용자 지정 생성 및 활성화
대상 스토어에 앱을 배포하고 설치한 뒤, write_payment_customizations 범위가 부여된 해당 앱의 인증된 Admin GraphQL 클라이언트를 통해 paymentCustomizationCreate를 실행하세요. functionHandle에는 shopify.extension.toml에 있는 결제 확장 프로그램의 handle(예: hide-cod-b2b-fn)을 설정하세요.
mutation CreatePaymentCustomization($functionHandle: String!) {
paymentCustomizationCreate(paymentCustomization: {
functionHandle: $functionHandle
title: "Hide Cash on Delivery for B2B-tagged customers"
enabled: true
}) {
paymentCustomization { id enabled }
userErrors { field message }
}
}응답에 활성화된 결제 사용자 지정이 포함되고 userErrors가 없는지 확인하세요. 설정 → 결제 → 결제 사용자 지정에서 확인한 뒤 B2B 태그가 있는 고객과 없는 고객으로 체크아웃을 테스트하세요.
잠깐: 구매 후 주문 수정에 관해
체크아웃 후 변경에는 Revize가 판매자 설정 시간 동안 주문 상태 페이지나 확인 이메일 링크로 주문 처리 전 적격 고객 셀프서비스를 제공합니다. 상품 교체와 추가 상품은 Pro가 필요하며 직원용 수정은 개발 중입니다. 고객은 추가 잔액을 검토하고 Shopify 체크아웃에서 결제합니다. Shopify 주문 관리 2026: Plus 운영팀 실무 가이드는 기본 구매 후 흐름을 다룹니다.
이제 이전 작업으로 돌아가겠습니다.
테스트 전략: 고객 태그 활용하기
개발용 스토어와 대표 입력 예제로 대체 구현을 문서화된 요건이나 저장된 Script 테스트 결과와 비교하세요. Scripts는 실행이 종료돼 실시간 병렬 Script·Function 테스트는 불가능합니다. 동작을 확인할 때 고객 태그 조건으로 테스트 Function을 내부 계정에만 제한할 수 있습니다. 운영 배포는 이 테스트와 구분하세요.
1단계: 테스트 사용자에게 태그 지정
고객에서 내부 계정 두세 개에 FN-TESTER 태그를 추가합니다.
2단계: 태그 유무에 따라 Function 분기
// Rust example: return this target's empty result for non-testers
let is_tester = input
.cart()
.buyer_identity()
.and_then(|bi| bi.customer())
.map(|c| c.has_any_tag())
.unwrap_or(&false);
if !*is_tester {
return Ok(default_result); // No operations from this Function
}
// New Function logic only runs for tagged users3단계: 입력 쿼리에 hasAnyTag 추가
cart {
buyerIdentity {
customer {
hasAnyTag(tags: ["FN-TESTER"])
}
}
} 4단계: 체크아웃에서 확인
태그 사용자로 로그인해 조건 충족·미충족 장바구니, 할인 조합, 배송·결제 옵션을 확인하세요. 태그 없는 사용자로 반복해 Function이 작업을 반환하지 않는지 확인하세요. 이전 로직에서 기록한 예상 동작과 결과를 비교하고, 태그 조건을 제거하기 전에 비회원 체크아웃도 테스트하세요.
5단계: 운영 활성화 검토
테스트한 대체 구현을 해당 할인·배송·결제 설정으로 활성화하세요. 배포 앱 버전과 되돌리기 계획을 기록하고 팀 문서에서 오래된 Script 지침을 제거하세요.
규모가 커져도 유지할 수 있는 배포 흐름
계속 개발자의 노트북에서 배포하지 마세요. Script 한두 개를 이전했다면 실제 CI 파이프라인을 설정하세요.
최소한의 배포 흐름
# .github/workflows/deploy-functions.yml
name: Deploy Shopify Functions
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '22' }
- uses: dtolnay/rust-toolchain@stable
with: { targets: wasm32-unknown-unknown }
- run: npm install -g @shopify/cli@latest
- run: shopify app deploy --force
env:
SHOPIFY_APP_AUTOMATION_TOKEN: ${{ secrets.SHOPIFY_APP_AUTOMATION_TOKEN }}Shopify Dev Dashboard에서 App Automation Token을 만들고 위 저장소 시크릿에 보관하세요. 현재 CLI에는 Node.js 22.12 이상이 필요합니다. CI 사용 전에 프로젝트와 앱 구성을 연결하고 배포 전에 테스트·릴리스 검토 단계를 추가하세요. 이 예제는 main에 푸시하면 배포하므로 팀 릴리스 정책에 맞춰 트리거를 조정하세요.
버전 관리와 되돌리기
shopify app deploy는 버전 스냅샷을 만듭니다. 되돌리려면 다음을 실행하세요.
shopify app versions list
shopify app release --version <previous-version-id>‘이전 코드를 기억해 다시 붙여 넣기’로 되돌리던 Scripts와는 큰 차이입니다.

많은 팀이 놓치는 점
Function 출시 전에 확인할 일반적인 이전 함정입니다.
1. Functions를 Script의 1:1 복사본으로 취급하기. 그렇지 않습니다. 더 명확한 분기로 Function 하나가 Scripts 세 개를 대체할 수 있습니다. 다시 작성하기 전에 Scripts를 시스템 전체로 점검하세요.
2. 앱 권한과 Function 입력 데이터 혼동하기. Function은 입력 쿼리와 설정 메타필드로 제공된 필드를 읽습니다. read_customers나 read_orders를 추가해 Admin API 접근 권한을 얻지는 않습니다. 별도 Admin API 작업에만 앱 권한을 추가하고, 구축할 확장 Function API의 입력·설정 규칙을 확인하세요.
3. 동등성 테스트 건너뛰기. 출시 전에 대표 장바구니와 관련 예외 사례로 Function과 이전 Script를 비교하세요. 확장과 구성이 지원할 때만 단계적 배포를 사용하세요.
4. Customizations Report 건너뛰기. 실제 실행 항목의 가장 좋은 목록입니다. 기억이 아닌 보고서로 이전하세요.
5. 컬렉션 ID와 고객 태그 하드코딩. 판매자가 조정할 값에는 메타필드 기반 Function 설정을 사용하세요. CLI로 메타필드 설정 기반을 만들 수 있습니다. Shopify Function 설정 문서를 확인하세요.
이전 체크리스트
Scripts 이전의 현재 상태를 검토할 때 이 목록을 사용하세요.
| 단계 | 작업 |
|---|---|
| 목록화 | Customizations Report와 이전 문서로 영향받은 로직 파악 |
| 연결 | Script마다 Function, 공개 앱, 다른 지원 설정 중 맞는 대체 수단 확인 |
| 구축·검증 | 최신 Shopify CLI 템플릿을 사용하고 개발용 스토어에서 대표 장바구니로 테스트 |
| 배포 | 특정 Function 대상의 최신 배포·활성화 단계 따르기 |
| 확인 | 실제 체크아웃 동작 확인 후 내부 문서·워크플로의 오래된 Script 참조 제거 |
실행 기한이 지났으므로 실제 체크아웃 동작과 남은 대체 작업 점검을 우선하세요.

자주 묻는 질문
Functions를 사용하려면 Shopify Plus가 필요한가요?
Functions 공개 앱은 특정 Function API 요건에 따라 여러 Shopify 요금제에서 사용할 수 있습니다. Functions 포함 맞춤 앱에는 Shopify Plus가 필요합니다. 구현 경로를 선택하기 전에 대상의 요금제 요건을 확인하세요.
TypeScript로 Functions를 작성할 수 있나요?
Shopify Functions 도구는 JavaScript를 지원합니다. 적절한 빌드 파이프라인으로 TypeScript를 사용할 수 있지만 CLI가 TypeScript를 바로 생성한다고 가정하지 말고 해당 대상의 최신 언어·템플릿 안내를 따르세요.
Functions는 Scripts보다 얼마나 빠른가요?
Shopify Functions는 제약이 있는 WebAssembly 환경에서 실행됩니다. 문서에서 대상 Function의 현재 제한을 확인하세요. 구현 계획에 보편적인 실행 시간 기준을 사용하지 마세요.
Function이 외부 API를 호출할 수 있나요?
일부 Function API는 fetch 대상을 통한 네트워크 접근을 지원하지만 제공 범위가 제한되고 Shopify 활성화가 필요합니다. Shopify가 선언된 HTTP 요청을 수행해 결과를 run 대상에 전달합니다. 일반 Function이 임의 API를 호출한다고 가정하지 마세요. 대상의 지원 여부를 확인하고 네트워크 접근이 없으면 미리 채운 메타필드를 사용하세요.
Cart Transform과 Discounts의 차이는 무엇인가요?
Discounts는 가격을, Cart Transform은 장바구니 구성을 변경합니다. 10% 할인, 무료 배송, BOGO에는 Discounts API를 사용하세요. 두 상품을 한 항목으로 묶거나 한 옵션을 여러 항목으로 나누려면 Cart Transform을 사용합니다. 많은 이전 Scripts가 둘을 섞었으므로 이전할 때 Function 두 개로 분리하세요.
개발용 스토어 없이 로컬에서 Function을 어떻게 테스트하나요?
cargo test(Rust)나 npm test(JS)로 단위 테스트를 할 수 있지만 전체 통합 테스트에는 개발용 스토어가 필요합니다. CLI의 shopify app function run은 샘플 입력 파일로 Function을 실행하므로 빠른 반복에 유용합니다. 하지만 전체 체크아웃 동작을 확인하려면 실제 스토어와 장바구니가 필요합니다.
같은 유형의 Functions를 여러 개 사용할 수 있나요?
API 활성화 한도 내에서 가능합니다. Discount Functions는 서로를 모른 채 동시 실행되며 Shopify가 할인 노드의 조합 규칙에 따라 후보를 결합합니다. 출력이 다른 Function에 순차 입력된다고 가정하지 말고 Discount Function API와 배송·결제 대상 문서를 확인하세요.
Function 배포 후 기존 Script는 어떻게 되나요?
실행 기한이 지났으므로 필요한 동작은 지원되는 대체 수단이나 재구성이 필요합니다. Admin에 Script가 남아 있으면 기존 기록으로 보고 최신 Shopify 이전 안내로 대체나 정리가 필요한지 확인하세요.
이전이 SEO나 테마에 영향을 주나요?
아니요. Functions는 체크아웃 서버 측에서 실행되며 테마나 상품 페이지를 건드리지 않습니다. 체크아웃의 할인, 배송 옵션, 결제 수단만 바꿉니다. 스토어프런트, 상품 템플릿, SEO는 그대로입니다.
사용자 지정 속성이 있는 Input.line_items Script는 어떻게 이전하나요?
사용자 지정 속성은 GraphQL 입력 장바구니 항목의 attribute로 접근합니다. lines에 attribute(key: "your-key") { value }를 추가하세요. Ruby 메서드 대신 GraphQL로 읽는다는 차이 외에는 Scripts의 항목 속성처럼 읽습니다.
분석과 주문 태그는요? Functions가 데이터를 쓸 수 있나요?
Functions는 주문 태그를 쓰거나 웹훅을 직접 실행하지 않고 현재 장바구니 작업만 반환합니다. 태그와 후속 흐름에는 주문 생성 이벤트 기반 Shopify Flow를 사용하세요. 많은 판매자가 할인 Function과 주문에 “VOLUME-DISCOUNT-APPLIED” 태그를 붙이는 Flow를 함께 사용합니다.
맞춤 Function을 만들지 않고 설치할 공개 앱이 있나요?
네. Shopify App Store에는 일반 사용 사례를 Functions로 제공하는 앱이 많습니다. 할인 함수, 배송 맞춤 설정, 결제 맞춤 설정을 검색하세요. 수량 할인, 태그별 결제 수단 숨기기, 일정액 초과 무료 배송 같은 단순 사례는 기존 앱으로 며칠의 개발 시간을 절약할 수 있습니다. 맞춤 Functions는 사업 고유 로직에 사용하세요.
6월 30일 이후에도 Script를 사용했다면 어떻게 하나요?
게시된 Scripts는 기한에 비활성화됐습니다. 해당 스토어의 할인·배송·결제 동작을 검토하고 누락 규칙을 우선 처리하며 대표 장바구니로 대체 구현을 검증한 뒤 출시하세요.
Script Editor 앱을 완전히 삭제해도 되나요?
현재 Shopify Admin과 이전 안내로 기존 Script Editor 항목에 정리가 필요한지 판단하세요. Shopify Functions는 앱 확장이며 기존 Scripts와 별도로 관리됩니다.
다음 단계
- Customizations Report와 최신 Shopify 이전 가이드를 검토합니다.
- 개발용 스토어에서 관련 체크아웃 사례를 테스트합니다.
- 해당 요금제에서 필요한 로직을 지원하는 Functions나 공개 앱을 확인합니다.
- 각 운영 대체 구현을 검증하고 담당자와 설정을 문서화합니다.
체크아웃 규칙 테스트와 구매 후 수정 테스트를 구분하세요. 향후 변경의 책임이 분명하도록 시스템별 담당 앱, 활성 기능, 주문 처리·결제 동작을 기록하세요.
참고 자료
- Shopify Functions 개요: Shopify 개발자 문서
- Shopify Scripts에서 Functions로 이전하기
- Discount Function 구축 튜토리얼
- Delivery Customization Function API 참조
- Payment Customization Function API 참조
- Shopify CLI 문서
함께 읽으면 좋은 글: Shopify 주문 수정 통계(2026) · Shopify에서 고객이 직접 주문을 수정하도록 하는 방법(2026)