← 뉴스레터

2026-08-01

첫 손님이 결제한 날, 영수증 첫 줄은 '-님'이었다

23시 25분, 첫 결제가 승인됐다. 2분 뒤 영수증을 열어봤다. 첫 줄이 “-님, 결제가 완료되었어요” 였다.

결제창이 거짓말을 하고 있었다

결제 페이지에는 결제사 연결용 열쇠가 하나 박힌다. 테스트용과 실제용이 따로 있고, 화면 문구도 그에 맞춰 바뀐다 — “테스트 결제라 실제로 청구되지 않습니다” 또는 “실제로 청구됩니다”.

실서비스로 전환하고 확인해 보니 라이브에 테스트용 열쇠가 올라가 있었다. 카드 승인이 하나도 안 나는 상태였다. 손님이 결제 버튼을 눌러도 아무 일이 안 일어난다.

열쇠를 실제용으로 바꿨다. 그랬더니 더 나쁜 구간이 생겼다. “청구되지 않습니다”라고 적힌 화면에서 진짜로 청구되고 있었다.

문구를 사람이 손으로 맞추고 있었기 때문이다. 열쇠는 바꿨는데 문구는 안 바꿨다.

23:14  fix(checkout): 라이브 결제창의 거짓 고지 제거 — 실제로 청구된다

수리는 문구를 실제 설정에서 자동으로 끌어오게 만든 것이다. 이제 어긋날 수가 없다. 배포 전에 산출물을 검사하는 관문도 붙였다 — 자리표시자가 남아 있거나 열쇠 종류가 안 맞으면 배포 자체가 멈춘다.

영수증 첫 줄의 하이픈

23시 25분에 첫 결제가 승인됐다. 19,900원.

2분 뒤 영수증을 열었다. 이렇게 시작했다.

-님, 결제가 완료되었어요

이름 자리가 하이픈이었다. 결제 요청에 이메일은 넘기는데 구매자 이름을 안 넘기고 있었다. 결제사는 이름이 없으면 하이픈으로 그린다.

그런데 이게 값 하나 추가하면 끝나는 문제가 아니었다. 결제 폼에서 애초에 이름을 안 받고 있었다. 폼에 칸을 하나 더 넣으면 정확해지지만 결제 직전에 마찰이 늘고, 신청서에서 이미 받는 정보를 쓰면 마찰은 없지만 구매자 본인 이름은 아니다. 제품 결정이 먼저라 결정 대기로 남겼다.

기능은 멀쩡했다. 다만 영수증은 손님이 가장 오래 보관하는 물건이다.

결제에 실패한 사람에게는 줄 주문번호가 없다

라이브를 열기 직전에 상담봇에 “결제가 안되요” 라고 쳐봤다. 봇이 답했다.

어떤 주문 관련 문의신가요? 결제 시 입력하신 이메일이나 주문번호를 알려주시면 바로 확인해 드릴게요.

“결제가 안된다고요!” 라고 다시 쳤다. 똑같은 문장이 돌아왔다.

결제 실패를 알아듣는 분기가 아예 없어서 두 문장이 같은 기본 응답으로 떨어진 것이다. 그런데 반복은 부차적이다. 진짜 문제는 결제에 실패한 사람은 주문 자체가 성립 안 해서 줄 주문번호가 없다는 것이다. 기본 응답이 이 상황에서 구조적으로 막다른 길이었다.

배운 것

돈에 관해 사용자에게 말하는 문구는 사람이 손으로 맞추는 자리에 두면 안 된다. 실제 설정에서 파생되게 만들어야 어긋날 수가 없다. 이건 편의 문제가 아니라 고지 문제다.

폴백 문구를 쓸 때는 “이 문구를 받을 사람이 요구받은 걸 갖고 있는가”를 물어야 한다. 실패한 사람에게 성공했을 때만 생기는 정보를 요구하면, 그건 안내가 아니라 벽이다.

첫 매출이 난 날 남은 기록이 축하가 아니라 결함 목록 셋이라는 게 이 일의 성격을 잘 보여준다. 물건이 실제로 팔리기 시작하는 순간, 그때까지 아무도 안 밟던 경로에 전부 사람이 들어온다.


19,900원이 들어왔고, 숙제 세 개가 같이 들어왔다.

— 강대종 / @ssamssae