통장 엑셀 정리부터
결산 설명까지, 반복 작업을 줄입니다
통장 정리·결산 설명·쇼핑몰 현황을 가상 자료로 체험해 보세요. 실제 업무에 연결하려면 사용하는 자료와 처리 범위를 먼저 확인해야 합니다.
회사 계좌끼리 옮긴 돈, 두 번 잡히지 않게
현장에서 들은 네 가지 문제를 그대로 넣은 가상 통장 2개입니다.
| 일자 | 적요 | 출금 | 입금 | 판정 |
|---|
| 일자 | 적요 | 출금 | 입금 | 판정 |
|---|
회계프로그램 업로드용 전표
| 일자 | 차변 | 금액 | 대변 | 금액 |
|---|
출금 쪽을 대체전표 1건으로 확정하고 입금 쪽은 제외합니다. 사무소 규칙에 맞게 바꿀 수 있습니다. 업로드 양식은 위하고·세무사랑 실제 양식을 받아 맞출 예정입니다.
직원이 볼 것만 남긴 검토 목록
원본 엑셀은 수정하지 않습니다. 판정 이유를 옆 칸에 붙인 검토용 엑셀을 따로 만듭니다.
실제 코드 일부 보기 (Python · 이체 짝짓기 규칙)
def _candidate(withdrawal, deposit, rules):
if withdrawal.account.account_id == deposit.account.account_id:
return None # 같은 통장끼리는 이체 아님
days = abs((withdrawal.transaction_date - deposit.transaction_date).days)
if days > rules.date_window_days:
return None # 날짜가 너무 떨어지면 제외
difference = withdrawal.withdrawal - deposit.deposit
if difference == 0:
match_type = "exact" # 금액 일치
elif difference in rules.fee_amounts:
match_type = "net_fee" # 차이가 수수료(500원 등)
else:
return None
score = {0: 2, 1: 1}.get(days, 0) # 같은 날일수록 가산
if _contains_account_hint(withdrawal, deposit): # 적요에 상대 계좌 이름
score += 2
...
# 동점 후보가 2건 이상이면 자동 확정하지 않고 '보류'로 넘긴다.
robotext 통장 대사 도구의 실제 규칙 코드 일부입니다. 중복 판정은 파일 해시와 행 해시를 과거 실행 기록과 대조합니다.
결산 미팅 전에, 대표님이 읽을 수 있는 한 장
재무상태표·손익계산서 숫자를 넣으면 전기 대비 변화와 쉬운 문장을 만듭니다. 아래는 가상 회사 예시입니다.
대표님께 드릴 설명
- 매출은 늘었지만 원가가 더 많이 올라 영업이익은 줄었습니다. 매출원가율이 71%에서 74%로 올랐습니다.
- 운영자금 대출 1억 원이 늘어 현금은 조금 늘었습니다. 하반기 이자 부담이 연 약 450만 원 늘어납니다.
- 외상매출금 회수 기간이 38일에서 51일로 길어졌습니다. 큰 거래처 2곳의 결제 조건 확인이 필요합니다.
담당자 확인 체크
- 원가율 상승 원인이 단가 인상인지, 재고 평가 차이인지
- 차입금 증가분의 이자 비용 계상 여부
- 장기 미회수 채권 대손 검토 대상
숫자와 문장은 시연용 가상값입니다. 실제 문장은 계산된 수치에서만 만들고, 원인 판단은 담당자가 확인합니다.
통화 끝나면 요약과 안내 문자가 바로
다음 단계 후보입니다. 아래는 화면 예시이며 아직 만들지 않았습니다.
사무소 할 일: 예정고지 금액 조회 · 리스 안내문 발송 · 9/23 엑셀 수신 확인
따로 받던 엑셀 세 개를 대시보드 한 장으로
스마트스토어는 매출·방문만, 네이버 검색광고는 광고비·클릭만 보여줍니다. 같은 계정이어도 사이트가 달라 엑셀을 각각 받아야 해서 보통 같이 못 봅니다. 받아둔 파일을 날짜 기준으로 엮어 광고비 대비 매출까지 한 번에 봅니다. 아래는 가상 쇼핑몰 데이터입니다.
| 주문일시 | 상품명 | 옵션 | 결제금액 | 상태 |
|---|---|---|---|---|
| 2026.09.01 10:12 | 원목 도마 | 사이즈: L / 각인: 없음 | 39,000 | 구매확정 |
| 2026.09.01 10:12 | 원목 도마 | 사이즈: L / 각인: 없음 | 39,000 | 구매확정 (중복 행) |
| 20260902 | 캠핑 체어 | 색상: 카키 | 89,000 | 배송중 |
| 2026.09.03 21:40 | 수납 트레이 3종 | - | 24,000원 | 반품완료 |
| 2026.09.04 08:03 | 원목 스푼 세트 | - | 18,000 | 취소완료 |
| … 807행 더 | ||||
| 일자-No. | 거래처 | 품목명(규격) | 공급가액 | 부가세 |
|---|---|---|---|---|
| 2026/09/01 -1 | (주)숲마켓 | 원목도마(L) | 1,200,000 | 120,000 |
| 2026/09/01 -2 | 숲마켓 | 원목 도마 L | 600,000 | 60,000 |
| 2026/09/05 -1 | 캠프로드 | 캠핑체어(카키) | 2,140,000 | 214,000 |
| 2026/09/09 -3 | 리빙온 | 트레이3종 | -240,000 | -24,000 |
| 2026/09/12 -1 | (주)숲마켓 | 코스터4P(소계) | 430,000 | 43,000 |
| … 467행 더 | ||||
| 일별 | 캠페인 | 노출수 | 클릭수 | 총비용(VAT포함) |
|---|---|---|---|---|
| 2026.09.08. | 파워링크_원목도마 | 18,240 | 402 | "118,420" |
| 2026.09.08. | 쇼핑검색_캠핑체어 | 9,880 | 231 | 61,090 |
| 2026.09.08. | 브랜드검색 | 1,420 | 188 | 30,000 |
| … 39행 더 (캠페인 3개 × 14일) | ||||
| 파일 | 채널 | 유입수 | 결제금액 |
|---|---|---|---|
| …_2026-09-08.xlsx | 네이버검색광고 | 812 | - |
| …_2026-09-08.xlsx | 네이버쇼핑 | 655 | - |
| …_2026-09-08.xlsx | (판매성과 합계) | - | 1,520,000원 |
| 날짜가 파일 이름에만 있음 · 하루 1파일씩 따로 받음 | |||
광고비를 쓴 만큼 매출이 났는지
일별 결제금액 (만원)
일별 ROAS (%)
검색광고 캠페인별 ROAS
검색광고 보고서 기준 · 전환매출액 ÷ 총비용
유입 채널별 방문당 결제금액
스마트스토어 기준 · 결제금액 ÷ 유입수
검색광고 보고서의 전환매출(1,150만)과 스토어 기준 검색광고 유입 결제(1,020만)는 집계 기준이 달라 차이가 납니다. 두 숫자를 나란히 보여줘야 광고 효과를 과대평가하지 않습니다.
| 지표 | 최근 2주 | 작년 같은 기간 | 증감 | 계산 |
|---|
이 계산을 하는 실제 코드 (pandas · 기존 운영 노트북 3개에서 발췌)
# 스마트스토어 일별 파일: 파일 이름에서 날짜를 꺼내 하루 단위로 합산
for file in glob.glob(os.path.join(allchannel_dir, "*.xlsx")):
date = extract_date_from_filename(file) # "..._2026-09-08.xlsx"
df = pd.read_excel(file, header=0)
all_data.append({"날짜": date,
"유입수": df["유입수"].apply(to_numeric).sum(),
"광고비": df["광고비"].apply(to_numeric).sum()})
# 판매성과와 날짜 기준 결합 → 파생 지표
merged = pd.merge(all_df, sales_df, on="날짜", how="outer").fillna(0)
merged["ROAS"] = merged["결제금액"] / merged["광고비"].replace(0, pd.NA) * 100
merged["CPC"] = merged["광고비"] / merged["유입수"].replace(0, pd.NA)
merged["CPA"] = merged["광고비"] / merged["결제수"].replace(0, pd.NA)
merged["RPV"] = merged["결제금액"] / merged["유입수"].replace(0, pd.NA)
merged["CVR"] = merged["결제수"] / merged["유입수"].replace(0, pd.NA)
# 최근 2주 vs 작년 같은 2주, 날짜(월-일) 기준으로 붙여 증감률 계산
diff_df = pd.merge(recent_df, past_df, on="날짜키", suffixes=("_최근", "_작년"))
# 검색광고 보고서: 캠페인별 광고비·전환매출 → ROAS
camp = ad_data.groupby("캠페인").agg({"총비용(VAT포함,원)": "sum", "전환매출액(원)": "sum"})
camp["ROAS(%)"] = camp["전환매출액(원)"] / camp["총비용(VAT포함,원)"] * 100
# 스마트스토어 유입 채널별 유입수·결제금액 → 방문당 결제금액
ch = channel_data.groupby("채널명").agg({"유입수": "sum", "결제금액": "sum"})
ch["유입당 결제금액"] = ch["결제금액"] / ch["유입수"]
월별 순매출 (만원)
9월 상품 TOP 5 (만원)
스마트스토어 정산액 ↔ 장부 매출 대사
| 구분 | 금액 | 설명 | 판정 |
|---|---|---|---|
| 스마트스토어 주문 순매출 | 50,200,000 | 취소·반품 제외 후 | |
| 정산 예정액 | 47,860,000 | 차이 2,340,000원 | |
| └ 판매·결제 수수료 | 1,910,000 | 수수료 내역과 일치 | 설명됨 |
| └ 9/30 주문, 10월 정산 | 391,000 | 귀속 월 차이 | 설명됨 |
| └ 원인 미확인 | 39,000 | 반품 1건이 이카운트에 미반영으로 추정 | 확인 필요 |
부가세 신고 전에 채널 매출과 장부 매출이 맞는지, 안 맞으면 어디서 차이 나는지 먼저 보여줍니다.
얼마 남았고, 무엇을 먼저 바꿀까?
쇼핑몰 대표가 매출·공헌이익·광고·재고·현금 계획을 한곳에서 살펴보는 화면입니다. 기간과 판매 채널을 바꾸거나, 정산이 늦어질 때 남는 현금을 확인해 보세요.
공헌이익은 인건비·임차료 등을 빼기 전 금액입니다. 실제 집계에는 주문·원가·배송비·광고비 자료를 연결해야 합니다.