무엇을 만들었나
카드를 쓸 때마다 폰에 오는 결제 알림을 자동으로 모아서, 매일 밤 10시에 텔레그램으로 이런 메시지를 받습니다.
🌙 오늘의 가계부
━ 오늘 지출 ━
· ○○카페 5,600원 (식비/카페)
· △△마트 32,000원 (일반생활비)
합계 37,600원 · 2건
━ 이번달 ━
누적 지출 ***원
예산 대비 ○○% 소진
💳 카드 실적 & 혜택
A카드 ▓▓▓░░░░░░░ 실적 진행중
B카드 ▓▓▓▓▓▓░░░░ 실적 진행중
💡 오늘의 카드 팁
• A카드 병원·카페 10% 할인(월 2회) 다 썼어요 → 다음은 B카드로
• ⚠️ 주유 할인은 토·일만 적용돼요 — 주유는 주말에!
━ 분석 ━
이 페이스면 예산 안에서 마무리될 것 같아요 👍
잘 자요 😴
직접 입력하는 게 하나도 없습니다. 카드를 긁으면 알림이 오고, 그게 시트에 쌓이고, 밤에 정리돼서 옵니다.
전체 구조
[폰 결제 알림]
│ MacroDroid가 알림을 낚아채서
▼
[Apps Script 웹앱] ← 문자열을 해석해서 날짜·금액·상점·카테고리로 쪼갬
│
▼
[구글 스프레드시트] ← 한 줄씩 쌓임 (거래내역 시트)
│
▼
[Apps Script 밤 브리핑] ← 매일 밤 10시 자동 실행
│
▼
[텔레그램 봇] ← 메시지 발송
무료입니다. MacroDroid는 무료 버전으로 충분하고, Apps Script와 구글 시트도 무료, 텔레그램 봇도 무료예요.
1단계 — 폰 알림 낚아채기 (MacroDroid)
안드로이드용 자동화 앱입니다. “이런 일이 생기면 → 저걸 해라”를 만드는 앱이에요.
- 트리거: 알림 수신 (카드사·은행 앱 알림)
- 액션: HTTP 요청(POST)으로 알림 본문을 어딘가로 보내기
알림 본문은 MacroDroid의 “매직 텍스트”라는 변수로 꺼내 쓸 수 있습니다. 보낼 주소는 다음 단계에서 만드는 웹앱 URL이에요.
아이폰은 알림 접근이 막혀 있어서 이 방식이 안 됩니다. 안드로이드 전용이에요.
여기서 한 가지 안전장치: URL만 알면 누구나 내 시트에 데이터를 넣을 수 있으니, 요청에 비밀 토큰을 같이 보내고 서버에서 확인하게 했습니다. 토큰이 틀리면 무시합니다.
2단계 — 알림 문자열을 가계부 한 줄로 (Apps Script 웹앱)
구글 시트에서 확장 프로그램 → Apps Script로 들어가 코드를 쓰고, 배포 → 웹 앱으로 배포하면 URL이 나옵니다. 그 URL로 POST가 들어오면 doPost 함수가 실행돼요.
하는 일은 결국 문자열 파싱입니다.
"[○○카드 승인] 5,600원 07/26 21:14 △△카페"
↓
날짜 2026-07-26 / 시각 21:14 / 금액 5,600 / 상점 △△카페 / 분류 식비·카페
카테고리는 키워드 규칙으로 정합니다. “카페·커피·스타벅스” 같은 단어가 있으면 식비, “약국·병원”이 있으면 의료… 이런 목록을 만들어두는 거예요.
의외로 이 단계에서 걸러야 할 게 많았습니다.
- 누적 금액 무시 — 알림에 “이번 달 누적 ○○원”이 같이 오는 경우가 많아요. 금액 앞 글자를 보고 “누적·잔액·한도” 같은 말이 붙어 있으면 건너뜁니다.
- 카드값 갚은 건 지출이 아님 — 개별 결제가 이미 기록됐는데 카드 대금 출금까지 넣으면 두 번 세게 됩니다.
- 내 계좌끼리 이체도 지출이 아님 — 통장에서 통장으로 옮긴 건 돈이 나간 게 아니죠.
- 취소·환불은 마이너스로 — 원래 지출을 상쇄하게.
이런 예외를 하나씩 발견해서 추가하는 게 작업량의 절반이었습니다.
3단계 — 매일 밤 브리핑 발송
같은 프로젝트에 브리핑용 코드를 하나 더 만들고, 시간 기반 트리거로 매일 밤 실행되게 걸어둡니다. (Apps Script 왼쪽 시계 아이콘 → 트리거 추가)
텔레그램 봇은 @BotFather에게 말 걸어서 만들면 토큰이 나오고, 그 토큰으로 API를 호출하면 메시지가 갑니다. 이 부분은 코드 몇 줄이에요.
브리핑에 넣은 것들:
- 오늘 쓴 돈 목록과 합계
- 이번 달 누적, 예산 대비 소진율, 이 페이스로 갔을 때 월말 예상
- 다가오는 금융 일정 (고정 지출은 하루 전에 알림, 구글 캘린더에서 “돈 나가는 일정” 키워드를 뽑아 7일 전부터 알림)
- 분류가 애매한 거래는 물어보기
마지막 항목이 실용적이었습니다. 사람 이름만 찍힌 현금 이체나, 어디에 썼는지 알 수 없는 간편결제 건을 AI가 멋대로 “생활비”로 넣어버리면 가계부가 엉망이 돼요. 그래서 자동 분류를 포기하고 되묻게 했습니다.
━ ❓ 분류 확인 필요 ━
아래 거래는 성격이 애매해요. 시트에서 카테고리를 정해주세요:
· (내용 없음) 30,000원
분석 코멘트는 생성 AI에 맡겼습니다. 다만 주어진 숫자 외에는 절대 추측하지 말라고 못박아뒀어요. 안 그러면 없는 얘기를 지어냅니다.
4단계 — 카드 혜택 계산 (여기서 가장 많이 틀렸습니다)
카드를 여러 장 쓰면 “이건 어느 카드로 긁어야 하지?”가 매번 헷갈립니다. 그래서 카드별 실적 진행률과 “이번 달 이 혜택은 다 썼으니 다음은 저 카드로” 같은 팁을 브리핑에 넣기로 했어요.
그런데 여기서 틀린 게 정말 많이 나왔습니다. 카드사 약관을 하나씩 대조하면서 잡은 것들입니다.
문제 1. 혜택 조건을 대충 알고 코드를 썼다
“월 2회 할인” 같은 조건이 어디까지 공유되는지를 잘못 이해하고 있었습니다.
- 실제로는 “병원·약국·카페·편의점”이 한 묶음으로 월 2회인데, 코드는 각각 월 2회로 세고 있었어요.
- 어떤 카드는 “A혜택 50% + B혜택 30%“가 하나의 월 한도를 나눠 쓰는데, 코드는 각각 별도 한도로 계산해서 최대 2배로 부풀려 있었습니다.
- 한도별 주머니가 여러 개인 것도 몰랐어요. 같은 카드 안에서 “시간대 할인 한도”, “공과금 한도”, “주말 한도”가 각각 따로 관리됩니다.
문제 2. 횟수는 세면서 금액은 계속 더하고 있었다
전형적인 버그였어요. “월 2회 초과”를 감지해서 알림은 띄우는데, 할인 금액 누적은 멈추지 않았습니다. 3번째, 4번째 결제의 할인도 계속 더해지고 있었죠. 그래서 “이번 달 아낀 돈”이 실제보다 훨씬 크게 나왔습니다.
문제 3. 시간대 할인을 검증할 수 없었다
“밤 9시~오전 9시 결제 10% 할인” 같은 혜택이 있는데, 시트에 결제 시각이 없었습니다. 날짜만 있었어요.
처음엔 “전부 밤 결제라고 가정하자”고 했는데, 그러면 낮에 먹은 점심까지 할인받은 것으로 잡혀서 숫자가 크게 부풀려집니다. 그래서 밤 할인은 총액에서 빼고 “밤이었다면 최대 얼마”로 따로 표시하게 했어요.
그리고 확인해보니 — 알림 문구에 시각이 이미 들어 있었습니다. (“07/26 21:14 △△카페”) 그동안 파싱해서 저장만 안 했던 거예요. 한 줄 추가로 해결됐습니다. 이제 이렇게 나옵니다.
🌙 밤 할인
· 21:14 ○○ 32,000원 → 1,000원 할인
· ⚠️ 낮에 결제해서 놓친 밤 할인 5건 — 온라인 쇼핑은 밤 9시 이후로!
문제 4. 간편결제로 결제하면 알림이 2개 온다
가장 찾기 어려웠던 문제입니다.
가게에서 페이로 결제하면 페이 앱 알림과 카드사 알림이 둘 다 옵니다. 그런데 같은 결제가 두 번 기록되면 안 되니까, “90초 안에 같은 금액이 오면 무시”하는 중복 제거 로직이 있었어요.
문제는 먼저 온 것만 남는다는 점입니다. 페이 알림이 먼저 오면 카드사 알림이 버려지고, 페이 알림에는 카드 이름이 없으니 “어느 카드로 썼는지”가 통째로 사라졌습니다. 그래서 카드 실적이 계속 0으로 나왔어요.
해결은 버리지 말고 합치기였습니다.
| 페이 앱 알림 | 카드사 알림 | 합친 결과 | |
|---|---|---|---|
| 카드 | (없음) | ○○카드 | ○○카드 |
| 상점 | (페이 이름) | △△카페 | △△카페 |
| 시각 | (없음) | 21:14 | 21:14 |
| 결제수단 | ○○페이 | (없음) | ○○페이 |
두 번째 알림이 오면 빈 칸만 채우도록 했습니다. 어느 쪽이 먼저 와도 결과가 같아요.
문제 5. 그리고 이게 진짜 돈이 되는 발견이었습니다
위 문제를 고치면서 “어떤 페이로 결제했는지”가 기록되기 시작했는데, 덕분에 몇 달째 놓치고 있었을 혜택을 발견했습니다.
쓰는 카드 중 하나는 간편결제로 결제할 때만 10% 할인이 됩니다. 그런데 약관의 대상 목록을 자세히 보니 — 자주 쓰던 페이 하나가 목록에 없었습니다.
이유가 구조적이었어요. 어떤 페이는 결제가 그 페이 회사의 가맹점을 거쳐서 카드사가 “간편결제”로 분류하는데, 다른 페이는 카드를 폰에 넣어 그냥 긁는 것과 같아서 가맹점이 실제 상점으로 찍힙니다. 그러면 간편결제로 분류되지 않아 할인이 0원이에요.
습관 하나 때문에 매달 몇 만원씩 새고 있었던 셈입니다. 이제 브리핑이 이렇게 잡아줍니다.
• 💸 할인 대상이 아닌 페이로 3건 결제 → 최대 4,500원 놓쳤어요
문제 6. 투자 거래가 지출로 잡혀 있었다
주식을 사면 돈이 나가지만 그건 쓴 게 아니라 현금이 주식으로 바뀐 것입니다. 팔아도 번 게 아니고요. 그런데 이게 지출·수입에 섞여서 “이번 달 얼마 썼다”가 왜곡되고 있었습니다.
지출·수입에서 빼고 “자산 이동”으로 따로 표시하게 바꿨습니다. 손익은 평균 매입가를 별도로 관리해서 실제 손익만 계산해요.
여기에 딸린 문제가 하나 더 있었는데, 평균 매입가가 등록되지 않은 종목은 손익을 알 수 없는데도 “판 금액 − 산 금액”을 손익처럼 AI에 넘기고 있었습니다. 그래서 주식을 그냥 팔기만 해도 “이번 달 ○○원 벌었으니 예산에 여유가 있네요” 같은 사실과 다른 분석이 나올 수 있었어요. 모르는 건 넘기지 않도록 고쳤습니다.
오늘 얻은 교훈
1. 자동화는 “수집 → 해석 → 판단”으로 나눠서 보면 쉬워진다
폰 알림 잡기 / 문자열 파싱 / 규칙 계산이 각각 다른 문제입니다. 한꺼번에 만들려니 막막했는데, 단계를 쪼개니 각각은 단순했어요.
2. 규칙 기반 자동화는 “원문”을 봐야 한다
혜택 계산이 틀린 이유는 코드가 아니라 약관을 대충 알고 있었기 때문입니다. 약관 화면을 캡처해서 조건을 한 줄씩 대조하니 예상보다 훨씬 많은 오류가 나왔어요. 특히 “월 몇 회”와 “한도가 어디까지 공유되는지”는 반드시 원문을 봐야 합니다.
3. 애매한 건 자동 분류하지 말고 물어보게 하기
AI에 맡기면 그럴듯하게 채워 넣지만 틀립니다. 가계부는 틀린 데이터가 쌓이면 아무 쓸모가 없어져요. “모르겠으면 물어봐” 가 훨씬 나았습니다.
4. AI가 써준 코드도 검증해야 한다
AI와 함께 코드를 고쳤는데, 받은 코드에서 오류가 두 개 나왔습니다.
- 대화 중 옮겨 적은 시트 ID가 틀려서 실행이 안 됐어요 → 애초에 ID가 필요 없는 코드였습니다
- 주석 블록이 잘못 닫혀서 그 뒤 설명글이 코드로 해석됐어요 → 프로젝트 전체가 저장조차 안 되는 상태가 됐습니다. 다른 파일의 함수를 실행하려 해도 실패해서 원인 찾기가 까다로웠어요
두 번째는 AI가 문법 검사를 돌려서 즉시 찾아냈습니다. “고쳤습니다”를 믿지 말고 실제로 돌려보는 것, 그리고 오류가 났을 때 어느 파일이 문제인지 표시(편집기의 경고 아이콘)를 먼저 확인하는 게 빠른 길이었습니다.
5. 버그는 “안 나오는 것”보다 “그럴듯하게 나오는 것”이 위험하다
카드 실적이 0으로 나온 건 눈에 보였지만, 할인 금액이 2배로 부풀려진 건 그냥 “오, 많이 아꼈네” 하고 넘어갈 수 있었습니다. 숫자가 그럴듯할 때 한 번 더 의심하는 습관이 필요합니다. 브리핑 숫자와 카드사 앱의 “이번 달 받은 혜택” 화면을 대조해서 확인했습니다.
다음에 해볼 것
- 브리핑 숫자와 카드사 앱 실제 혜택을 며칠 비교해서 키워드 규칙 다듬기
- 상점명 매칭을 키워드로 하고 있어서 한계가 있음 (카드사는 업종 코드로 판정하는데 이름으로 추측하는 중)
- 알림 2개가 90초보다 벌어져 도착하면 아직 행이 2개 생길 수 있음
완벽하지 않지만, 매일 밤 뭘 놓쳤는지 알려주는 것만으로도 충분히 쓸모 있습니다.