What you’ll need
NetSuite administrator access, to enable features, create an integration record, set up a role, and upload the certificate.Enable the required features
Go to Setup → Company → Enable Features → SuiteCloud. Enable Client SuiteScript, Server SuiteScript, REST Web Services, and OAuth 2.0, accept the SuiteCloud terms, then save.
Enable Features → SuiteCloud. All four must be checked before you save.
Create the integration record
Go to Setup → Integration → Manage Integrations → New. Name it (for example “Elastly”), set State to Enabled, then check the following:- Client Credentials (Machine to Machine) Grant: required for M2M
- REST Web Services: required for SuiteTalk REST
- Leave Authorization Code Grant unchecked

The integration record. Client ID appears once, right after you save.
Create a role for the integration
A role in NetSuite is a named bundle of permissions you attach to a user, and it decides what that login is allowed to read. Elastly logs in as a user, and that user’s role determines what Elastly can pull. Create a new, dedicated role for this. Don’t reuse Administrator or another built-in role. Built-in roles are locked, which is also why the OAuth permission won’t appear when you try to add it to them.Create the role
Elastly Integration.Add the Setup permissions
Add the Reports permission
Add the Lists permissions
Add your custom records
- Most custom records are set to Use Permission List and don’t appear on the role at all. Go
to Customization → Lists, Records, & Fields → Record Types, open the record, and on its
Permissions sub-tab add the
Elastly Integrationrole at View. - If the record does appear on the role’s Permissions → Custom Record sub-tab, add it there at View instead.
Add the Transactions permissions
Save and assign the role to a user
Elastly Integration role. Elastly signs in as this user, so if the role isn’t attached here the
token request fails. You’ll select this same user and role in the certificate step below.OneWorld accounts: grant the subsidiaries
OneWorld accounts: grant the subsidiaries
If you don't see a permission in the list
If you don't see a permission in the list
Turning on price write-back later
Turning on price write-back later
Generate the certificate in Elastly
In Elastly, open Integrations → Connect → Oracle NetSuite and click Generate & Download. Elastly creates the key pair and downloads a public certificate file,elastly-netsuite.pem. This is
a public X.509 certificate (RSA-3072), never a .p12. A .p12 would contain the private key, which
always stays inside Elastly.
Upload the certificate in NetSuite
Go to Setup → Integration → Manage Authentication → OAuth 2.0 Client Credentials (M2M) Setup and click Create New. (The administrator doing this needs the OAuth 2.0 Authorized Applications Management permission; a full Administrator role already has it.) Fill in:- Entity: the user the integration runs as
- Role: the role you configured above
- Application: the integration record (“Elastly”)
- Certificate: upload
elastly-netsuite.pem

M2M setup: entity, role, application, and the public certificate. Certificate ID appears after saving.
Sandbox accounts are isolated
Sandbox accounts are isolated
Renewing the certificate (every two years)
Renewing the certificate (every two years)
Find your Account ID
Your Account ID is under Setup → Company → Company Information (also the subdomain prefix of your NetSuite URL). Production looks like1234567; sandbox looks like 1234567_SB1.
Finish in Elastly
Back in the Elastly connect dialog, enter your Account ID, Client ID, and Certificate ID, then click Connect to NetSuite. There’s no redirect or authorize step: Elastly requests an access token to verify the setup and starts your first sync.
The three values go into Elastly's connect dialog. Click Connect and the first sync starts.
See Elastly’s price live inside NetSuite
Everything above sets up the read-only sync that feeds Elastly. The integration can also run the other way: a small script inside NetSuite asks Elastly for the recommended price the moment a line is added to an Estimate, and shows it on the line as an advisory column (the Elastly Rate and its reason) right next to the native rate. Your reps keep working entirely in NetSuite and see Elastly’s number against their own. Elastly never overwrites the rate. The rep decides. This is optional, and it reuses everything the sync already taught Elastly: a line seen live in NetSuite carries the same explainable price the Elastly dashboard would show. Set it up once the first sync has finished. It fails open by design: if Elastly is ever slow or unreachable, the advisory columns simply stay empty and quoting is never blocked. Two scripts do the work. A Suitelet runs on the NetSuite server and holds the only connection to Elastly. A Client Script runs in the rep’s browser and only ever talks to that Suitelet. Your Elastly API key lives in a NetSuite API Secret that only the Suitelet can read, so it never reaches a browser. The Suitelet runs as the logged-in user, so it looks up the customer under that user’s own role, and it tells Elastly which NetSuite employee and role asked. That is what lets Elastly scope a rep to the customers they own.Before you start
You need a NetSuite administrator, or a custom role with these permissions:src/FileCabinet/SuiteScripts/elastly/ holds the two files you upload:
elastly_price_ue.js and elastly_apply_cs.js. They belong to the Apply
feature, which Elastly turns on per workspace. Leave them out of this install.
suitecloud project:deploy creates the line fields, both scripts, their deployments
and the empty API Secret in one go. You still set the secret’s value and its script restriction by
hand, and you check the Suitelet deployment’s Execute As Role after the deploy.Create a Sales rep API key in Elastly
In Elastly, go to Settings → API keys and press Create key. Choose the ERP scope, then the Sales rep view. Pick an expiry, name the key (for exampleNetSuite production), and press Create key. Copy it now. The full key is shown once.
The Sales rep view returns the price without margins or minimums. That is all the NetSuite scripts
need, and it keeps cost and margin out of NetSuite entirely.
Add the Elastly line fields
Elastly shows its recommendation on the line through five custom line fields. You only need them if you want Elastly’s price, reason, and status visible on NetSuite quote lines. Quotes you build in Elastly and push to NetSuite work without them: Elastly fills in only the fields your account has. If you want them, create all five now, before the scripts, so they have somewhere to write. NetSuite has no way to import a custom field from a file through the UI, so you create them yourself.Open Transaction Line Fields
Set the label, type, and ID
_elastly_rate). NetSuite adds the prefix
custcol for you, with no underscore of its own, so it saves as custcol_elastly_rate. Drop the
leading underscore and you get custcolelastly_rate, which the script can’t read and nothing warns
you about.Set Applies To
Set the display type
Save, then repeat for all five
Upload the Suitelet
Go to Customization → Scripting → Scripts → New and uploadelastly_price_sl.js. NetSuite reads
the script type and the onRequest entry point from the file. On the script record, set:
Upload the Client Script
Back in Customization → Scripting → Scripts → New, uploadelastly_price_cs.js. On the script
record, set:
Create the API Secret
Go to Setup → Company → Preferences → API Secrets and press Create New.custsecret, so type the leading underscore
yourself. The Suitelet reads the secret as custsecret_elastly_api_key and nothing else can.
401 in the Suitelet’s log right after you save the secret, wait and test
again before you change anything.Deploy the Suitelet
Open the Elastly Price Proxy script record, go to Deployments, and add one:Deploy the Client Script
Open the Elastly Pricing script record, go to Deployments, and add one on Estimate:Test it
Open a new Estimate (or your account’s renamed equivalent), choose a customer, and add an item: the Elastly Rate column should populate with Elastly’s recommendation within a moment. Change the quantity and it updates. Open an existing Estimate in edit mode and every line gets priced on load. The native rate stays exactly as NetSuite set it. Elastly only advises. Back in Elastly, the key’s row under Settings → API keys now shows a used date.If the Elastly Rate doesn't appear, work through this in order
If the Elastly Rate doesn't appear, work through this in order
- Open the browser console (F12) before you test. The Client Script runs in the browser. A
load-time error (bad upload, corrupted file) shows up here and nowhere else. An entry titled
Elastly request failed means the browser could not reach the Suitelet: the Suitelet’s script
or deployment ID is not exactly
customscript_elastly_price_sl/customdeploy_elastly_price_sl, its deployment is not Released, or the tester’s role is outside its Audience. - Check the Suitelet deployment’s Execution Log. This is where the server side reports.
Elastly request failed here means the call to Elastly itself failed: the secret is not
readable by this script (check Restrict to Scripts), the domain restriction does not include
app.elastly.io, or the key is revoked or expired (Elastly answers401). - Confirm the Suitelet’s base URL.
custscript_elastly_base_urlmust have a value on the deployment, starting withhttps://and with no trailing slash. Without it the Suitelet answersnot_configuredand writes nothing. - Confirm the API Secret ID is exactly
custsecret_elastly_api_key, not doubled and not missing its underscore, and that it has a value. - Confirm both deployments’ Audience includes your test user’s role. Released status doesn’t matter if the tester isn’t in the Audience list.
- Confirm the Suitelet deployment runs as Current User with Available Without Login unchecked. A Suitelet set to run as a fixed role prices under that role’s view of customers, not the rep’s.
- Confirm Page Init, Post Sourcing, and Field Changed are checked on the Client Script record, matching the table above.
- Check the record itself. The Client Script only asks for a price once the Estimate has a
customer, a currency, and an item with a positive quantity. A customer the tester’s role cannot
see returns
customer_not_visiblein the Suitelet log and no price. A currency whose ISO code Elastly does not have returnscurrency_unavailable. - Isolate Elastly’s script from client scripts in general. Does any other client script you run still work on this record? If yes, the problem is scoped to Elastly’s script. If nothing runs at all, something account- or role-wide is blocking client scripts, a bigger issue than this integration.
Upgrading from the older script
Earlier installs used a single Client Script,elastly_estimate_pricing_cs.js, with the Elastly key
in a script parameter named custscript_elastly_api_key. That put the key in every rep’s browser.
Elastly now marks such keys Exposed under Settings → API keys and expires them 30 days after
the flag is set, so move before then.
Install the new scripts
_elastly_floor_status); the other four already exist. Create the new key
rather than reusing the old one: the old key is a Full-view key, and the Suitelet should carry a
Sales rep key.Test the new install
Retire the old script
custscript_elastly_api_key) and uncheck Deployed. Then delete the old script record, which
removes its parameters and deployments.Revoke the old key in Elastly