๋ฏธ๊ตญ ์์ฅ์์ SaaS ๋น์ฆ๋์ค๋ฅผ ์ด์ํ๋ค ๋ณด๋ฉด, ๊ฒฐ์ ๋จ๊ณ์์ ์์์น ๋ชปํ ์ค๋ฅ๋ก ๊ณ ๊ฐ์ ์๋ ์ํ ๊ฒฝํ์ ํ๊ฒ ๋ฉ๋๋ค. ํนํ Stripe ๊ฐ์ ๊ฒฐ์ ๊ฒ์ดํธ์จ์ด๋ฅผ ์ฒ์ ์ฐ๋ํ๋ ํ์ด๋ผ๋ฉด, ์์ญ ๊ฐ์ง ์ค๋ฅ ์ฝ๋ ์์์ ๋นํน์ค๋ฌ์์ ๋๋ ์๋ฐ์ ์์ฃ . ํ์ง๋ง ์ด ์ค๋ฅ ์ฝ๋๋ค์ ์ ํํ ์ดํดํ๊ณ ๋์ํ๋ ๊ฒ์ด์ผ๋ง๋ก ๊ฒฐ์ ์ฑ๊ณต๋ฅ ์ ๋์ด๊ณ ๊ณ ๊ฐ ์ดํ์ ๋ง๋ ํต์ฌ ์ด์ ์ ๋๋ค.
์ ์ธ๊ณ SaaS ๊ธฐ์ ๋ค์ด ๊ฐ์ฅ ์ ๋ขฐํ๋ Stripe๋ ๋จ์ํ ๊ฒฐ์ ์ฒ๋ฆฌ๋ฅผ ๋์ด, ์์ธํ ์ค๋ฅ ์ฝ๋์ ๋ช ํํ ์ฒ๋ฆฌ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฒ ๊ธ์์๋ ๋ฏธ๊ตญ ํ์ง์์ ์ค์ ๋ก ๊ฐ์ฅ ์์ฃผ ๋ง์ฃผ์น๋ Stripe ์ค๋ฅ๋ค๊ณผ, ๊ฐ๊ฐ์ ๋ํ ์ค์ ํด๊ฒฐ๋ฒ์ ๊น์ด ์๊ฒ ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค.
๊ฐ์ฅ ํํ ๊ฒฐ์ ๊ฑฐ์ ์ค๋ฅ, ์ด๋ ๊ฒ ๋์ํ์ธ์
๊ฒฐ์ ๊ณผ์ ์์ ๊ฐ์ฅ ๋น๋ฒํ๊ฒ ๋ง์ฃผ์น๋ ๊ฒ์ด ๋ฐ๋ก ์นด๋ ๊ฑฐ์ ์ค๋ฅ์
๋๋ค. card_declined, expired_card, card_error ๊ฐ์ ์ฝ๋๋ค์ด ์ฌ๊ธฐ ์ํ๋๋ฐ์, ์ด๋ค์ ๋๋ถ๋ถ ์นด๋ ๋ฐ๊ธ์ฌ์์ ๊ฑฐ๋๋ฅผ ์น์ธํ์ง ์์ ๋ ๋ฐ์ํฉ๋๋ค.
์ค์ํ ๊ฑด ๋จ์ํ “๊ฒฐ์ ๊ฐ ์คํจํ์ต๋๋ค”๋ผ๊ณ ๋ง ์๋ฆฌ๋ ๊ฒ ์๋๋ผ, ๊ณ ๊ฐ์ด ๋ค์ ์ก์ ์ ์ทจํ ์ ์๋๋ก ๋ช ํํ ์๋ด๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด:
- card_declined: “์ฃ์กํ์ง๋ง ๊ณ ๊ฐ๋์ ์นด๋๊ฐ ๊ฑฐ๋ถ๋์์ต๋๋ค. ๋ค๋ฅธ ๊ฒฐ์ ์๋จ์ ์๋ํด์ฃผ์ธ์”
- expired_card: “์นด๋ ์ ํจ๊ธฐ๊ฐ์ด ๋ง๋ฃ๋์์ต๋๋ค. ์ ํจํ ์นด๋๋ก ๋ค์ ์๋ํด์ฃผ์ธ์”
- ์ฌ๊ธฐ ์์ฌ ์ฐจ๋จ: “๋ณด์์์ ์ด์ ๋ก ๊ฑฐ๋๊ฐ ์ฐจ๋จ๋์์ต๋๋ค. ์นด๋์ฌ์ ๋ฌธ์ํด์ฃผ์ธ์”
์ด๋ฐ ์ธ์ฌํ ๋ฉ์์ง ์ฐจ๋ณํ๋ ๊ณ ๊ฐ ๊ฒฝํ์ ํฌ๊ฒ ๊ฐ์ ํ๋ฉฐ, ๋ฌด์๋ณด๋ค ๊ณ ๊ฐ์ด “์ ์ ๋๋์ง” ์ดํดํ๊ณ ์ค์ค๋ก ํด๊ฒฐํ ์ ์๊ฒ ๋ง๋ญ๋๋ค.
๊ฒฐ์ ์๋ ์ํ ์ค๋ฅ, ํ๋ก์ธ์ค ํ๋ฆ์ ์ ํํ ์ดํดํ๊ธฐ
payment_intent_unexpected_state ์ค๋ฅ๋ ๊ฒฐ์ ํ๋ก์ธ์ค์ ์์๋ฅผ ์ ๋๋ก ์ดํดํ์ง ๋ชปํ์ ๋ ์์ฃผ ๋ฐ์ํฉ๋๋ค. ์ด๋ฏธ ์๋ฃ๋ ๊ฒฐ์ ๋ฅผ ๋ค์ ์์ ํ๋ ค ํ๊ฑฐ๋, ์คํจํ ๊ฒฐ์ ๋ฅผ ์ฌํ์ธํ๋ ค ํ ๋ ๋ํ๋์ฃ .
ํด๊ฒฐ์ฑ
์ ๋ช
ํํฉ๋๋ค. ๊ฒฐ์ ์๋(PaymentIntent)์ ํ์ฌ ์ํ๋ฅผ ๋จผ์ ํ์ธํ๊ณ , ๊ทธ ์ํ์ ๋ง๋ ์์
๋ง ์ํํ๋ ๊ฒ์
๋๋ค. WebHook์ ํตํด payment_intent.payment_failed ์ด๋ฒคํธ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ชจ๋ํฐ๋งํ๋ฉด, ์คํจํ ๊ฒฐ์ ๋ฅผ ์ฆ์ ๊ฐ์งํ๊ณ ๊ณ ๊ฐ์๊ฒ ์ ์ ํ ์๋ด๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค.
์ธ์ฆ ์คํจ์ ๊ธ์ต ์ฐ๊ฒฐ ๊ณ์ ์ค๋ฅ ๋์๋ฒ
์ต๊ทผ ๋ฏธ๊ตญ ์์ฅ์์๋ ์ํ ๊ณ์ข ์ง์ ์ฐ๊ฒฐ์ ํตํ ACH ๊ฒฐ์ ๊ฐ ์ ์ ๋ ์ค์ํด์ง๊ณ ์์ต๋๋ค. ์ด ๊ณผ์ ์์ payment_method_unactivated๋ authentication_error ๊ฐ์ ์ธ์ฆ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
ํนํ ์ฃผ๋ชฉํ ์ ์ 2025๋ 9์ Stripe๊ฐ ์ถ๊ฐํ ์๋ก์ด ๊ธ์ต ์ฐ๊ฒฐ ๊ณ์ ์ค๋ฅ ์ฝ๋์ ๋๋ค:
- financial_connections_account_pending_account_numbers: ์ํ์์ ๊ณ์ ๋ฒํธ๋ฅผ ์์ง ์ค๋น ์ค์ ๋๋ค. ์ด ๊ฒฝ์ฐ ๊ณ ๊ฐ์๊ฒ “์ ์ ํ ๋ค์ ์๋ํด์ฃผ์ธ์”๋ผ๊ณ ์๋ดํ์ธ์.
- financial_connections_account_unavailable_account_numbers: ํด๋น ์ํ ๊ณ์ข๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๊ณ์ข ์ฐ๊ฒฐ์ ์์ฒญํด์ผ ํฉ๋๋ค.
์ด๋ฐ ์ธ๋ฐํ ๊ตฌ๋ถ์ ๊ณ ๊ฐ ์ง์ ๋น์ฉ์ ํ๊ธฐ์ ์ผ๋ก ์ค์ด๊ณ , ACH ๊ฒฐ์ ์ฑ๊ณต๋ฅ ์ ๋์ด๋ ๋ฐ ์ง์ ์ ์ผ๋ก ๊ธฐ์ฌํฉ๋๋ค.
๋ผ์ฐํ ๋ฒํธ ์ค๋ฅ, ACH ๊ฒฐ์ ์ ์ํฌ๋ ์ค๊ฑด
routing_number_invalid ์ค๋ฅ๋ ACH ๊ฒฐ์ ์์ ์์ฃผ ๋ฐ์ํ๋ ๋ฌธ์ ์
๋๋ค. ๋ฏธ๊ตญ์ ์ํ ๋ผ์ฐํ
์์คํ
์ ํ๊ตญ๊ณผ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์, ํ์ง ๊ฒฝํ์ด ์๋ ํ์ ์ด ๋ถ๋ถ์์ ๋ง์ด ๋นํฉํ๊ณค ํฉ๋๋ค.
Stripe๋ ACH ๊ฒฐ์ ์คํจ์จ์ ์ค์ด๋ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํ๋๋ฐ์, ํต์ฌ์ ๊ฒฐ์ ์ ๊ฒ์ฆ ๋จ๊ณ๋ฅผ ๊ฐํํ๋ ๊ฒ์ ๋๋ค. “์ํ ๋ผ์ฐํ ๋ฒํธ๊ฐ ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค. ์ํ ๊ณ์ข ํ์ธ ํ ๋ค์ ์ ๋ ฅํด์ฃผ์ธ์”๋ผ๋ ๋ช ํํ ๋ฉ์์ง์ ํจ๊ป, ๊ฐ๋ฅํ๋ค๋ฉด ์ค์๊ฐ ๋ผ์ฐํ ๋ฒํธ ๊ฒ์ฆ API๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์๋ฌ ํธ๋ค๋ง, ์ ๋ฌธ๊ฐ์ฒ๋ผ ๊ตฌ์กฐํํ๊ธฐ
Stripe๋ ๋ช ํํ ์์ธ ์ฒ๋ฆฌ ํจํด์ ๊ถ์ฅํฉ๋๋ค:
- CardError: ์นด๋ ๊ด๋ จ ์ค๋ฅ – ๊ณ ๊ฐ์ด ์ง์ ํด๊ฒฐ ๊ฐ๋ฅ
- InvalidRequestError: ์์ฒญ ๋ฐ์ดํฐ ์ค๋ฅ – ๊ฐ๋ฐํ์ด ์์ ํ์
- StripeError: ๊ธฐํ Stripe ๊ด๋ จ ์ค๋ฅ – ์ฌ์๋ ํ์
์ด๋ ๊ฒ ์ค๋ฅ๋ฅผ ๋ถ๋ฅํ๋ฉด ๊ณ ๊ฐ์๊ฒ ๋ณด์ฌ์ค ๋ฉ์์ง์ ๊ฐ๋ฐํ ๋ก๊ทธ๋ฅผ ๋ช ํํ ๊ตฌ๋ถํ ์ ์์ต๋๋ค. ๊ณ ๊ฐ์ ์น์ ํ ์๋ด๋ฅผ ๋ฐ๊ณ , ๊ฐ๋ฐํ์ ๊ธฐ์ ์ ๋ํ ์ผ์ ํตํด ๋น ๋ฅด๊ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ฃ .
WebHook ๋ชจ๋ํฐ๋ง์ผ๋ก ์ค์๊ฐ ๋์ ์ฒด๊ณ ๊ตฌ์ถ
๊ฒฐ์ ์คํจ๋ ๋ฐ์ ์ฆ์ ๊ฐ์ง๋์ด์ผ ํฉ๋๋ค. payment_intent.payment_failed ์ด๋ฒคํธ๋ฅผ WebHook์ผ๋ก ์์ ํ๋ฉด ์ฌ๋ฌ ๊ฐ์ง ์ ๋ต์ ๋์์ด ๊ฐ๋ฅํฉ๋๋ค:
- ์ฆ์ ๊ณ ๊ฐ์๊ฒ ๊ฒฐ์ ์คํจ ์๋ฆผ ๋ฐ์ก
- ์คํจ ์ฌ์ ์ ๋ฐ๋ผ ์๋์ผ๋ก ์ฌ์๋ ๊ถ์ ๋ฉ์์ง ์ปค์คํฐ๋ง์ด์ง
- ๋ง์ผํ ํ์ ์คํจ ํจํด ๋ถ์์ ํตํ ์ฒดํฌ์์ ํ๋ก์ธ์ค ๊ฐ์
ํนํ Stripe Health Alert๋ฅผ ํ์ฉํ๋ฉด 400, 409, 429 ๊ฐ์ ์ค๋ฅ ์ฝ๋ ์ฆ๊ฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ๊ฐ์งํ ์ ์์ต๋๋ค. Rate Limiting ์ด๊ณผ(429)๋ API ์์ฒญ ๊ตฌ์กฐ ๋ฌธ์ ๋ฅผ ์กฐ๊ธฐ์ ๋ฐ๊ฒฌํด ์์คํ ์์ ์ฑ์ ์งํฌ ์ ์์ต๋๋ค.
ํ ์คํธ ํ๊ฒฝ์์ ๋ชจ๋ ์๋๋ฆฌ์ค ์ฌ์ ๊ฒ์ฆ
์ค์ ๊ณ ๊ฐ์ด ์ค๋ฅ๋ฅผ ๊ฒฝํํ๊ธฐ ์ ์, ๋ชจ๋ ์๋๋ฆฌ์ค๋ฅผ ํ ์คํธ ํ๊ฒฝ์์ ๊ฒ์ฆํด์ผ ํฉ๋๋ค. Stripe CLI๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํฉ๋๋ค:
stripe trigger payment_intent.payment_failed
์ด ๋ช ๋ น์ด๋ก ๋ก์ปฌ ํ๊ฒฝ์์ ์ค์ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํ์ธํ๊ณ , ๊ณ ๊ฐ์๊ฒ ํ์๋ ๋ฌธ๊ตฌ๋ฅผ ๋ฏธ๋ฆฌ ์ ๊ฒํ ์ ์์ต๋๋ค. ์๋ฒฝํ ์ค๋น๋ ๊ณง ๊ณ ๊ฐ ์ ๋ขฐ๋ก ์ด์ด์ง๋๋ค.
์ฌ์๋ ์ ๋ต์ผ๋ก ๋งค์ถ ํ๋ณตํ๊ธฐ
Stripe์ ์คํจ ๊ฒฐ์ ๋ณต๊ตฌ ๊ฐ์ด๋์ ๋ฐ๋ฅด๋ฉด, ์ผ์์ ์ค๋ฅ(ํ์์์, ๋คํธ์ํฌ ์ง์ฐ)์ ๊ฒฝ์ฐ ์๋ ์ฌ์๋๋ฅผ ๊ตฌํํ๋ฉด ์๋นํ ๋งค์ถ ์ฆ๊ฐ ํจ๊ณผ๊ฐ ์์ต๋๋ค.
๋ค๋ง ์ฃผ์ํ ์ ์ด ์์ต๋๋ค. ์ฆ๊ฐ์ ์ธ ์๋ ์ฌ์๋๋ ์คํ๋ ค ๊ฑฐ์ ์ค๋ฅ๋ฅผ ๋๋ฆด ์ ์์ผ๋ฏ๋ก, ๊ณ ๊ฐ์ด ์นด๋์ฌ์ ํ์ธํ ํ ์๋์ผ๋ก ์ฌ์๋ํ๋๋ก ์ ๋ํ๋ ๊ฒ์ด ๋ ํจ๊ณผ์ ์ ๋๋ค. ํนํ ๊ธ์ต ์ค๋ฅ(๋ผ์ฐํ ๋ฒํธ ์ค๋ฅ ๋ฑ)๋ ๋ฐ์ดํฐ ์์ ํ ์ฌ์๋๊ฐ ํ์์ ๋๋ค.
์ค๋ฌด ์ฒดํฌ๋ฆฌ์คํธ๋ก ์๋ฒฝ ๋์
๊ฐ๋ฐ ๋จ๊ณ
- ๋ชจ๋ Stripe ์ค๋ฅ ํ์ ์ ๋ํ try-catch ๊ตฌ์กฐ ๊ตฌํ
- WebHook ์์ ๋ฐ ๋ก๊น ์ค์
- ํ ์คํธ ์นด๋๋ก ๊ฐ ์ค๋ฅ ์๋๋ฆฌ์ค ๊ฒ์ฆ
์ด์ ๋จ๊ณ
- ์ค๋ฅ๋ณ ๊ณ ๊ฐ ๋ฉ์์ง ๋ฌธ๊ตฌ ํ์คํ
- ์คํจ์จ ๋ชจ๋ํฐ๋ง ๋์๋ณด๋ ๊ตฌ์ถ
- ์ฃผ๊ฐ ์ค๋ฅ ๋ก๊ทธ ๋ถ์ ๋ฐ UX ๊ฐ์
๋ง์ผํ ํ์ฉ
- ๊ฒฐ์ ์คํจ ๊ณ ๊ฐ ๋์ ์ด๋ฉ์ผ ์บ ํ์ธ
- ์ค๋ฅ ์ ํ๋ณ ์ฌ๊ตฌ๋งค ์ ๋ ๋ฉ์์ง ์๋ํ
- ๊ณ ๊ฐ ์ง์ํ ๊ต์ก (์ค๋ฅ๋ณ ์ ํํ ์๋ด ๋ฐฉ๋ฒ)
๋ฏธ๊ตญ ์์ฅ, ํ์ง ์ ๋ฌธ๊ฐ์ ํจ๊ป๋ผ๋ฉด ๋ ๋น ๋ฆ ๋๋ค
Stripe ์ค๋ฅ ์ฝ๋๋ฅผ ์๋ฒฝํ๊ฒ ์ดํดํ๊ณ ๋์ํ๋ ๊ฒ์ ๊ธฐ์ ์ ๊ณผ์ ์ธ ๋์์, ๋ฏธ๊ตญ ๊ณ ๊ฐ์ ๊ฒฐ์ ์ต๊ด๊ณผ ๊ธ์ต ์์คํ ์ ๊น์ด ์ดํดํด์ผ ํ๋ ํ์งํ ์์ ์ ๋๋ค. ํนํ ACH ๊ฒฐ์ , ๋ผ์ฐํ ๋ฒํธ, ๊ธ์ต ์ฐ๊ฒฐ ๊ณ์ ๊ฐ์ ๊ฐ๋ ์ ํ๊ตญ ์์ฅ์์๋ ๊ฒฝํํ๊ธฐ ์ด๋ ค์ด ์์ญ์ด์ฃ .
20๋ ๊ฐ ๋ฏธ๊ตญ ํ์ง์์ ์๋ง์ SaaS ๊ธฐ์ ์ ๊ฒฐ์ ์์คํ ์ต์ ํ๋ฅผ ์ง์ํด์จ ์บ๋ฆฌ์์ด์ด(Calywire)๋ ๋จ์ํ ๊ธฐ์ ์ปจ์คํ ์ ๋์ด, ๊ณ ๊ฐ ๊ฒฝํ ๊ฐ์ ๊ณผ ๋งค์ถ ํฅ์๊น์ง ์ด์ด์ง๋ ํตํฉ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค. ์ค๋ฅ ์ฝ๋ ํ๋ํ๋์ ๋ด๊ธด ๋น์ฆ๋์ค ์ธ์ฌ์ดํธ๋ฅผ ๋์น์ง ์๊ณ , ์ฌ๋ฌ๋ถ์ SaaS๊ฐ ๋ฏธ๊ตญ ์์ฅ์์ ์ฑ๊ณต์ ์ผ๋ก ์๋ฆฌ์ก์ ์ ์๋๋ก ํจ๊ปํฉ๋๋ค.
๊ฒฐ์ ๋ ๊ณ ๊ฐ ์ฌ์ ์ ๋ง์ง๋ง ๊ด๋ฌธ์ ๋๋ค. ์ด ์๊ฐ์ ์์ฑ๋๊ฐ ๊ณง ๋น์ฆ๋์ค์ ์ฑํจ๋ฅผ ์ข์ฐํฉ๋๋ค. ๋ฏธ๊ตญ ํ์ง ์ฌ์ ์ ๊ฐ์ฅ ์ ์๋ ํํธ๋์ ํจ๊ป๋ผ๋ฉด, ๊ทธ ๊ธธ์ด ํจ์ฌ ๋ ๋ช ํํด์ง ๊ฒ์ ๋๋ค.
