Pular para o conteúdo

Analise as finanças do NetSuite — da conexão à DRE

~45 minutos · uma conexão ativa com o NetSuite, um razão geral carregado, uma DRE mensal, um aging de contas a receber e uma atualização agendada

Este é o caminho do primeiro dia para um controller ou analista de FP&A: ao final, você terá extraído o seu razão geral diretamente do NetSuite, transformado em uma demonstração do resultado (DRE) mensal que se lê como um demonstrativo, criado um aging de contas a receber, colocado ambos em um painel e configurado tudo para ser atualizado sozinho. Sem exportar planilhas, sem redigitação manual — os números vêm do NetSuite e permanecem atualizados.

Você vai conectar uma vez, extrair uma vez e depois fazer a parte que realmente importa: transformar linhas brutas do razão geral nos resumos que uma pessoa de negócios lê na manhã de segunda-feira.

NetSuiteExtração SuiteQLTabela do razãoAgrupar & somarDRE
Conecte, extraia o razão geral uma vez e depois transforme-o em demonstrativos que você lê — tudo reexecutável em um agendamento.
  • Um espaço de trabalho do PlaidCloud e um projeto para trabalhar (inicie um teste se precisar de um).
  • Uma conexão ativa com o NetSuite. Siga primeiro Conectar ao NetSuite — você precisa de OAuth 2.0 e REST Web Services habilitados no NetSuite, do ID de cliente da integração, de um ID de certificado, do ID da sua conta e do PEM da chave privada. Confirme que Enviar solicitação de teste está verde antes de começar aqui.
  • Não é preciso SQL para transformar os dados — você fará isso com etapas de transformação padrão. O único texto de consulta é a extração do NetSuite, e todas as consultas de extração são fornecidas. Mantenha Exemplos de consultas SuiteQL do NetSuite aberto em uma guia; este tutorial se baseia nele.

O fluxo de trabalho é o pipeline que extrai e transforma os dados.

  1. Abra seu projeto e vá para a guia Fluxos de trabalho.
  2. Clique em Novo fluxo de trabalho, dê a ele um nome como NetSuite Financials e abra-o.

Uma única consulta SuiteQL fornece um ano de movimentações contábeis — todas as contas, todos os meses — o que basta para criar uma DRE e, mais tarde, outros demonstrativos.

  1. Adicione uma etapa Solicitação REST. Na guia Solicitação, defina Conexão como sua conexão do NetSuite, Método como POST e Endpoint como /services/rest/query/v1/suiteql.

  2. No Corpo, coloque este SuiteQL envolvido como {"q": "…"}:

    SELECT
    TO_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 amount
    FROM transactionaccountingline tal
    JOIN transaction t ON t.id = tal.transaction
    JOIN account a ON a.id = tal.account
    WHERE tal.posting = 'T'
    AND tal.accountingbook = 1
    AND 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
  3. Na guia Resposta, defina o destino como Tabela — chame-a de netsuite_gl — e defina os tipos de coluna: amount → Moeda, todas as demais → Texto. (O SuiteQL retorna números e datas como texto; o tipo é o que permite que amount seja somado.)

  4. Clique em Enviar solicitação de teste para confirmar que ela é executada e, em seguida, execute a etapa. Agora você tem uma tabela netsuite_gl: uma linha por conta por mês, com um valor de lançamento com sinal.

Agora a análise, feita com uma única transformação de apontar e clicar — sem SQL. Uma DRE é apenas o razão geral consolidado: contas de receita e de despesa, agrupadas em algumas linhas, com o sinal invertido para que a receita apareça positiva. Uma etapa Table Extract faz tudo isso nas guias Seleção de dados da tabela e Filtros de dados.

  1. Adicione uma etapa Table Extract. Defina sua Origem como netsuite_gl e seu Destino como uma nova tabela, netsuite_pnl.

  2. Na guia Filtros de dados, mantenha apenas as contas de receita e de despesa (deixe de fora as contas de balanço patrimonial): adicione um filtro em que account_type é um de Income, OthIncome, COGS, Expense, OthExpense.

  3. Na guia Seleção de dados da tabela, clique em Resumir para ativar a agregação e, em seguida, configure três colunas de destino:

    • period — mapeada diretamente da origem. Resumir Agrupar por.
    • pnl_line — uma expressão (abaixo) que transforma cada tipo de conta em uma linha do relatório. Resumir Agrupar por.
    • amount — uma expressão netsuite_gl.amount * -1 (a inversão de sinal). Resumir Soma.

    Para pnl_line, clique duas vezes na célula de expressão e insira (o editor permite apontar e clicar nas colunas e na função case do grupo Condições):

    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'),
    )
  4. Execute a etapa.

A expressão amount * -1 é o único movimento contábil: negar o valor positivo para débito faz com que a receita fique positiva e os custos negativos, de modo que as três linhas de cada mês somem o lucro líquido. Em seguida, Soma com Agrupar por em period e pnl_line consolida todas as contas nessas três linhas por mês. As expressões usam o editor de apontar e clicar do PlaidCloud — veja Uso avançado do Data Mapper e a referência de expressões.

Abra a tabela netsuite_pnl. Para cada mês, você tem três números:

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

Leia diretamente dela:

  • Lucro bruto = Receita + Custo dos produtos vendidos (o CPV já é negativo) → 486,200 − 190,540 = 295,660.
  • Lucro líquido = as três linhas somadas → 82,780.
  • Margem bruta % = lucro bruto ÷ receita → ~61%.

A primeira coisa a fazer é conferir: execute a própria Demonstração do resultado do NetSuite para o mesmo mês e confirme que a receita e o lucro líquido coincidem. Se não coincidirem, quase sempre é uma diferença de escopo — um filtro de subsidiária/moeda ou o alinhamento entre período contábil e data da transação (veja a observação sobre períodos). Confie no pipeline somente depois que ele conferir.

A segunda vitória do primeiro dia, que segue o mesmo formato de conectar, extrair e transformar. Comece pela receita de recebíveis em aberto e depois distribua os valores em faixas conforme o atraso de cada fatura.

  1. Adicione outra etapa Solicitação REST (mesma conexão, POST, o endpoint suiteql) com este corpo:

    SELECT
    t.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_unpaid
    FROM transaction t
    WHERE t.type = 'CustInvc'
    AND t.foreignamountunpaid <> 0
    ORDER BY t.tranid

    Carregue-a como netsuite_open_ar, com invoice_total e amount_unpaid → Moeda, invoice_date e due_date → Data, e as demais → Texto.

  2. Adicione uma etapa Table Extract lendo netsuite_open_ar para uma nova tabela netsuite_ar_aging. Na guia Seleção de dados da tabela, clique em Resumir e configure três colunas de destino:

    • aging_bucket — uma expressão (abaixo) que classifica cada fatura conforme o atraso. Resumir Agrupar por.
    • invoices — qualquer coluna, por exemplo invoice_number. Resumir Contagem.
    • balance — mapeada de amount_unpaid. Resumir Soma.

    Para aging_bucket, insira esta expressão — ela mede os dias de atraso (uma data menos outra data resulta em dias) e rotula a faixa:

    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',
    )
  3. Execute-a. netsuite_ar_aging agora mostra, em cinco linhas, quanto está em dia e quanto está atrasado há 30/60/90+ dias — a visão de cobrança que uma empresa lê primeiro. (due_date precisa estar com o tipo Data para que a subtração de datas funcione — você definiu isso acima, na guia Resposta da etapa Solicitação REST.)

Números em uma tabela são úteis; um gráfico é o que você envia ao CFO. Publique netsuite_pnl e netsuite_ar_aging e depois siga Crie um painel para adicionar:

  • um gráfico de barras do lucro líquido (ou da receita) por period, e
  • um gráfico de pizza ou de barras do balance de contas a receber por aging_bucket.

Esse é um painel financeiro do NetSuite ao vivo — sem exportação, atualizado sempre que o fluxo de trabalho é executado.

  1. Execute o fluxo de trabalho inteiro uma vez, de cima para baixo, para confirmar que todas as etapas estão verdes.
  2. Agende o fluxo de trabalho — mensalmente no ritmo do fechamento, ou todas as noites se você quiser o aging de contas a receber atualizado a cada manhã.

Como cada extração substitui a tabela inteira, cada execução extrai novamente a parte definida por sua cláusula WHERE — mantenha-as na janela de que você precisa (o ano atual, somente faturas em aberto) em vez de todo o histórico.

Partindo de um fluxo de trabalho vazio, você extraiu o razão geral e os recebíveis ao vivo do NetSuite, transformou-os em uma DRE mensal e em um aging de contas a receber com duas etapas de transformação padrão — sem SQL —, colocou-os em um painel e os configurou para atualização — o ciclo central de relatórios que uma equipe de finanças executa, agora automatizado.