NetSuite 재무 데이터 분석 — 연결부터 손익계산서까지
약 45분 · 실시간 NetSuite 연결, 가져온 총계정원장, 월별 손익계산서, 매출채권 연령 분석, 예약된 새로 고침
컨트롤러나 FP&A 분석가가 첫날 따라 할 수 있는 경로입니다. 끝까지 진행하면 NetSuite에서 총계정원장을 바로 가져오고, 재무제표처럼 읽을 수 있는 월별 손익계산서로 바꾸고, 매출채권 연령 분석을 만들고, 둘 다 대시보드에 올리고, 전체가 자동으로 새로 고쳐지도록 설정하게 됩니다. 스프레드시트로 내보내거나 수동으로 다시 입력할 필요가 없으며, 숫자는 NetSuite에서 가져와 최신 상태로 유지됩니다.
한 번 연결하고 한 번 가져온 다음, 정말 중요한 작업을 합니다. 원시 총계정원장 행을 월요일 아침에 비즈니스 담당자가 읽는 요약으로 구성하는 것입니다.
사전 요구 사항
섹션 제목: “사전 요구 사항”- PlaidCloud 워크스페이스와 작업할 프로젝트(필요하면 체험을 시작하세요).
- 작동하는 NetSuite 연결. 먼저 NetSuite에 연결을 따라 하십시오. NetSuite에서 OAuth 2.0과 REST Web Services가 활성화되어 있어야 하며, 통합의 클라이언트 ID, 인증서 ID, 계정 ID, 개인 키 PEM이 필요합니다. 여기서 시작하기 전에 테스트 요청 보내기 결과가 녹색인지 확인하십시오.
- 데이터를 구성하는 데 SQL은 필요하지 않습니다. 표준 변환 단계로 처리합니다. 쿼리 텍스트는 NetSuite에서 데이터를 가져오는 부분에만 사용하며, 가져오기 쿼리는 모두 제공됩니다. NetSuite SuiteQL 쿼리 예제를 탭에 열어 두십시오. 이 튜토리얼은 해당 문서를 바탕으로 합니다.
1단계: 워크플로 만들기
섹션 제목: “1단계: 워크플로 만들기”워크플로는 데이터를 가져오고 구성하는 파이프라인입니다.
- 프로젝트를 열고 워크플로 탭으로 전환합니다.
- 새 워크플로를 클릭하고
NetSuite Financials와 같은 이름을 지정한 다음 엽니다.
2단계: 총계정원장 가져오기
섹션 제목: “2단계: 총계정원장 가져오기”SuiteQL 쿼리 하나로 모든 계정의 월별 1년 치 전기 활동을 가져올 수 있으며, 손익계산서와 이후의 다른 재무제표를 만들기에 충분합니다.
-
REST 요청 단계를 추가합니다. 요청 탭에서 연결을 NetSuite 연결로, 메서드를
POST로, 엔드포인트를/services/rest/query/v1/suiteql로 설정합니다. -
본문에 다음 SuiteQL을
{"q": "…"}형태로 감싸 넣습니다.SELECTTO_CHAR(t.trandate, 'YYYY-MM') AS period,a.accttype AS account_type,a.acctnumber AS account_number,BUILTIN.DF(a.id) AS account_name,tal.amount AS amountFROM transactionaccountingline talJOIN transaction t ON t.id = tal.transactionJOIN account a ON a.id = tal.accountWHERE tal.posting = 'T'AND tal.accountingbook = 1AND t.trandate BETWEEN TO_DATE('2026-01-01', 'YYYY-MM-DD')AND TO_DATE('2026-12-31', 'YYYY-MM-DD')ORDER BY period, a.acctnumber -
응답 탭에서 대상을 테이블로 설정하고 이름을
netsuite_gl로 지정한 다음, 열 유형을 설정합니다.amount는 통화, 나머지는 모두 텍스트입니다. (SuiteQL은 숫자와 날짜를 텍스트로 반환하므로, 유형을 지정해야amount를 합산할 수 있습니다.) -
테스트 요청 보내기를 클릭해 실행되는지 확인한 다음 단계를 실행합니다. 이제 계정별, 월별로 한 행씩 있고 부호가 있는 전기 금액이 담긴
netsuite_gl테이블이 생겼습니다.
3단계: 총계정원장을 손익계산서로 구성하기
섹션 제목: “3단계: 총계정원장을 손익계산서로 구성하기”이제 분석 단계이며, SQL 없이 클릭 방식 변환 하나로 처리합니다. 손익계산서는 총계정원장을 집계한 것에 불과합니다. 수익 계정과 비용 계정을 몇 개의 항목으로 묶고, 매출이 양수로 보이도록 부호를 뒤집습니다. Table Extract 단계가 테이블 데이터 선택 탭과 데이터 필터 탭에서 이 모든 작업을 처리합니다.
-
Table Extract 단계를 추가합니다. 소스를
netsuite_gl로, 대상을 새 테이블netsuite_pnl로 설정합니다. -
데이터 필터 탭에서 수익 계정과 비용 계정만 남깁니다(대차대조표 계정은 제외). 필터를 추가합니다.
account_type이(가) 다음 중 하나:Income,OthIncome,COGS,Expense,OthExpense. -
테이블 데이터 선택 탭에서 요약을 클릭해 집계를 켠 다음, 대상 열 세 개를 설정합니다.
period: 소스에서 그대로 매핑합니다. 요약은 그룹화 기준입니다.pnl_line: 각 계정 유형을 보고서 항목으로 바꾸는 식(아래 참조)입니다. 요약은 그룹화 기준입니다.amount: 식netsuite_gl.amount * -1(부호 반전)입니다. 요약은 합계입니다.
pnl_line의 식 셀을 두 번 클릭하고 다음을 입력합니다(편집기에서 열과 조건 그룹의case함수를 클릭으로 선택할 수 있습니다).case((netsuite_gl.account_type.in_(['Income', 'OthIncome']), '1 - Revenue'),(netsuite_gl.account_type == 'COGS', '2 - Cost of Goods Sold'),(netsuite_gl.account_type.in_(['Expense', 'OthExpense']), '3 - Operating Expenses'),) -
단계를 실행합니다.
amount * -1 식이 유일한 회계 처리입니다. 차변이 양수인 금액의 부호를 뒤집으면 매출은 양수, 비용은 음수가 되므로 매월 세 항목을 더하면 당기순이익이 됩니다. 그런 다음 period와 pnl_line을 그룹화 기준으로 하여 합계를 구하면 모든 계정이 월별 세 항목으로 집계됩니다. 식은 PlaidCloud의 클릭 방식 편집기를 사용합니다. 고급 데이터 매퍼 사용법과 식 참조를 확인하십시오.
4단계: 재무 담당자처럼 읽기
섹션 제목: “4단계: 재무 담당자처럼 읽기”netsuite_pnl 테이블을 엽니다. 월별로 세 개의 숫자가 있습니다.
| period | pnl_line | amount |
|---|---|---|
| 2026-01 | 1 - Revenue | 486,200.00 |
| 2026-01 | 2 - Cost of Goods Sold | -190,540.00 |
| 2026-01 | 3 - Operating Expenses | -212,880.00 |
여기서 바로 읽을 수 있는 값은 다음과 같습니다.
- 매출총이익 = 매출 + 매출원가(매출원가는 이미 음수) →
486,200 − 190,540 = 295,660. - 당기순이익 = 세 항목의 합계 →
82,780. - 매출총이익률(%) = 매출총이익 ÷ 매출 → 약 61%.
가장 먼저 대조해야 합니다. 같은 월에 대해 NetSuite 자체의 손익계산서를 실행하여 매출과 당기순이익이 일치하는지 확인하십시오. 일치하지 않는다면 거의 항상 범위 차이 때문입니다. 자회사나 통화 필터, 또는 전기 기간과 거래 날짜의 정렬 차이가 원인입니다(기간 관련 참고 사항 참조). 대조가 맞은 뒤에야 파이프라인을 신뢰하십시오.
5단계: 매출채권 연령 분석 만들기
섹션 제목: “5단계: 매출채권 연령 분석 만들기”첫날의 두 번째 성과이며, 연결, 가져오기, 구성이라는 같은 흐름을 따릅니다. 미수 채권 레시피에서 시작하여 각 청구서의 연체 정도에 따라 구간으로 나눕니다.
-
다음 본문으로 또 다른 REST 요청 단계를 추가합니다(같은 연결,
POST, suiteql 엔드포인트).SELECTt.tranid AS invoice_number,BUILTIN.DF(t.entity) AS customer,TO_CHAR(t.trandate, 'YYYY-MM-DD') AS invoice_date,TO_CHAR(t.duedate, 'YYYY-MM-DD') AS due_date,t.foreigntotal AS invoice_total,t.foreignamountunpaid AS amount_unpaidFROM transaction tWHERE t.type = 'CustInvc'AND t.foreignamountunpaid <> 0ORDER BY t.tranidnetsuite_open_ar로 저장하고,invoice_total과amount_unpaid는 통화,invoice_date와due_date는 날짜, 나머지는 텍스트로 지정합니다. -
netsuite_open_ar를 읽어 새 테이블netsuite_ar_aging에 쓰는 Table Extract 단계를 추가합니다. 테이블 데이터 선택 탭에서 요약을 클릭하고 대상 열 세 개를 설정합니다.aging_bucket: 각 청구서에 연체 정도에 따라 레이블을 붙이는 식(아래 참조)입니다. 요약은 그룹화 기준입니다.invoices: 아무 열이나 사용합니다(예:invoice_number). 요약은 개수입니다.balance:amount_unpaid에서 매핑합니다. 요약은 합계입니다.
aging_bucket에는 다음 식을 입력합니다. 이 식은 연체 일수(날짜에서 날짜를 빼면 일수가 됩니다)를 계산하여 구간 레이블을 붙입니다.case(((func.today() - netsuite_open_ar.due_date) <= 0, '0 - Current'),((func.today() - netsuite_open_ar.due_date) <= 30, '1 - 1-30 days'),((func.today() - netsuite_open_ar.due_date) <= 60, '2 - 31-60 days'),((func.today() - netsuite_open_ar.due_date) <= 90, '3 - 61-90 days'),else_='4 - Over 90 days',) -
실행합니다. 이제
netsuite_ar_aging은 다섯 개의 행으로 정상 채권과 30/60/90일 이상 연체된 금액을 보여 줍니다. 비즈니스 담당자가 가장 먼저 읽는 채권 회수 관점의 보기입니다. (날짜 빼기가 작동하려면due_date를 날짜로 지정해야 하며, 이는 위의 REST 요청 단계 응답 탭에서 설정했습니다.)
6단계: 대시보드에 올리기
섹션 제목: “6단계: 대시보드에 올리기”테이블의 숫자도 괜찮지만, CFO에게 보내는 것은 차트입니다. netsuite_pnl과 netsuite_ar_aging을 게시한 다음 대시보드 만들기를 따라 다음을 추가하십시오.
period별 당기순이익(또는 매출)의 막대 차트aging_bucket별 매출채권balance의 원형 또는 막대 차트
이것으로 내보내기 없이 워크플로가 실행될 때마다 새로 고쳐지는 실시간 NetSuite 재무 대시보드가 완성되었습니다.
7단계: 새로 고침 예약하기
섹션 제목: “7단계: 새로 고침 예약하기”- 전체 워크플로를 위에서 아래로 한 번 실행하여 모든 단계가 녹색인지 확인합니다.
- 워크플로를 예약합니다. 결산 주기에 맞춰 매월 실행하거나, 매출채권 연령 분석을 매일 아침 최신 상태로 유지하려면 매일 밤 실행합니다.
모든 가져오기는 테이블 전체를 교체하므로, 실행할 때마다 WHERE 절이 정의한 범위를 다시 추출합니다. 전체 이력이 아니라 필요한 기간(올해, 미수 청구서만)으로 한정하십시오.
완성한 내용
섹션 제목: “완성한 내용”빈 워크플로에서 시작하여 실시간 NetSuite 총계정원장과 매출채권을 가져오고, 표준 변환 단계 두 개로 SQL 없이 월별 손익계산서와 매출채권 연령 분석으로 구성하고, 대시보드에 올리고, 새로 고침을 설정했습니다. 재무 팀이 실행하는 핵심 보고 루프가 이제 자동화되었습니다.
다음 단계
섹션 제목: “다음 단계”- NetSuite SuiteQL 쿼리 예제: 같은 워크플로에 추가할 수 있는 시산표, 대차대조표, 미결 판매 주문, 구매 주문, 재고.
- Table Extract 단계와 고급 데이터 매퍼 사용법: 더 깊은 분석을 위한 그룹화, 필터링, 계산 열.
- 차원 계층 설계: 계정과목표를 직접 제어하는 보고 그룹으로 집계합니다.
- 대시보드 만들기: 전체 대시보드 안내.