Transaction Forms
Transaction forms define how users interact with sales orders, invoices, purchase orders, and other business documents. Good form design improves data entry efficiency, reduces errors, and enforces business rules.
Transaction Form Fundamentals
Each transaction type (Sales Order, Invoice, Purchase Order, etc.) can have multiple custom forms. Users select forms based on their role, transaction type, or business scenario.
Form Customization Scope
| Element | Can Customize | Notes |
|---|---|---|
| Field Visibility | Yes | Show, hide, or make mandatory per form |
| Field Position | Yes | Drag fields to different positions on form |
| Field Labels | Yes | Rename fields to match business terminology |
| Subtabs | Yes | Add, remove, rename, reorder tabs |
| Sublist Columns | Yes | Show/hide columns, set widths, reorder |
| Default Values | Yes | Set field defaults for new records |
| Linked Forms | Yes | PDF/email templates used when printing/emailing |
Why Custom Transaction Forms?
Creating Custom Transaction Forms
Start from Standard
Navigate to Customization > Forms > Transaction Forms, find the standard form for your transaction type, and click Customize.
Name Your Form
Use clear naming conventions: "[Transaction Type] - [Purpose] - [Audience]" e.g., "Sales Order - Standard - Sales Rep"
Configure Fields
Use Screen Fields tab to show/hide fields, set mandatory flags, change labels. Focus on essential fields for the use case.
Organize Subtabs
Group related fields, hide unused tabs, add custom tabs for specialized content.
Configure Line Items
Show relevant columns, hide unnecessary ones, set column widths. Consider user workflow when ordering columns.
Link Print/Email Templates
Set the PDF template for printing and email template for sending. Can vary by role or form.
Role-Based Form Assignment
Assign different forms to different roles to streamline their experience.
| Role | Form Type | Focus |
|---|---|---|
| Sales Rep | Sales Order - Sales | Customer info, pricing, quick entry |
| Warehouse | Sales Order - Fulfillment | Ship-to, items, quantities, shipping |
| Finance | Sales Order - Finance | Revenue recognition, payment terms, approvals |
| Customer Service | Sales Order - CS | Order status, tracking, notes |
One Form vs. Many Forms
Form Assignment Methods
Control which forms are available to which users through role restrictions and preferred form settings.
Form Assignment Methods
Mandatory Fields Strategy
Making fields mandatory enforces data quality but can frustrate users if overdone.
Mandatory vs. Workflow Validation
| Approach | When to Use | Example |
|---|---|---|
| Form Mandatory | Data absolutely required at creation | Customer, Date |
| Workflow Validation | Data required before specific action | PO# before approval |
| Script Validation | Complex conditional requirements | If Amount > $10K, require Manager field |
Form Layout and Tabs
NetSuite transaction forms organize fields into tabs and subtabs. Customize which tabs appear and their order to create an intuitive flow.
Standard Transaction Tabs
- Primary Information: Main header fields (customer, date, status)
- Items: Line item sublist
- Shipping: Ship-to address and shipping method
- Billing: Bill-to address and payment terms
- Accounting: GL impact, posting period
- Communication: Notes, messages, attached files
- Custom: Custom fields grouped into custom tabs
Field Configuration
Each field on a transaction form has multiple configuration options that control its behavior and appearance.
Field Display Options
- Label: Change the field label displayed to users
- Help: Add field-level help text (appears on hover)
- Default Value: Pre-populate field with specified value
- Display Type: Normal, Inline Text, Hidden
- Break Before: Start new column before this field
Field Sourcing and Defaults
Fields can be sourced from related records or set with defaults:
- Sourced Fields: Auto-populated from parent record (customer defaults to sales rep)
- Static Defaults: Fixed value for all new transactions
- Dynamic Defaults: Value based on user, date, or formula (requires scripting)
Print and Email Templates
Transaction forms include settings for printing and emailing. Link custom PDF templates to forms for professional document output.
Print Settings
- Linked Form: Associate Advanced PDF template for printing
- Print Button: Show/hide print button on form
- Email Button: Show/hide email button on form
- PDF Format: Portrait or landscape orientation
Transaction Form Best Practices
Design Principles
- Less is More: Show only fields users actually need
- Logical Flow: Arrange fields in the order users think about them
- Group Related Fields: Use tabs and sections to organize
- Consistent Layout: Similar transactions should have similar layouts
- Meaningful Defaults: Pre-populate wherever possible
Common Mistakes to Avoid
- Making too many fields mandatory (slows data entry)
- Creating too many forms (maintenance burden)
- Not testing forms with actual users
- Forgetting to assign forms to roles
- Not documenting customizations
Transaction Form Configuration Checklist
Entity Forms
Entity forms control the user experience for customer, vendor, employee, and other entity records. Well-designed entity forms streamline data entry while ensuring required information is captured.
Entity Form Customization
Entity forms follow similar customization principles to transaction forms but apply to master data records like customers, vendors, and employees.
Common Entity Form Types
| Entity Type | Standard Forms | Common Customizations |
|---|---|---|
| Customer | Standard Customer Form | Credit fields, sales territory, custom attributes |
| Vendor | Standard Vendor Form | 1099 fields, insurance info, compliance fields |
| Employee | Standard Employee Form | HR fields, compensation (if enabled), department |
| Contact | Standard Contact Form | Communication preferences, role indicators |
| Item | Standard Item Forms (per type) | Inventory settings, pricing, vendor info |
| Partner | Standard Partner Form | Referral and commission tracking |
| Lead/Prospect | Standard Lead Form | Pre-customer sales pipeline fields |
Creating Custom Entity Forms
Custom entity forms allow you to tailor the user experience for different roles, customer segments, or business processes.
Access Entity Forms
Navigate to the Entry Forms list and filter by entity type (Customer, Vendor, Employee, etc.).
Customize or Create New
Click "Customize" on an existing form or "New" to create from scratch. Starting from a standard form preserves default functionality.
Configure Form Properties
Set form name, link to roles, configure preferences for this form type.
Organize Tabs and Fields
Add/remove tabs, position fields, configure field properties for this form.
Customer Form Design Considerations
Customer forms are among the most frequently accessed. Design them for both quick initial creation and comprehensive ongoing management.
Customer Form Subtab Organization
| Subtab | Purpose | Key Fields |
|---|---|---|
| General | Core customer identity | Name, ID, category, status, subsidiary |
| Address | Billing and shipping locations | Default addresses, additional locations |
| Financial | AR and credit settings | Terms, credit limit, currency, price level |
| Sales | Sales team and territory | Sales rep, territory, lead source |
| Preferences | Communication and defaults | Email preference, default ship method |
| Relationships | Related records and hierarchy | Parent Company, Contacts sublist, Subcustomers |
- B2B Customer Form -- Credit terms, PO required, multiple ship-to addresses
- B2C Customer Form -- Simplified view, loyalty program fields, preferences
- Wholesale Customer Form -- Price levels, volume discounts, EDI settings
- International Customer Form -- VAT fields, incoterms, export documentation
Vendor Form Considerations
Vendor forms must balance ease of use with compliance requirements, especially for 1099 reporting.
Vendor Form Tabs
| Tab | Purpose | Key Fields |
|---|---|---|
| General | Vendor identification | Legal Name, Vendor ID, Category, Currency |
| Address | Remit-to and ordering addresses | Address Book, Default addresses |
| Financial | Payment and accounting settings | Terms, Credit Limit, Expense Account, 1099 Eligible |
| Tax Information | Tax compliance | Tax ID, W-9 Status, 1099 Type, Withholding |
| Purchasing | Order preferences | Incoterm, Lead Time, Min Order Qty |
Critical Vendor Fields
- Legal Name: Must match IRS records exactly for 1099
- Tax ID: EIN or SSN for US vendors
- 1099 Eligible: Flag for year-end reporting
- W-9 on File: Custom field to track compliance
- Payment Method: Check, ACH, wire preferences
- Banking Info: For electronic payments (secure storage)
Employee Form Security
Employee forms often contain sensitive information. Use form customization to restrict access.
Employee Form Variants
| Form Variant | Target Role | Visible Fields |
|---|---|---|
| Self-Service | Employee (own record) | Contact info, preferences, expense approver |
| Manager View | Department Managers | Above + performance, time approvals |
| HR Full Access | HR Department | All fields including compensation, SSN |
| Finance View | Payroll/Finance | Compensation, banking, tax withholdings |
Employee Data Access Strategy
Common Employee Form Tabs
| Tab | Content | Typical Access |
|---|---|---|
| General | Name, title, department, supervisor | All roles |
| Human Resources | Hire date, employment status, job history | HR, Managers |
| Compensation | Salary, pay frequency, pay rate | HR only |
| Tax Information | SSN, W-4 status, state withholding | HR only (PII) |
| Time & Expenses | Expense approval, time tracking settings | Employee, Managers |
| Direct Deposit | Bank account information | Employee (own), HR |
Contact Form Configuration
Contacts represent individual people associated with customers, vendors, or other entities.
Field Configuration on Entity Forms
| Option | Effect | Use Case |
|---|---|---|
| Show | Field visible and editable | Standard fields users need to enter |
| Mandatory | Required for save | Critical classification or compliance fields |
| Disabled | Visible but read-only | System-calculated or reference fields |
| Hidden | Not visible on form | Internal fields not needed for this form |
| Inline Text | Display only (no edit) | Static labels or calculated display values |
Address Book Configuration
The Address Book sublist on entity forms manages multiple addresses per record.
Address Configuration Options
- Default Shipping: Pre-selected on transactions
- Default Billing: Pre-selected for invoices
- Residential Flag: Affects shipping carrier rates
- Address Label: User-friendly identifier ("Main Office", "Warehouse 2")
- Attention: Contact name for deliveries
Form Assignment for Entities
| Method | Configuration | Use Case |
|---|---|---|
| Role-Based | Roles subtab on form | Different views for Sales vs. AR vs. Admin |
| Record-Specific | Custom Form field on record | Special form for specific high-value customers |
| Category-Based | Scripted assignment based on category | Different forms for B2B vs. B2C customers |
| Subsidiary-Based | Different forms per subsidiary | Regional compliance variations |
Industry-Specific Entity Form Patterns
Entity Form Best Practices
Entity Form Configuration Checklist
Sublists & Line Items
Sublists display related records and line item data on forms. Configuring sublists properly improves data entry speed and ensures critical information is visible without scrolling.
Sublist Types
NetSuite forms contain different types of sublists, each serving different purposes.
| Sublist Type | Behavior | Examples |
|---|---|---|
| Inline Editor | Edit directly in grid, tab between cells | Sales Order items, Invoice lines |
| List | Read-only display of related records | Customer transactions, Item history |
| Editor | Add/edit via separate form popup | Addresses, Contacts on entities |
| Static List | Non-editable reference display | System notes, audit trail |
Common Standard Sublists:
- Item Sublist -- Line items on transactions (SO, PO, Invoice)
- Expense Sublist -- Non-item expenses on transactions
- Address Book -- Multiple addresses on entities
- Contacts -- Related contacts on customer/vendor
- Currency -- Multi-currency settings
- Partners -- Sales partner relationships
- Apply Sublist -- Payment application lines
Line Item Configuration
The Items sublist on transactions is the most heavily used. Optimize it for fast, accurate entry.
Essential vs. Optional Columns
Recommended Column Order (Sales Order)
| Position | Column | Reason |
|---|---|---|
| 1 | Item | Primary selection field |
| 2 | Description | Verify correct item selected |
| 3 | Quantity | Most common edit |
| 4 | Units | If using multiple units |
| 5 | Rate | Price per unit |
| 6 | Amount | Extended price (auto-calculated) |
| 7 | Tax Code | If varies by line |
Column Width Optimization
Set column widths to match content. Narrow columns for codes, wider for descriptions.
| Column Type | Recommended Width | Notes |
|---|---|---|
| Item Code | 15-20% | Depends on SKU length |
| Description | 25-35% | Widest column typically |
| Quantity | 8-10% | Numeric, narrow |
| Rate | 10-12% | Currency format |
| Amount | 10-12% | Currency format |
Matrix Sublist Configuration
Matrix items display in a special grid format showing size/color combinations.
Custom Column Sublists
Add custom columns to sublists for business-specific data.
Common Custom Line Fields
- Commission Rate Override: Per-line commission for special deals
- Customer PO Line: Reference to customer's line item number
- Delivery Date: Requested delivery per line item
- Warehouse Notes: Special handling instructions
- Cost Center: Departmental allocation per line
Expense Sublist Configuration
The expense sublist appears on purchase orders, vendor bills, and expense reports. Configure it for accurate cost allocation.
Key Expense Sublist Fields
- Category: Expense category (maps to GL account)
- Amount: Expense amount
- Department: Cost center allocation
- Class: Business segment classification
- Location: Physical location
- Customer: For billable expense tracking
- Billable: Flag for client billing
Sublist Filtering and Sourcing
Control which items appear in sublist dropdowns to speed data entry and prevent errors.
- Item Sublist Filter: Limit items to specific types or categories on the form
- Vendor Item Sourcing: Show only items linked to the selected vendor
- Location Filter: Restrict to items available at selected location
- Custom Filters: Script-based filtering for complex rules
Related Records Sublists
Related records sublists display linked transactions and activities, providing context without leaving the record.
- Transactions subtab: Shows related sales orders, invoices, payments
- Activities subtab: Calls, tasks, events linked to the record
- Communication subtab: Emails, messages, attached files
- Custom subtabs: Saved searches displayed as record subtabs
Inline Editing Configuration
Inline editing on list views and sublists allows quick updates without opening the full record.
Industry-Specific Sublist Patterns
Performance Optimization
Large sublists with many columns or rows can slow form loading.
- Limit visible columns to reduce rendering time
- Use saved search sublists instead of loading all related records
- Paginate large sublists where supported
- Disable unused sublists on the form to prevent unnecessary data loading
Sublist Configuration Checklist
Saved Searches as Data Sources
Saved searches power dashboard portlets, form subtabs, dropdown lists, and other UI elements. Understanding how to design searches for UI consumption is key to building effective NetSuite interfaces.
Search-Driven UI Elements
Saved searches can populate multiple UI components beyond just report results.
| UI Element | Search Type | Key Configuration |
|---|---|---|
| Dashboard List Portlet | Any search marked "Available as List Portlet" | Limit results, show key columns only |
| KPI Scorecard | Summary search returning single row | Mark "Available as KPI Scorecard" |
| Trend Graph | Search with date grouping | Include date dimension, sort ascending |
| Reminder | Search returning action items | Mark "Available as Reminder" |
| Form Subtab | Related record search | Mark "Available as Sublist View" |
List Portlet Searches
List portlets display saved search results as scrollable lists on dashboards.
List Portlet Best Practices
| Practice | Implementation | Reason |
|---|---|---|
| Limit Results | Set max rows (25-50) | Portlets should show actionable items, not exhaustive lists |
| Include Links | Show record link column | Users need to click through to take action |
| Sort Meaningfully | Most urgent/recent first | Top items should be highest priority |
| Use Formulas Sparingly | Avoid complex calculations | Portlets refresh frequently; complex formulas slow loading |
Create Search
Build search with appropriate filters and results columns. Mark as "Available as List Portlet."
Configure Audience
Set which roles/users can access via Audience tab. Consider "Available for All Roles" or specific roles.
Add to Dashboard
Users add via Personalize Dashboard > Custom Search portlet, or publish via role center.
KPI Scorecard Searches
KPI portlets display single metrics or comparison values. The search design differs from list portlets.
For KPI scorecards, the search must:
- Return exactly ONE row (use Summary type)
- Include the metric as a formula or summary field
- Optionally include comparison value (prior period)
- Be marked "Available as KPI Scorecard"
Example - Open Sales Orders Value:
- Record Type: Transaction
- Criteria: Type = Sales Order, Status = Pending Fulfillment
- Results: SUM(Amount) with Summary Type
Common KPI Searches
| KPI | Record Type | Key Formula/Summary |
|---|---|---|
| Open AR Balance | Transaction | SUM(Amount Remaining) where Type = Invoice |
| Orders This Month | Transaction | COUNT(*) where Type = Sales Order, Date = This Month |
| Inventory Value | Item | SUM(Total Value) for Inventory Items |
| Overdue Tasks | Task | COUNT(*) where Due Date less than Today, Status not equal to Completed |
| Revenue YTD | Transaction | SUM(Amount) where Type = Invoice, Date = This Year |
Trend Graph Searches
Trend graphs visualize data over time. The search must be structured to support chart rendering.
Trend Search Requirements
- Time Dimension: Include date field grouped by period (day, week, month)
- Measure Column: Numeric value to plot (amount, count, quantity)
- Optional Dimension: Category for multi-series charts (product line, region)
- Sorting: Sort by date ascending for proper chart rendering
Match chart type to data characteristics:
- Line Chart: Continuous trends over time (sales by month)
- Bar Chart: Comparison across categories (sales by region)
- Pie Chart: Proportion of whole (expense breakdown)
- Area Chart: Cumulative values over time (running balance)
Configure chart options when adding to dashboard via "Chart Options" button.
Search Performance Optimization
Searches driving UI elements need to be highly optimized since they run frequently.
Performance Best Practices
| Technique | Implementation | Impact |
|---|---|---|
| Index-Friendly Filters | Filter on indexed fields first (ID, Date, Status) | Dramatically reduces scan time |
| Limit Results | Set maximum rows returned | Caps worst-case performance |
| Avoid Formula Filters | Filter before calculating, not with formulas | Formulas in filters prevent index use |
| Minimize Joins | Avoid deep joins (3+ levels) | Each join multiplies query complexity |
| Summary vs. Detail | Use Summary searches for aggregations | Database aggregation faster than formula |
Search Security and Sharing
Control who can access searches and what data they see.
Audience Configuration
- Public: All users can see (use cautiously)
- Role-Based: Specific roles have access
- Employee-Based: Specific employees only
- Owner Only: Private to creator
Search access does not equal data access:
- Users can only see search results for records they have permission to view
- A public search doesn't expose data to unauthorized users
- However, search existence and column structure are visible
- For sensitive reports, restrict search access to appropriate roles
Searches as Form Subtabs
Saved searches can appear as subtabs on record forms, showing related data without custom scripting.
Adding Search Subtabs
Create the Search
Build search that filters by the parent record (e.g., transactions for a customer). Use relative filters like "Customer : Internal ID = {ID}".
Mark for Subtabs
Enable "Available as Sublist View" option. This exposes the search for form integration.
Add to Form
Edit the form, go to Subtabs section, add new subtab with source = saved search.
Search subtabs execute when the form loads. Considerations:
- Filter tightly — Only show records related to current record
- Limit results — Use max results to prevent slow loading
- Avoid on high-traffic forms — Don't add complex searches to frequently accessed forms
- Consider load type — Some subtabs can be set to load on-demand (click to load)
Dynamic Dropdown Sources
Saved searches can power dropdown fields, providing filtered or calculated options.
Use Cases for Search-Driven Dropdowns
| Scenario | Standard Approach | Search-Driven Approach |
|---|---|---|
| Active items only | All items shown | Search filters to Is Inactive = False |
| Items by category | Full item list | Search filters by selected category |
| Customers with open balance | All customers | Search for balance > 0 |
| Available employees | All employees | Search excludes terminated, on leave |
Implementation Methods
Inline Editing with Searches
Saved search results can support inline editing, allowing users to modify data directly from search results.
Inline Editing Considerations
- Field Support: Not all fields support inline editing; test each column
- Permissions: User must have edit permission on underlying records
- Validation: Field validations still apply; errors shown inline
- Performance: Each edit triggers save; batch edits via CSV may be faster for bulk changes
For controlled bulk updates, create a search that:
- Shows records needing update (e.g., items needing price change)
- Includes the editable field as a column
- Enables inline editing
- Users can tab through and update multiple records efficiently
This is faster than opening each record individually but slower than CSV import for large volumes.
Industry Applications
Dashboard searches:
- Work orders by status (Released, In Progress, Completed)
- Components below reorder point
- Production schedule for the week
- Quality holds awaiting disposition
Dashboard searches:
- Orders ready to ship today
- Backorder report with expected dates
- Top customers by month-to-date sales
- Inventory aging by location
Dashboard searches:
- Unbilled time and expenses
- Projects by percent complete
- Resource utilization this month
- Expiring contracts (next 90 days)
Saved Search UI Integration Checklist
PDF Templates
Creating professional transaction documents with Advanced PDF/HTML templates using BFO syntax and FreeMarker.
Advanced PDF/HTML Templates Overview
NetSuite's Advanced PDF/HTML templates transform transaction data into professionally formatted documents for printing, emailing, and archiving. Understanding the underlying technologies—BFO (Big Faceless Organization) rendering engine and FreeMarker templating—is essential for effective customization.
BFO Report Generator:
- Converts HTML/CSS to PDF format
- Supports subset of CSS (not full CSS3)
- Proprietary CSS extensions for PDF features
- Page layout, headers, footers, page breaks
FreeMarker:
- Template language for dynamic content
- Access record fields via ${record.fieldname}
- Conditionals, loops, formatting functions
- Include files and macros
Template Types and Navigation
Standard Template Categories
| Category | Common Templates | Typical Use |
|---|---|---|
| Transaction | Invoice, Sales Order, Purchase Order, Quote | Customer/vendor-facing documents |
| Statement | Customer Statement, Dunning Letters | AR communications |
| Shipping | Packing Slip, Pick Ticket, Bill of Lading | Warehouse operations |
| Payment | Check, Voucher Check, Payment Stub | AP disbursements |
| Label | Shipping Labels, Item Labels | Barcode/address labels |
Template Structure
Advanced PDF templates follow a standard HTML structure with special BFO and FreeMarker elements.
Templates include: XML declaration, DOCTYPE, HTML structure with CSS styles in the head, body content with FreeMarker variables like ${record.entity}, line item loops with #list directives, and footer content with totals.
Accessing Record Data
FreeMarker provides access to all record fields through the ${record} object.
Common Field Access Patterns
| Data Type | Syntax | Example |
|---|---|---|
| Body Field | ${record.fieldid} | ${record.tranid}, ${record.total} |
| Entity Reference | ${record.entity} | ${record.entity} (customer name) |
| Address | ${record.billaddress} | Full formatted address block |
| Line Items | <#list record.item as item> | Loop through item sublist |
| Custom Fields | ${record.custbody_fieldid} | ${record.custbody_ponumber} |
| Company Info | ${companyinformation.fieldid} | ${companyinformation.companyname} |
Conditional Logic
FreeMarker conditionals control what content appears based on field values.
Common Conditional Patterns
| Pattern | Syntax | Use Case |
|---|---|---|
| If/Else | <#if condition>...<#else>...</#if> | Show different content based on value |
| Has Value | <#if record.field?has_content> | Only show if field has data |
| Equals | <#if record.status == "Pending"> | Match specific value |
| Contains | <#if record.memo?contains("Rush")> | Text search within field |
| Numeric Compare | <#if record.total > 1000> | Amount thresholds |
Always handle potentially null values to prevent template errors:
- Default value: ${record.memo!"No memo"}
- Empty string default: ${record.memo!""}
- Has content check: <#if record.memo?has_content>
- Null check: <#if record.memo??>
Page Layout and CSS
BFO supports a subset of CSS with special extensions for PDF features.
Essential BFO CSS
| Feature | CSS Syntax | Notes |
|---|---|---|
| Page Size | @page { size: letter; } | letter, legal, A4, or custom dimensions |
| Margins | @page { margin: 0.5in; } | Individual sides: margin-top, etc. |
| Page Break | page-break-before: always; | Force new page |
| Avoid Break | page-break-inside: avoid; | Keep element together |
| Running Header | position: running(header); | Repeat on every page |
| Page Counter | content: "Page " counter(page); | Page X of Y pagination |
Images and Logos
Include company logos, product images, and other graphics in templates.
Image Sources
- File Cabinet: Reference uploaded images via URL
- Company Logo: ${companyinformation.logourl}
- Item Images: ${item.imageurl} in line item loop
- External URLs: Full https:// paths (not recommended)
- File size: Keep images under 100KB for performance
- Format: PNG or JPG preferred; avoid SVG
- Dimensions: Size images before upload; don't rely on CSS scaling
- File Cabinet location: Use "Available Without Login" for email templates
Tables and Line Items
Proper table formatting is critical for professional-looking documents.
Table CSS Tips
| Requirement | CSS Property | Value |
|---|---|---|
| Fixed column widths | table-layout: fixed; | Prevents column resizing |
| Cell borders | border-collapse: collapse; | Single borders between cells |
| Header repeat | -fs-table-paginate: paginate; | Repeats thead on each page |
| Row banding | tr:nth-child(even) | Alternating row colors |
| Text alignment | text-align: right; | Right-align numbers |
Number and Date Formatting
Control how numbers, currencies, and dates display in templates.
Formatting Functions
| Type | Syntax | Result |
|---|---|---|
| Currency | ${record.total?string.currency} | $1,234.56 |
| Number | ${record.quantity?string["0.00"]} | 123.45 |
| Percentage | ${record.rate?string.percent} | 15% |
| Date | ${record.trandate?string["MM/dd/yyyy"]} | 12/09/2025 |
| Long Date | ${record.trandate?string["MMMM d, yyyy"]} | December 9, 2025 |
Template Assignment
Control which templates are used for different scenarios.
Assignment Methods
- Transaction Form: Link template to specific transaction form
- Print/Email Actions: Different templates for print vs. email
- Subsidiary: Different templates per subsidiary (multi-subsidiary)
- Language: Localized templates for multi-language
- Scripted: Dynamically select template via SuiteScript
Industry-Specific Template Patterns
Template considerations:
- Include lot/serial numbers on packing slips
- Certificates of conformance with spec data
- Material safety data sheets (MSDS) references
- Country of origin for export documentation
Template considerations:
- Case/unit quantity display with conversions
- Barcode fields for scanning
- Customer item numbers alongside internal SKUs
- Bin locations on pick tickets
Template considerations:
- Detailed time entries with dates and descriptions
- Project/task grouping on invoices
- Rate cards and billing arrangements shown
- Expense reimbursement detail with receipts
Testing and Debugging
Recommended process:
- Start by customizing existing standard template (don't start from scratch)
- Use "Preview" function to test with sample transaction
- Check PDF output, not just HTML preview
- Test with transactions having many line items (page breaks)
- Test with minimum data (null handling)
- Verify in different browsers if email HTML version used
PDF Template Configuration Checklist
Email Templates
Create professional, dynamic email communications using NetSuite's email template system with merge fields, conditional content, and automated delivery.
Email Template Overview
NetSuite email templates automate customer and vendor communications with dynamically merged data. Unlike PDF templates that use FreeMarker, email templates use a simpler merge field syntax, making them more accessible to non-technical users while still providing powerful personalization capabilities.
- Transaction Email Templates: Attached to transaction forms for sending invoices, POs, quotes
- Marketing Email Templates: Campaign-based emails with unsubscribe links
- Workflow Email Templates: Triggered by workflow actions
- Case Email Templates: Support case communications
- Employee Notification Templates: Internal HR communications
Template Structure
Email templates consist of several components that work together to create personalized communications:
| Component | Purpose | Notes |
|---|---|---|
| Subject Line | Email subject with merge fields | Keep under 50 characters; can include ${entity.firstname} |
| Body (Rich Text) | HTML formatted content | WYSIWYG editor with merge field insertion |
| Body (Plain Text) | Fallback for non-HTML clients | Auto-generated or manual override |
| Attachments | PDF of transaction, File Cabinet files | Check "Attach Transaction PDF" checkbox |
| From Address | Sender email (must be configured) | Requires domain authentication for deliverability |
Merge Field Syntax
Email templates use a simple merge field syntax to insert dynamic data from records:
Creating Transaction Email Templates
Select Record Type
Choose the transaction type (Invoice, Sales Order, etc.) to determine available merge fields
Configure Template Settings
Name, description, and set as preferred template for record type
Build Subject Line
Include transaction number: "Invoice ${transaction.tranid} from ${company.companyname}"
Design Body Content
Use WYSIWYG editor, insert merge fields, apply formatting
Configure Attachments
Check "Attach Transaction PDF" to include invoice/PO as attachment
Sample Email Template
<!-- Subject: Invoice ${transaction.tranid} from ${company.companyname} -->
<div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;">
<!-- Header with logo -->
<div style="background-color: #f8f9fa; padding: 20px; text-align: center;">
<img src="${company.logo}" alt="${company.companyname}" style="max-height: 60px;">
</div>
<!-- Main content -->
<div style="padding: 30px;">
<p>Dear ${entity.firstname},</p>
<p>Please find attached Invoice <strong>${transaction.tranid}</strong>
dated ${transaction.trandate}.</p>
<!-- Invoice summary box -->
<div style="background-color: #f0f7ff; padding: 15px; border-radius: 5px; margin: 20px 0;">
<p style="margin: 5px 0;"><strong>Amount Due:</strong> ${transaction.total}</p>
<p style="margin: 5px 0;"><strong>Due Date:</strong> ${transaction.duedate}</p>
<p style="margin: 5px 0;"><strong>Terms:</strong> ${transaction.terms}</p>
</div>
<p>If you have any questions, please contact us at ${company.email}
or ${company.phone}.</p>
<p>Thank you for your business!</p>
<p>Best regards,<br>
${user.firstname} ${user.lastname}<br>
${company.companyname}</p>
</div>
<!-- Footer -->
<div style="background-color: #333; color: #fff; padding: 15px; text-align: center; font-size: 12px;">
<p>${company.mainaddress}</p>
</div>
</div> Advanced Merge Features
Accessing Related Records
<!-- Primary contact on entity -->
${entity.contact.firstname}
${entity.contact.email}
<!-- Sales rep on transaction -->
${transaction.salesrep.firstname}
${transaction.salesrep.email}
${transaction.salesrep.phone}
<!-- Subsidiary information -->
${transaction.subsidiary.name}
${transaction.subsidiary.mainaddress}
<!-- Custom fields -->
${transaction.custbody_field_id}
${entity.custentity_field_id} Conditional Content (Using SuiteScript)
Native email templates don't support if/else logic. For conditional content:
- Option 1: Create multiple templates, assign via workflow based on conditions
- Option 2: Use SuiteScript to dynamically build email content
- Option 3: Use Marketing Templates (campaign) which support some dynamic content
Marketing Email Templates
Marketing templates are designed for campaigns and include special features for tracking and compliance:
| Feature | Transaction Template | Marketing Template |
|---|---|---|
| Primary use | Invoices, POs, quotes | Campaigns, newsletters |
| Unsubscribe link | Not included | Required (auto-inserted) |
| Open/click tracking | Not available | Built-in analytics |
| A/B testing | No | Yes (with campaigns) |
| Drag-drop editor | No | Yes |
| Dynamic content blocks | No | Yes (based on segments) |
Marketing templates automatically include compliance requirements:
- Unsubscribe link (use ${unsubscribe} merge field)
- Physical mailing address (required)
- Clear identification of sender
Workflow Email Actions
Workflows can send emails using templates at any point in the process:
Add Send Email Action
In workflow state, add action type "Send Email"
Configure Recipients
Dynamic: field on record (e.g., Sales Rep), static email, or role
Select Template
Choose from existing templates or build inline
Set Conditions (Optional)
Add conditions to control when email sends
Scenario Trigger Template
-------------------------------------------------------------------------------
Sales order confirmation SO saved, status Pending Order Confirmation
Approval request Pending Approval state Approval Request
Approval granted Approved state Approval Notification
Past due reminder Scheduled, daysoverdue > 0 Past Due Reminder
Quote follow-up Scheduled, 3 days after Quote Follow-up
Welcome new customer Customer created Welcome Email Email Delivery Configuration
Domain Authentication
Without proper domain authentication, emails may be marked as spam or rejected. Required DNS records:
- SPF Record: Authorizes NetSuite to send on your behalf
- DKIM Record: Cryptographically signs emails
- DMARC Policy: Tells receiving servers how to handle failures
Path: Setup > Company > Email > Domain Keys
Send From Configuration
| Send From Option | Configuration | Use Case |
|---|---|---|
| Current User | User's email address | Personalized communications |
| Default Email | Company-wide default | Generic notifications |
| Specific Address | Hard-coded email | Department-specific (ar@company.com) |
| Record Field | Dynamic from record | Sales rep for their customers |
Case Management Templates
Support cases have specialized template features:
<!-- Case information -->
${case.casenumber} <!-- Case number -->
${case.title} <!-- Case subject -->
${case.status} <!-- Current status -->
${case.priority} <!-- Priority level -->
${case.createddate} <!-- Date opened -->
<!-- Assigned employee -->
${case.assigned.firstname} <!-- Assigned rep name -->
${case.assigned.email} <!-- Rep email -->
<!-- Customer self-service link -->
${case.externalcaseurl} <!-- Link to customer portal -->
<!-- Conversation history -->
${case.messages} <!-- Full message thread --> Auto-Response Templates
| Template Type | Trigger | Common Content |
|---|---|---|
| Case Acknowledgment | New case created | Case number, expected response time, portal link |
| Case Update | Status change | New status, next steps, rep contact |
| Case Closure | Case closed | Resolution summary, satisfaction survey link |
| Escalation Notice | Priority increased | New priority, escalation contact |
Best Practices
Design principles:
- Mobile-first: 60%+ of emails read on mobile—use single-column layouts, large fonts
- Keep it short: Get to the point quickly; link to details rather than including everything
- Clear CTAs: One primary action per email, make buttons obvious
- Consistent branding: Use company colors, logo, standard footer across all templates
- Test across clients: Check rendering in Gmail, Outlook, Apple Mail
- Missing null handling: ${entity.firstname} shows blank if not set—use fallbacks where possible
- Broken images: Use absolute URLs for images; relative paths fail in email
- Wrong "From" address: Sending from unauthenticated domain = spam folder
- No plain text version: Some clients/filters require plain text alternative
- Overly complex HTML: Email HTML support is limited—avoid CSS grid, flex, advanced features
- Large attachments: Keep under 10MB; prefer links to File Cabinet for large files
Industry-Specific Patterns
Template considerations:
- Shipping confirmations with tracking numbers
- Quality documentation/COA attachments
- Production schedule updates
- RMA authorization emails with return instructions
Template considerations:
- Order confirmations with estimated ship date
- Backorder notifications
- Price change announcements
- Credit limit warnings/increases
Template considerations:
- Subscription renewal reminders
- Usage threshold alerts
- License key delivery
- Onboarding sequences (multiple templates)
Template considerations:
- Project milestone notifications
- Timesheet approval requests
- Retainer balance notifications
- Statement of Work delivery
Testing and Troubleshooting
Preview with Sample Record
Use "Preview" button, select actual record to see merged content
Send Test Email
Send to yourself to verify formatting and attachments
Check Email Log
Setup > Company > Email > Email Log to verify delivery
Test Multiple Clients
Verify rendering in Gmail, Outlook, Apple Mail
Email Template Configuration Checklist
Dashboard Design
Design effective role-based dashboards that surface the right information to the right users, utilizing portlets, KPIs, reminders, and shortcuts for maximum productivity.
Dashboard Architecture Overview
NetSuite dashboards serve as the primary workspace for users, displaying real-time information tailored to their role. Well-designed dashboards reduce clicks, surface actionable insights, and drive user adoption. Each dashboard is a combination of portlets organized into a customizable layout.
- Published Dashboards: Admin-created, assigned to roles, users cannot modify
- Role-Based Defaults: Default dashboard for role, users can customize
- Personal Dashboards: User-created dashboards (if permissions allow)
Users see published dashboards first (in tabs), then their personal dashboards.
Portlet Types
Portlets are the building blocks of dashboards. Each portlet type serves a different purpose:
| Portlet Type | Purpose | Data Source |
|---|---|---|
| Key Performance Indicators (KPI) | Scorecard-style metrics | KPI Scorecard saved search or standard KPIs |
| Search Results | List view of saved search data | Any saved search marked "Available as List Portlet" |
| Report Snapshots | Financial reports as charts | Built-in or custom financial reports |
| Trend Graph | Time-series visualization | Saved search with date grouping |
| Reminders | Action-required notifications | Built-in or custom reminder searches |
| Shortcuts | Quick links to frequent tasks | User or admin defined |
| Quick Search | Record lookup | Global search by record type |
| Recent Records | Recently viewed items | User's browsing history |
| Custom Portlet | SuiteScript-powered content | Portlet script (Suitelet) |
| Calendar | Schedule visualization | Events, tasks, transactions |
Published Dashboards
Published dashboards are administrator-controlled layouts that cannot be modified by users. Use them for:
- Standardized role-based views
- Compliance-required metrics visibility
- Executive dashboards with consistent KPIs
- Onboarding dashboards for new users
Create Dashboard
Name dashboard, add description, select subsidiary (OneWorld)
Configure Layout
Choose column structure (1, 2, or 3 columns)
Add Portlets
Select portlet types and configure each one
Assign Roles
Choose which roles see this dashboard
Publish
Activate dashboard; appears as tab for assigned roles
KPI Portlets
KPI portlets display key metrics in a scorecard format with comparison values, trends, and conditional highlighting.
Standard vs. Custom KPIs
| Feature | Standard KPIs | Custom KPIs (Saved Search) |
|---|---|---|
| Source | Built-in NetSuite metrics | Custom saved search |
| Flexibility | Limited configuration | Full control over calculation |
| Comparison periods | Built-in (prior period, same period last year) | Requires formula fields |
| Highlighting | Automatic (green/red based on trend) | Requires highlighting conditions |
| Use when | Standard metrics meet needs | Custom calculations required |
Best practices:
- Limit to 6-8 KPIs per portlet—too many reduces impact
- Use consistent date ranges (MTD, QTD, YTD, Rolling 30)
- Add comparison column (prior period or same period last year)
- Configure highlighting: green for good, red for bad, yellow for warning
- Link KPIs to detail saved searches (drill-down capability)
Reminder Portlets
Reminders alert users to items requiring action. NetSuite includes built-in reminders plus custom reminder searches.
Built-in Reminders
| Reminder | Trigger | Target Roles |
|---|---|---|
| Approve Sales Orders | Pending approval status | Sales managers, approvers |
| Approve Purchase Orders | Pending approval status | Purchasing managers |
| Orders to Fulfill | Approved, not shipped | Warehouse, fulfillment |
| Items to Receive | POs with pending receipts | Receiving, warehouse |
| Bills to Pay | Approved bills due | AP clerk, treasury |
| Overdue Tasks | Task due date passed | All users |
| Expense Reports to Approve | Pending approval | Managers |
Custom Reminders
Create custom reminders using saved searches with the "Available as Reminder" option:
Reminder Saved Search Criteria
-------------------------------------------------------------------------------
Quotes Expiring Soon Estimate: Status=Open, Valid Through within 7 days
Contracts Expiring Customer: Contract End Date within 30 days
Low Stock Items Item: Available < Reorder Point
Invoices Over 60 Days Invoice: Days Overdue > 60
Projects Over Budget Project: Actual Hours > Estimated Hours
Unapplied Payments Payment: Unapplied Amount > 0
Pending Time Approval Time Entry: Approval Status = Pending Shortcuts Portlet
Shortcuts provide one-click access to frequently used transactions, records, and reports. Effective shortcuts reduce navigation time significantly.
Shortcut Types
| Type | Example | How to Add |
|---|---|---|
| New Record | New Sales Order, New Invoice | Drag from menu or type URL |
| Saved Search | Open Quotes, My Tasks | Select from search dropdown |
| Report | AR Aging, P&L | Select from reports dropdown |
| Record Page | Specific customer, setup page | Paste URL |
| External Link | Carrier tracking, external tool | Enter external URL |
Group shortcuts logically using separator lines or multiple shortcut portlets:
- Daily Tasks: New records, approvals, time entry
- Reports: Most-used reports for the role
- Searches: Key lists and lookups
Role-Based Dashboard Strategy
Different roles have different information needs. Design dashboards that answer "What do I need to do?" and "How am I performing?"
Transactional Roles (AR/AP Clerks, Warehouse):
- Heavy on reminders and work queues
- Shortcuts to frequent transactions
- Simple metrics (counts, totals)
Management Roles (Controllers, Managers):
- KPI-focused with comparisons
- Trend graphs for performance over time
- Drill-down capability to details
Executive Roles (CEO, CFO):
- High-level KPIs only
- Report snapshots for financial position
- Minimal clutter, maximum insight
Sample Dashboard Layouts
+-----------------------------------+-----------------------------------+
| REMINDERS | SHORTCUTS |
| - Invoices to Create (12) | - New Invoice |
| - Payments to Apply (8) | - New Payment |
| - Deposits to Make (3) | - Customer Lookup |
| - Customers to Call (5) | - AR Aging Report |
+-----------------------------------+-----------------------------------+
| KPIs |
| Open AR: $1.2M | Overdue: $245K | DSO: 38 days | MTD Cash: $156K |
+-----------------------------------+-----------------------------------+
| OVERDUE INVOICES | RECENT PAYMENTS |
| [Saved search results] | [Saved search results] |
| Customer | Amount | Days | Customer | Amount | Date |
+-----------------------------------+-----------------------------------+ +---------------------------------------------------------------------+
| KPI SCORECARD |
| Pipeline: $4.5M | MTD Rev: $890K | Win Rate: 32% | Forecast: $1.2M |
+-----------------------------------+---------------------------------+
| PIPELINE BY STAGE | REVENUE TREND |
| [Trend Graph] | [Trend Graph] |
| Prospecting > Negotiation > Close| Jan Feb Mar Apr May Jun |
+-----------------------------------+---------------------------------+
| TEAM PERFORMANCE | APPROVALS NEEDED |
| Rep | Pipeline | MTD | - Sales Orders (3) |
| Jones | $1.2M | $245K | - Discounts > 20% (2) |
| Smith | $980K | $312K | - New Customer Credits (1) |
+-----------------------------------+---------------------------------+ Dashboard Performance
Slow dashboards frustrate users and reduce adoption. Common causes:
- Too many portlets: Each portlet makes separate requests; limit to 8-10
- Inefficient saved searches: Use summary-level data, not transaction-level
- Real-time KPIs: Consider scheduled refresh for heavy calculations
- Large date ranges: Default to current period, allow expansion
Optimization Strategies
| Issue | Solution |
|---|---|
| Slow search portlets | Limit results to 25-50 rows; add date filters |
| Heavy KPI calculations | Pre-calculate in scheduled script; store in custom record |
| Too many reminders | Consolidate into single reminder search with categories |
| Slow report snapshots | Use scheduled report with "Cache Results" enabled |
| Unused portlets | Remove; portlets load even if collapsed |
Industry-Specific Dashboard Patterns
Key dashboard elements:
- Production schedule/work orders due
- Inventory below reorder point
- On-time delivery percentage
- WIP value and aging
- Quality metrics (reject rate, returns)
Key dashboard elements:
- Orders to ship today/backorders
- Inventory turns by category
- Gross margin by product line
- Vendor fill rate
- Shipping carrier performance
Key dashboard elements:
- MRR/ARR and growth rate
- Churn rate and at-risk renewals
- NRR (Net Revenue Retention)
- Support case metrics
- Deferred revenue balance
Key dashboard elements:
- Utilization rate (billable vs. total)
- Project profitability
- Time pending approval
- Revenue recognition schedule
- Resource availability
Key dashboard elements:
- Donations YTD vs. budget by campaign
- Grant fund balances and deadlines
- Expense ratio (program vs. admin)
- Donor retention rate
- Pending pledges
Custom Portlets (SuiteScript)
When standard portlets don't meet requirements, custom portlets can display virtually any content:
- External data integration: Display data from external APIs
- Complex visualizations: Charts beyond NetSuite's built-in options
- Interactive forms: Quick-entry forms embedded in dashboard
- Calculated metrics: Complex multi-record calculations
- Announcements: Company news, policy updates
/**
* @NApiVersion 2.1
* @NScriptType Portlet
*/
define(['N/search', 'N/ui/serverWidget'], function(search, serverWidget) {
function render(params) {
var portlet = params.portlet;
portlet.title = 'My Custom Portlet';
// Add form fields
portlet.addField({
id: 'custpage_kpi',
type: serverWidget.FieldType.TEXT,
label: 'Key Metric'
}).defaultValue = calculateKPI();
// Or add HTML content
portlet.html = '<div>Custom HTML content</div>';
}
return { render: render };
}); 