NS Admin Lab

Rodolfo Guerra · Especialista NetSuite

Lo que aprendo administrando NetSuite, explicado sin rodeos.

Llevo 7 años trabajando con NetSuite todos los días. Aquí comparto notas prácticas de desarrollo, consultas y administración: lo que funciona y los errores que conviene evitar.

Sobre mí

Soy Rodolfo Guerra. Empecé administrando NetSuite en una empresa de servicios y hoy lidero el producto NetSuite de una empresa con varias subsidiarias.

Mi trabajo está entre el negocio y el sistema. Escucho qué necesita un área, lo traduzco a configuración o a código, y me aseguro de que siga funcionando cuando el volumen crece.

Creé este laboratorio para ordenar lo que aprendo y compartirlo. Cada nota sale de un caso real.

7 añosadministrando NetSuite
2.xSuiteScript: Map/Reduce, Suitelets, User Events, RESTlets
SuiteQLconsultas y reportes a medida

Áreas de trabajo

En qué me enfoco día a día.

Desarrollo

SuiteScript 2.x

Automatizaciones que aguantan volumen.

  • Map/Reduce y Scheduled
  • Suitelets y Client Scripts
  • User Events y validaciones
Datos

SuiteQL y reportes

Respuestas claras a partir de los datos.

  • Consultas a medida
  • Búsquedas guardadas
  • Análisis de pendientes
Operación

Administración

Un sistema ordenado y seguro.

  • Roles, formularios y workflows
  • Cargas masivas por CSV
  • Integraciones REST sin duplicados

Laboratorio

Notas cortas, cada una basada en un caso real. Ábrelas para ver el detalle.

SuiteScript

Funcionaba bien… hasta que creció el volumen

Un Scheduled Script que procesa todo en una sola ejecución va bien con pocos registros. Cuando el volumen crece, empiezan los problemas.

Scheduled Script

  • Una sola ejecución, con un límite de 10,000 unidades de gobernanza.
  • Si se acaban las unidades, se detiene a medias.

Map/Reduce

  • Trabaja por etapas: getInputData, map, reduce y summarize.
  • Procesa un registro a la vez: un error no frena al resto.
  • En summarize revisas qué falló y por qué.

Regla práctica: Scheduled para tareas cortas y de volumen predecible. Map/Reduce para muchos registros o volumen que crece. Si dudas, empieza en Map/Reduce.

Finanzas

Pagar a proveedores no debería tomar una tarde

Antes: el mismo pago se digitaba en NetSuite, en la banca, en un Excel y en un correo al proveedor. Cuatro lugares, cuatro oportunidades de error.

Después: un solo flujo en NetSuite

  1. Seleccionas las facturas a pagar dentro de NetSuite.
  2. NetSuite genera el archivo del banco con la plantilla de pago de tu banco.
  3. Haces una sola carga en el banco, en lugar de una transferencia por pago.
  4. El pago queda registrado contra cada factura.
  5. El proveedor recibe su aviso por correo.

Ojo: no todo viene de base. Con la SuiteApp Electronic Bank Payments tienes las plantillas estándar de tu país, aprobación por lotes y reversiones. Necesitan la licencia de Electronic Bank Payments: plantillas a medida, el procesamiento automático de facturas, multimoneda, APIs y el procesamiento en paralelo (este último, además, con SuiteCloud Plus).

Cargas CSV

5 errores que arruinan una carga de clientes

ErrorQué pasaCómo evitarlo
Sin External IDRecargar duplica todoModo «Agregar o actualizar» + External ID
Listas que no coinciden«Contado» ≠ «Contado - 0 días»Texto idéntico al de NetSuite
Fechas en otro formatoFechas rechazadas o mal leídasEl formato de fecha de tu usuario
Tildes y eñes rotas«Perú» en vez de «Perú»Archivo y carga en UTF-8
Probar con todo el archivo500 registros por corregirPrimero 5 filas, luego el resto

Extra: guarda el mapeo. La siguiente carga toma minutos.

Buenas prácticas

El sandbox no es opcional

Un cambio “pequeño” en producción puede romper:

  • Un workflow que se dispara en otro registro.
  • Un script que depende de ese campo.
  • Una integración que espera el formato anterior.

La regla

  1. Sandbox primero: todo cambio se prueba ahí.
  2. Datos reales: copiados de producción.
  3. Pase fuera de horario: con forma de revertirlo.

Cuesta un día más. Un error en producción cuesta varios.

Integraciones

El mismo pedido, dos órdenes

Un sistema externo envía el pedido A-1042 y NetSuite crea la orden. La respuesta no llega por un corte de red. El sistema reintenta… y sin protección, se crea una segunda orden.

La solución es que reintentar sea seguro (idempotencia). Usa el identificador del sistema externo como External ID: NetSuite no permite dos registros del mismo tipo con el mismo External ID.

// RESTlet (SuiteScript 2.1): buscar antes de crear
const previo = query.runSuiteQL({
  query: 'SELECT id FROM transaction WHERE externalid = ?',
  params: [payload.pedidoId]
}).asMappedResults()[0];

if (previo) return { id: previo.id, duplicado: true };

const orden = record.create({ type: record.Type.SALES_ORDER });
orden.setValue({ fieldId: 'externalid', value: payload.pedidoId });

Si el pedido ya existe, devuelves la misma orden. El External ID es la segunda barrera: aunque dos peticiones lleguen a la vez, NetSuite rechaza el duplicado.

SuiteQL

Nombres legibles en SuiteQL, sin JOIN extra

BUILTIN.DF convierte un ID en el texto que ves en pantalla: el nombre del cliente, del vendedor o de la ubicación.

SELECT
  t.tranid AS pedido,
  BUILTIN.DF(t.entity)    AS cliente,
  BUILTIN.DF(t.employee)  AS vendedor,
  BUILTIN.DF(tl.location) AS ubicacion
FROM transaction t
JOIN transactionline tl
  ON tl.transaction = t.id
WHERE t.type = 'SalesOrd'
  AND tl.mainline = 'T'
  AND t.status IN ('E', 'F')

Para mostrar, no para filtrar. En el WHERE usa siempre el ID o el código: es más eficiente y no depende de cómo se escribe el texto.

Conversemos

Si trabajas con NetSuite y quieres comentar alguna de estas notas, escríbeme por LinkedIn.

Ir a mi LinkedIn ↗