Oracle ERP and NetSuite
Oracle owns two very different ERP worlds: the enterprise suites (Fusion, EBS, JDE, PeopleSoft) and the cloud-native mid-market product (NetSuite). Different stacks, different job markets.
Oracle Fusion Cloud ERP
Oracle’s modern SaaS suite, and the main competitor to SAP S/4HANA in large enterprise.
Modules
Financials, Procurement, Project Portfolio Management, Risk Management, Supply Chain (SCM), Manufacturing, Maintenance, HCM (a separate but tightly linked suite), EPM (planning and consolidation).
Developer surface
| Tool | Purpose |
|---|---|
| BI Publisher | Reports and printed documents. XML data model + RTF/Excel/eText templates |
| OTBI | Oracle Transactional BI — self-service analytics over subject areas |
| FBDI | File-Based Data Import — the CSV/Excel bulk load mechanism. You will use this constantly |
| ADFdi | Excel add-in for desktop data entry |
| REST APIs | The modern integration surface, per business object |
| SOAP web services | Legacy but still used |
| OIC | Oracle Integration Cloud — the iPaaS |
| VBCS | Visual Builder Cloud Service — extension UIs |
| Groovy scripting | Business rules and object functions in Application Composer |
| Application Composer | No-code/low-code object and field extension |
| Sandboxes | Where extensions are developed and published |
| Fast Formula | Rules language, especially in HCM/Payroll |
Key constraint: no direct database access in Fusion Cloud. You cannot write PL/SQL against the schema. Everything goes through BI Publisher, REST, or FBDI. This is a large adjustment for developers coming from EBS.
Extension model
Configure → Application Composer (fields, objects, rules) → sandbox → publish
Reports → BI Publisher / OTBI
Integrate → REST + OIC
UI → VBCS or Redwood extensions
Oracle E-Business Suite (EBS)
The legacy on-prem giant. Still an enormous install base, still hiring.
Developer stack
- PL/SQL — the primary language; business logic lives in packages
- Oracle Forms / Reports — the classic UI (being replaced)
- Oracle APEX — modern web development on the same database
- XML/BI Publisher — reports and documents
- Workflow Builder — approvals
- Concurrent programs — the batch job framework
- Open Interface tables and APIs — the sanctioned data-load path
Key concepts
| Concept | Meaning |
|---|---|
| Multi-Org (MOAC) | Operating units within one instance, with policy-based data access |
| Responsibility | The security and menu container assigned to users |
| Concurrent program | A scheduled/submitted batch job |
| Interface tables | Staging tables you insert into; a standard import program validates and loads |
| Flexfields | Key flexfields (the account code structure) and descriptive flexfields (custom fields) |
| CUSTOM.pll | The sanctioned Forms personalisation hook |
Flexfields deserve attention. The Accounting Flexfield defines the chart of accounts structure (company-department-account-product-intercompany segments). It’s Oracle’s dimension model and it’s everywhere in EBS reporting.
Never write directly to base tables. Use the public APIs or the interface tables. Direct inserts skip validation and business logic and will corrupt data — this is the number one EBS developer sin.
JD Edwards and PeopleSoft
Acquired products, still maintained, still with meaningful install bases.
JD Edwards EnterpriseOne — strong in manufacturing and distribution, mid-market to large. Development in the proprietary toolset (Object Management Workbench, event rules, business functions in C), with Orchestrator for modern integration and IoT.
PeopleSoft — dominant in HR and higher education/public sector. PeopleTools, PeopleCode, Application Engine, Integration Broker, Component Interfaces.
Both are niches with less competition and steady demand from customers who aren’t moving.
NetSuite
Oracle’s cloud-native mid-market ERP. Founded 1998 (before “SaaS” was a word), acquired 2016, run largely independently. The best-documented, most developer-friendly of the mainstream ERPs.
Why developers like it
- Truly multi-tenant SaaS from the start
- JavaScript, not a proprietary language
- Excellent documentation and a genuine developer community
- Free developer accounts
- A real IDE experience (VS Code with the SuiteCloud extension)
- SuiteQL gives you SQL-like querying
The SuiteCloud platform
| Component | Purpose |
|---|---|
| SuiteScript 2.1 | JavaScript (ES2019+) for server and client logic |
| SuiteQL | SQL-like queries against NetSuite records |
| SuiteTalk | SOAP and REST web services |
| SuiteFlow | Point-and-click workflow builder |
| SuiteBuilder | Custom records, fields, forms — no code |
| SuiteBundler | Package and deploy customisations between accounts |
| SDF | SuiteCloud Development Framework — file-based projects, source control, CI/CD |
| SuiteAnalytics | Saved searches, datasets, workbooks |
SuiteScript types
| Type | Runs when |
|---|---|
| User Event | Before/after a record is submitted — the main server-side hook |
| Client | In the browser: field changes, validation, sublist events |
| Scheduled | On a schedule |
| Map/Reduce | Large-volume processing with governance-aware chunking |
| Suitelet | Custom pages and endpoints |
| RESTlet | Custom REST APIs |
| Portlet | Dashboard components |
| Mass Update | Bulk record updates |
| Workflow Action | Called from SuiteFlow |
/**
* @NApiVersion 2.1
* @NScriptType UserEventScript
*/
define(['N/record', 'N/query'], (record, query) => {
const beforeSubmit = (context) => {
if (context.type !== context.UserEventType.CREATE) return;
const so = context.newRecord;
const customerId = so.getValue({ fieldId: 'entity' });
const results = query.runSuiteQL({
query: `SELECT SUM(amount) AS total
FROM transaction
WHERE entity = ? AND status = 'Open'`,
params: [customerId]
}).asMappedResults();
const exposure = results[0]?.total || 0;
if (exposure > 500000) {
so.setValue({ fieldId: 'custbody_credit_review', value: true });
}
};
return { beforeSubmit };
});
Governance — the thing that catches everyone
NetSuite meters script execution in governance units:
record.load() 10 units
record.save() 20 units
search.run() 10 units
query.runSuiteQL() 10 units
User Event script budget: 1,000 units
Scheduled script budget: 10,000 units
Map/Reduce: 10,000 units per stage, with yielding
Exceed it and the script is terminated mid-execution. This is why Map/Reduce scripts exist — they checkpoint and reschedule automatically. Any bulk operation over a few hundred records must be Map/Reduce, not a scheduled script with a loop.
Governance discipline is the defining NetSuite skill: batch your operations, use search/SuiteQL instead of loading records, use record.submitFields() (10 units) instead of load-modify-save (30 units) when updating a few fields.
Learning path
1. Free developer account + SuiteAnswers (the knowledge base)
2. Record types, fields, and the data model
3. Saved searches and SuiteQL
4. SuiteScript 2.1: User Event and Client scripts
5. Governance and Map/Reduce
6. Suitelets and RESTlets
7. SDF, source control, and CI/CD
8. SuiteBundles and deployment across accounts
3–6 months to productive if you already know JavaScript. By far the fastest ramp of the major ERPs.
Certifications
- SuiteFoundation (the baseline)
- NetSuite Certified Developer
- Administrator, ERP Consultant, SuiteAnalytics
Choosing between them
| If you want | Pick |
|---|---|
| Large enterprise, public sector, high rates, Oracle shops | Fusion Cloud or EBS |
| Deep PL/SQL and database work | EBS |
| JavaScript, fast ramp, mid-market, US-heavy | NetSuite |
| A niche with less competition | JD Edwards or PeopleSoft |
| HR/higher education specialisation | PeopleSoft |