Every user-event and client script deployed against Sales Order, Invoice, and Vendor Bill, attributed to its owning provider, with active/disabled state and event scope resolved from live deployment metadata. The question: how many independent providers' scripts fire when a user saves one of these records — and does any record type exceed 3 active user-event scripts? Third volume in the customization-governance series (Footprint Map · Concept Sweep · this).
All three core transaction types are flagged: Sales Order carries 6 active user-event scripts, Invoice 7, Vendor Bill 6 — every one past the 3-script threshold. Between five and six independent provider families fire on each record. Three "monolith" script pairs (USR, STE, LRC — one UE + one client script each) deploy across all three record types, so a regression in any of them hits the entire order-to-cash and procure-to-pay surface at once.
customscript_usr_ue_transaction,
customscript_ste_ue_transaction, and customscript_lrc_field_manager_ue (plus their
client-script twins) each deploy against Sales Order, Invoice, AND Vendor Bill. One bad change → three
broken transaction types. Two of the three families (USR, LRC) have no confirmed owner.scriptedrecord → "Invalid search type"). This report resolves who fires, not
in what order — §04 gives the click-path to capture the authoritative sequence.Active script counts per record type, split by script type, with the effective save-path depth (event-scoped scripts removed) and distinct provider families. Computed from the deployment array at render time.
| Record type | Active UE | Save-path UE† | Active Client | Disabled | Provider families | Flag (>3 UE) |
|---|
† Active UE scripts that fire on create/edit saves — excludes the DELETE-scoped NAW deployment. Every UE script here declares no event-type restriction unless badged.
Each card lists the full stack — user-event lane, then client lane. Rows are ordered by script internal id (creation order — a weak proxy only; see §04). Disabled deployments are dimmed: they don't fire today, but one checkbox re-arms them.
scriptedrecord returns "Invalid search type" in this account.scriptdeployment.id looks like an ordering key but is a
per-script sequence number (multiple rows share id 1) — the globally unique key is
primarykey, and neither encodes execution order. Do not sort stacks by either and call it
execution order.customscript_usr_ue_transaction + _cs_), STE
(customscript_ste_ue_transaction + _cs_), and LRC Field Manager
(customscript_lrc_field_manager_ue + _cs) are single scripts with per-record
deployments on all three types. Single point of failure across the transactional core; STE is at least
a known bundle (SuiteTax) — USR and LRC are not confirmed.script.owner is no help — it records the installing user
(Kathryn Glass for 17 of 20 scripts, Ryan Rote for the SCM trio), not the vendor. Three unattributed
script families executing on every core-transaction event is a governance hole: nobody can say what
they do, who patches them, or whether they can be retired. (NAW also owns the unattributed
custentity_naw_trans_need_approval field from the Footprint Map.)customscript_2663_payment_info_ue — deployments present but
disabled on Invoice + Vendor Bill) and SS2 (customscript_15486_payment_info_ue —
active on both). Exactly the pattern of the DD-file-format field duplicate from the Concept Sweep: two
bundle generations, one concept. The SS1 deployments are latent re-enable hazards.scriptnote
query — including shapes previously verified in this account — returned "An unexpected SuiteScript
error". Whether the stacked scripts are actually erroring is unknown from this run; the
script-telemetry-review process (or the scripting tool group's log reader) is the follow-up
path. The account field notes claiming scriptnote is queryable need a recheck.Open Customization > Scripting > Scripted Records for salesorder, invoice, and vendorbill; record (screenshot or export) the UE sequence for each. This is the one fact this report cannot supply, and it's the fact that determines who wins when two scripts write the same field. Store it beside this report as the baseline.
Three families, six active deployments each way, zero confirmed ownership. Check bundle association
on the script records (the Scripts list UI shows "From Bundle"), read the source file headers
(usr_ue_transaction.js, lrcfm_user_event.js, WD_NAW_UE_deleteExceptions.js),
and interview. The WD_ file prefix on NAW/SCM files suggests a common implementation partner.
The two EBP SS1 payment-hider deployments (superseded by SS2), customdeploy_atb_ue_salesorder,
and customdeploy_packship_ue_nonadvinvt are disabled-but-present. A disabled deployment is
one checkbox from re-arming — either remove them (bundle-update-safe: document instead if bundle-owned)
or annotate why they're kept.
F7 blocked error-rate evidence. Run the account's script-telemetry-review process against
the 12 active UE scripts on these records — error counts, governance usage, execution time — to convert
"stacking risk" from structural to measured.
New UE deployments should declare event types (the NAW DELETE scoping is the good example already in-account). It costs nothing and keeps the effective stack visible to admins without reading source.
SELECT * FROM scriptdeployment FETCH FIRST 1 ROWS ONLY
established the exposed columns: recordtype (plain uppercase names), status,
isdeployed, eventtype, executioncontext, and the
id-vs-primarykey split.SALESORDER, INVOICE, VENDORBILL) and gave account-wide stack
counts for context.script
(type, inactive flag, owner) and file (source filename). 38 rows. A first attempt included
executioncontext — dropped on re-query because every deployment carries the full ~35-context
list, bloating output with zero signal.status='RELEASED' AND isdeployed='T' AND script not inactive.
All 38 rows are RELEASED and no script is inactive, so the discriminator here is isdeployed
(34 T / 4 F).ste_ SuiteTax, scm_ SCM bundle,
2663_/15486_ EBP generations, packship_ Ship Central,
rac_/atb_ local-uncertain, usr_/lrc_/naw_
unattributed. script.owner was pulled and rejected as an attribution source (it's the
installing user).scriptedrecord probed and found not SQL-exposed; the
scriptdeployment.id per-script-sequence trap verified (multiple rows share id=1) and
documented; listing order fell back to script internal id, labeled as creation order.scriptnote query shapes (grouped, filtered, plain
recent-rows) all returned "An unexpected SuiteScript error" — recorded as F7 rather than silently
omitted.SELECT * FROM scriptdeployment FETCH FIRST 1 ROWS ONLY
SELECT sd.recordtype, s.scripttype, COUNT(*) AS n FROM scriptdeployment sd JOIN script s ON s.id = sd.script WHERE s.scripttype IN ('USEREVENT','CLIENT') GROUP BY sd.recordtype, s.scripttype ORDER BY COUNT(*) DESC -- recordtype = plain uppercase names (SALESORDER, INVOICE, VENDORBILL)
SELECT sd.recordtype, s.scripttype, s.name AS script_name, s.scriptid AS script_sid, sd.scriptid AS deploy_sid, sd.status, sd.isdeployed, sd.eventtype, s.isinactive, f.name AS filename FROM scriptdeployment sd JOIN script s ON s.id = sd.script LEFT JOIN file f ON f.id = s.scriptfile WHERE sd.recordtype IN ('SALESORDER','INVOICE','VENDORBILL') AND s.scripttype IN ('USEREVENT','CLIENT') ORDER BY sd.recordtype, s.scripttype, s.name -- → 38 rows; active = isdeployed='T' (all RELEASED, no inactive scripts)
-- scriptdeployment.id is PER-SCRIPT sequence, not global (many rows share id=1): SELECT sd.id, sd.recordtype, sd.scriptid FROM scriptdeployment sd JOIN script s ON s.id = sd.script WHERE sd.recordtype = 'SALESORDER' AND s.scripttype = 'USEREVENT' -- global unique key = primarykey; NEITHER encodes execution order. -- Execution order lives on the Scripted Records page only: -- scriptedrecord → "Invalid search type" (not SQL-exposed)
SELECT s.id, s.scriptid, s.name, s.owner, e.entityid AS owner_name FROM script s LEFT JOIN employee e ON e.id = s.owner WHERE s.scriptid IN ('...the 20 scripts...') ORDER BY s.id -- → owner = installing user (17× one admin, 3× another), NOT the vendor. -- Attribution must come from scriptid prefixes + bundle records.
SELECT s.scriptid, COUNT(*) FROM scriptnote sn JOIN script s ON s.id = sn.script WHERE sn.type = 'ERROR' AND s.scriptid IN (...) GROUP BY s.scriptid -- → "An unexpected SuiteScript error" on this and two simpler shapes. -- Follow-up path: script-telemetry-review process / scripting tool group.
recordtype exactly matching the three types.
Scripts touching these records indirectly (scheduled/MR scripts loading SOs, workflows, Suitelets
transforming records) are out of scope — this is the event-time stack only. Workflows in
particular can add save-time logic and were not enumerated.script.owner rejected as evidence.eventtype restrictions. Scripts that
self-filter in code still count in the save-path stack — from the platform's perspective they load and
execute.