• Créditos da HubSpot: Desbloqueie ferramentas poderosas para o crescimento

    Dúvidas?

Data Output Error Even Though It's Defined

JoeBurchard
Top colaborador(a) | Parceiro Elite
Top colaborador(a) | Parceiro Elite

I am attempting to create a calculation on deal records that will sum the net amounts on all line items of a specific Product Type. Steps I've taken:

  1. Created a private app to view line items, products, deals and edit deals
  2. Created a property <def_amount> that is a currency property
  3. Defined def_amount
  4. Added def_amount as a data output

I'm not a dev so excuse the likely **bleep** code, but the code is below. When I test the action, I keep getting the error that def_amount is not defined in the code. What is going on?

 

const hubspot = require('@hubspot/api-client');

const MATCH_VALUE = 'DEFENDIFY';
const PRODUCT_TYPE_PROP = 'hs_product_type';

// Net total preference order
const NET_PRIMARY = 'amount'; // HubSpot line-item net total
const NET_FALLBACK = 'hs_total_amount'; // fallback if present

// Fallback compute fields
const PRICE_PROPS = ['price', 'hs_price'];
const QTY_PROP = 'quantity';
const DISC_AMT_PROP = 'hs_discount_amount';
const DISC_PCT_PROP = 'hs_discount_percentage';

const normalize = v => String(v ?? '').trim().toUpperCase();
const toNumber = v => {
if (v == null) return 0;
const n = parseFloat(String(v).replace(/[^0-9.\-]/g, ''));
return Number.isFinite(n) ? n : 0;
};

exports.main = async (event) => {
const client = new hubspot.Client({ accessToken: process.env.DEFENDIFY_CALC });
const dealId = event.object.objectId;

try {
const deal = await client.crm.deals.basicApi.getById(dealId, undefined, undefined, ['line_items']);
const lineItemIds = (deal?.associations?.line_items?.results || []).map(x => String(x.id)).filter(Boolean);
if (lineItemIds.length === 0) return { outputFields: { def_amount: 0 } };

const propsToFetch = [
PRODUCT_TYPE_PROP, NET_PRIMARY, NET_FALLBACK,
...PRICE_PROPS, QTY_PROP, DISC_AMT_PROP, DISC_PCT_PROP,
];
const batch = await client.crm.lineItems.batchApi.read({
properties: propsToFetch,
inputs: lineItemIds.map(id => ({ id })),
});

let sum = 0;
for (const row of (batch?.results || [])) {
const p = row?.properties || {};
if (normalize(p[PRODUCT_TYPE_PROP]) !== MATCH_VALUE) continue;

let net = toNumber(p[NET_PRIMARY]);
if (!(net > 0)) net = toNumber(p[NET_FALLBACK]);

if (!(net > 0)) {
const qty = toNumber(p[QTY_PROP]) || 1;
const unit = PRICE_PROPS.reduce((acc, k) => (acc > 0 ? acc : toNumber(p[k])), 0) || 0;
const pre = unit * qty;
const discAmt = toNumber(p[DISC_AMT_PROP]);
const discPct = toNumber(p[DISC_PCT_PROP]);
const totalDisc = discAmt > 0 ? discAmt * qty : (discPct > 0 ? pre * (discPct / 100) : 0);
net = Math.max(0, pre - totalDisc);
}

sum += net;
}

return { outputFields: { def_amount: sum } };
} catch {
return { outputFields: { def_amount: 0 } };
}
};

 

0 Avaliação positiva
2 Solução aceitas
KareemT
Solução
Participante | Parceiro Ouro
Participante | Parceiro Ouro

Hey @JoeBurchard 

I'm not a developer myself, I wish I could help with the code 😄 

But, have you tried a rollup field instead of a code? That seems to be a much easier solution. Should look like this on the deal level.

While you can't add line item name as a condition (which I find weird), perhaps if you scroll through the options available, you'll find a fit identifier or even create a custom identifier.

KareemT_0-1756317518014.png

 

Did my post help answer your query? Help the community by marking it as a solution.

Need HubSpot assistance? Let's discuss your challenges to get started.

Exibir solução no post original

0 Avaliação positiva
RubenBurdin
Solução
Orientador(a)

Hey @JoeBurchard , the code you pasted looks fine for returning an output, so when HubSpot says def_amount is not defined, it’s usually not complaining about your math. It’s complaining about a mismatch between what HubSpot thinks the output is called and what your code returns.

 

In custom code actions, the output field “name” is not your deal property label and it’s not the display name you see in the UI. HubSpot uses the output field’s internal name, and it has to match the key you return in outputFields exactly (including case, no spaces).

 

So double check the output definition in the action: if the output is actually def_amount_1, def_amount__c, or has a trailing space, returning { def_amount: sum } will throw weird “not defined” style errors even though your JS object is valid. This is the doc section that describes the output contract (https://developers.hubspot.com/docs/api-reference/automation-actions-v4-v4/custom-code-actions )

 

One more gotcha: you named the deal property <def_amount> in your post. If you literally used angle brackets anywhere (property name, output name, or mapping), HubSpot will sanitize the internal name and it won’t be what you expect. The safe path is: confirm the deal property internal name in settings, then confirm the custom code action output internal name, then make them match exactly.

 

Small debugging tip: change your catch to catch (e) { console.log(e); return { outputFields: { def_amount: 0 } }; } so you can see the real runtime error in the test output.

Quick question: is the error happening in the custom code action test run, or only when you map the output to the deal property afterward? That determines whether it’s an output-name mismatch or a mapping issue.

Did my answer help? Please mark it as a solution to help others find it too.

Ruben Burdin Ruben Burdin
HubSpot Advisor
Founder @ Stacksync
Real-Time Data Sync between any CRM and Database
Stacksync Banner

Exibir solução no post original

3 Respostas 3
RubenBurdin
Solução
Orientador(a)

Hey @JoeBurchard , the code you pasted looks fine for returning an output, so when HubSpot says def_amount is not defined, it’s usually not complaining about your math. It’s complaining about a mismatch between what HubSpot thinks the output is called and what your code returns.

 

In custom code actions, the output field “name” is not your deal property label and it’s not the display name you see in the UI. HubSpot uses the output field’s internal name, and it has to match the key you return in outputFields exactly (including case, no spaces).

 

So double check the output definition in the action: if the output is actually def_amount_1, def_amount__c, or has a trailing space, returning { def_amount: sum } will throw weird “not defined” style errors even though your JS object is valid. This is the doc section that describes the output contract (https://developers.hubspot.com/docs/api-reference/automation-actions-v4-v4/custom-code-actions )

 

One more gotcha: you named the deal property <def_amount> in your post. If you literally used angle brackets anywhere (property name, output name, or mapping), HubSpot will sanitize the internal name and it won’t be what you expect. The safe path is: confirm the deal property internal name in settings, then confirm the custom code action output internal name, then make them match exactly.

 

Small debugging tip: change your catch to catch (e) { console.log(e); return { outputFields: { def_amount: 0 } }; } so you can see the real runtime error in the test output.

Quick question: is the error happening in the custom code action test run, or only when you map the output to the deal property afterward? That determines whether it’s an output-name mismatch or a mapping issue.

Did my answer help? Please mark it as a solution to help others find it too.

Ruben Burdin Ruben Burdin
HubSpot Advisor
Founder @ Stacksync
Real-Time Data Sync between any CRM and Database
Stacksync Banner
JoeBurchard
Top colaborador(a) | Parceiro Elite
Top colaborador(a) | Parceiro Elite

Below is an image of the output
Screenshot 2025-08-20 155916.png

0 Avaliação positiva
KareemT
Solução
Participante | Parceiro Ouro
Participante | Parceiro Ouro

Hey @JoeBurchard 

I'm not a developer myself, I wish I could help with the code 😄 

But, have you tried a rollup field instead of a code? That seems to be a much easier solution. Should look like this on the deal level.

While you can't add line item name as a condition (which I find weird), perhaps if you scroll through the options available, you'll find a fit identifier or even create a custom identifier.

KareemT_0-1756317518014.png

 

Did my post help answer your query? Help the community by marking it as a solution.

Need HubSpot assistance? Let's discuss your challenges to get started.
0 Avaliação positiva