Blog
456 articles about NetSuite, SuiteQL, AI, and software development.
Latest Posts
September 29, 2026 — The Instance Integrity Diagnostic asks whether the instance producing the numbers can be trusted. On my test account, 87% of GL revenue was journal-posted with no customer behind it, 86% of open receivables were past due, and plaintext credentials sat on vendor records.
September 28, 2026 — The Ledger X-Ray reads a NetSuite general ledger as a five-act story. On my test account, six anonymous monthly journals carried 81% of quarterly revenue, a real business growing 90% a year lived underneath them, and three DSO formulas gave three different answers.
September 27, 2026 — A new digital product, and not a NetSuite one. Forty-four AI prompts that walk a homeowner through selling without an agent: an appraiser-style market analysis, staging and listing, showing scripts, negotiation counters, contracts, disclosures, and closing. Works with ChatGPT, Claude, or Gemini.
September 26, 2026 — Helm runs twenty-eight AI agents inside my NetSuite test account, and underneath it is ordinary SuiteScript with custom records. That matters as much as the guardrails: a saved search can read the findings, and a second Suitelet called Helm Desk gives each agent's owner a live evidence panel.
September 25, 2026 — In my NetSuite test account, four invoices were 22% of the year, and nothing in the account suggests that those customers are coming back. A new free prompt in the Sonar AI Prompt Library measures how dependent you are on your largest customers, compares this year to last on a like-for-like window, names the customers who moved the numbers, and flags the one-invoice whales.
Archived Posts
2026 (137 posts)
September 24, 2026 — The Sonar AI Prompt Library now holds 400 prompts. Thirty-seven of them are new today, one was rebuilt, and four of the new ones are free. Process mining for every major NetSuite flow, a financial documentary in five acts, sponsor-grade scenario analysis, and a lot for the people who keep the instance running. Here's what's in the release.
September 23, 2026 — Every morning at 2:00 Pacific, AI agents sign in to a NetSuite account and start reading the ledger. By the time I'm drinking my first cup of coffee, twenty-eight of them have run, filed what they found, and signed out again. What the agents are, what each of them watches, what they're allowed to do about it, and what the whole fleet costs.
September 22, 2026 — Where do we actually make money? Are reps discounting too much, or not enough? Do customers pay the way their terms say? Are the add-ons performing to the deal model? Four prompts in the Sonar AI Prompt Library that answer those from the ledger, and what one of them found that nobody expected.
September 21, 2026 — Most prompts in the Sonar AI Prompt Library hand you a report. These eight hand you something else: a console you make decisions in, a guide that settles an argument, or a reconstruction of how your transactions really move. What they do, how the write gates work, and what they found in a test account.
September 20, 2026 — Companies running on NetSuite no longer need to be convinced that AI is worth their attention. What they can't figure out is how to apply it, and that's where the opportunity is for people who already know NetSuite.
September 19, 2026 — A progress report on the unattended AI agent framework I've been building for NetSuite - what it is, what the first ten agents do, how it got here, and where it's going.
September 18, 2026 — A $2.10 part holding up $43,655 in shipments. A largest customer buying below cost. Two coasts fulfilling each other's backyards. Nine prompts in the Sonar AI Prompt Library for bills of materials, supplier risk, purchasing, and inventory positioning, and what they found in a test account.
September 17, 2026 — On Tuesday I went live to find out. I showed a few apps I've built with Sonar, then built a new one from scratch, unscripted, starting from nothing but plain-language requirements.
September 16, 2026 — A comparative income statement with EBITDA that reconciles to the cent, an MD&A narrative that traces every account movement to its source documents, a risk appetite assessment, and a one-page explanation of the ERP for the board. Five prompts in the Sonar AI Prompt Library for the reports that go in front of directors, lenders, and investors.
September 15, 2026 — The latest criticism of AI agents that run inside NetSuite assumes that an agent built inside the ERP can't see anything outside of it. That's not true, and it's why I believe that the agent belongs where the ledger is.
September 14, 2026 — Thirty of the 366 prompts in the Sonar AI Prompt Library are free, and they're where I suggest starting. A tour of all thirty, grouped by the question each one answers, from the balance sheet to the close to the health of the account itself.
September 13, 2026 — Most NetSuite problems don't start with an outage. They start quietly: a script failing on every run, a half-finished payment migration, a plain-text password on a vendor field, a scheduled job still running under someone who left. Eight prompts in the Sonar AI Prompt Library for the people who keep the instance running.
September 12, 2026 — Sonar AI shipped versions 1.21.2 through 1.23.0 in a single day. The fixes include skill documents that were being silently truncated at 10 KB, a footer chip showing real working time and cost per session, a redesigned usage modal, and a read-only default for tools.
September 10, 2026 — Until August, most prompts in the Sonar AI Prompt Library answered a question about the business. Nine new ones read the business from the ledger and hand back a plan: growth opportunities, a scaling roadmap, an operating cadence, cost programs, and an operational audit.
September 9, 2026 — What would a business look like if AI agents did most of the work inside the ERP? A look at what changes, the boring safety work that makes it possible, and what stays with people.
September 7, 2026 — Most benchmark reports are one-offs. Next month you start over, and nobody remembers what the last one recommended. A new prompt in the Sonar AI Prompt Library measures a business against its industry's norms and then keeps a series, so every edition computes the deltas, cites prior findings, and says what happened to the recommendations.
September 6, 2026 — The AI industry has moved on to autonomous agents, but a lot of companies are still learning to chat, and I think that they should be. Why conversational AI is how you find the agents, and how Sonar and Helm fit that progression.
September 4, 2026 — Most financial analysis starts from the financial statements. Four prompts added to the Sonar AI Prompt Library last month start from the raw postings in the general ledger, build the statements they need, prove them with tie-outs, and go from there.
September 2, 2026 — Helm is an unattended agent execution system for NetSuite. This is my vision for it, how it's being built, what I plan to ship, and the questions I think that every NetSuite customer should be asking of any AI vendor - including me.
September 1, 2026 — Onboarding a new hire into NetSuite usually means generic tutorials that teach half of what they need and plenty that they'll never touch. A new prompt in the Sonar AI Prompt Library reads the role's real permission set and the account's live configuration, then builds the curriculum and the modules from that.
August 30, 2026 — They just go quiet, or they keep ordering while their baskets shrink. A new prompt in the Sonar AI Prompt Library scores every customer on three leading indicators already in NetSuite, validates each signal before trusting it, and routes every at-risk account to a named rep with a specific play.
August 28, 2026 — There are more than 44,000 businesses running on NetSuite, and when they trade with each other, they do it by email. The case for an opt-in, account-to-account trade network, what its standards would cover, and why it should come from Oracle.
August 27, 2026 — Revenue surprises rarely show up in any one report. They hide in the gaps between reports. A new prompt in the Sonar AI Prompt Library puts billings, recognized revenue, and cash collections side by side, month by month, and proves which of the gaps are real.
August 26, 2026 — The data that tells a sponsor whether the investment thesis is working lives in the general ledger. How Sonar AI and its 366-prompt library serve PE-backed companies on NetSuite, from sell-side prep through the hold period to exit, with every number traceable to the ledger.
August 26, 2026 — I pointed an AI prompt at one of the simplest saved searches in my NetSuite account. The five-minute SuiteQL version would have been wrong in 44 of its 66 rows. The AI-driven version got it right, proved it at the cell level, and wrote it up, in under ten minutes and for less than seven dollars.
August 25, 2026 — Chartstone turns Sonar from an AI agent you chat with into an AI agent that other systems can leverage. A proof of concept for giving Sonar AI a Web API: what it unlocks, how it works, and where it stands.
August 24, 2026 — The largest update that I've ever made to the Sonar AI Prompt Library. It now holds 366 prompts, 54 of them are new, and four of the new ones are free. Here's what's in the release.
August 23, 2026 — NetSuite's comparative balance sheet tells you what changed. It doesn't tell you why, or whether the change is healthy. A free prompt I'm adding to the Sonar AI Prompt Library turns it into a position analysis, with a cash bridge that has to reconcile to the penny.
August 21, 2026 — It's the question every sales lead asks in the third week of a slow month, and the answer is usually already inside the NetSuite account. A free prompt I'm adding to the Sonar AI Prompt Library finds the sold-but-stuck orders, the dormant accounts, the one-time buyers, and the dead stock, and ranks the moves by speed to cash.
August 20, 2026 — The hard questions at a board meeting come from the numbers. A prompt in the Sonar AI Prompt Library mines the quarter's general ledger for its most provocative figures, anticipates the ten questions a skeptical board member will ask about them, and drafts a sourced, defensible answer to each.
August 18, 2026 — I came to AI reluctantly, and some of that skepticism never left. A plain statement of what I believe about AI in NetSuite, and how it shaped nearly every decision I've made while building Sonar AI.
August 18, 2026 — The release history of the Sonar AI Suitelet, from the v1.0 foundation through v1.7.0: guardrails, subagents, Privacy Mode, Second Opinion, and the starter process library.
August 17, 2026 — Where does revenue ship? Which quotes die? How deep do the discounts really go? Which route customers haven't ordered this week? Eight prompts in the Sonar AI Prompt Library answer questions about revenue and customers from live NetSuite data, and two of them are free.
August 15, 2026 — Every quality manager knows the recall question. Answering it usually means a panicked afternoon of digging through work orders, fulfillments, and spreadsheets. A prompt I'm adding to the Sonar AI Prompt Library traces a lot's full family tree from live NetSuite data, reconciles every unit, and names every customer who got one.
August 13, 2026 — Almost every NetSuite admin job posting is copied from a template. But a vanilla SuiteSuccess instance and a 2,000-script manufacturing account running four vendors' code need completely different people. A free prompt in the Sonar AI Prompt Library builds the hiring profile from the only source that knows what the job is: the account itself.
August 11, 2026 — Every customer list hides the same four stories: the ones you should love, the ones you should grow, the ones you need to collect from, and the ones you should probably let go. A new prompt in the Sonar AI Prompt Library plots all of them on a single chart, straight from live NetSuite data.
August 9, 2026 — The Sonar AI Prompt Library now holds 315 prompts, and 39 of them are new this week. The library started with financial analysis. This release takes it onto the factory floor, into the warehouse, into the boardroom, and into the platform itself. Three of the new prompts are free.
August 6, 2026 — Month-end asks three questions in order: what moved, why did it move, and what happens next. Six prompts coming to the Sonar AI Prompt Library answer them from live NetSuite data, starting with a free P&L flux analysis that reviews every posting line, not a sample.
August 4, 2026 — Every NetSuite admin has seen an item with a negative on-hand quantity. The number is easy to spot. The why is buried under hundreds of transactions. A prompt I'm adding to the Sonar AI Prompt Library rebuilds the ledger, finds the break point, and writes the fix.
August 2, 2026 — NetSuite ships no security report. The identity, role, permission, authentication, and data-exposure posture of an account is a census you have to take yourself. Eight prompts in the Sonar AI Prompt Library take it for you, five of them new in the next release, and every finding traces to a query.
July 31, 2026 — Every multi-location shipper eventually asks where orders actually wait, and no standard NetSuite report answers it. A prompt I'm adding to the Sonar AI Prompt Library rebuilds the fulfillment pipeline stage by stage, values the backlog that never entered it, and reports the wait as what it is: working capital trapped in a queue.
July 29, 2026 — Where does the value in a factory concentrate, how much of what was planned actually got built, and which recipes got more expensive to make? Three prompts I'm adding to the Sonar AI Prompt Library answer those questions from NetSuite work orders, assembly builds, and vendor bills, each as a single interactive report.
July 26, 2026 — A work center that will be overloaded three weeks from now doesn't show up in any standard NetSuite report. It shows up later, as a late order. A prompt I'm adding to the Sonar AI Prompt Library renders planned load against capacity as a heatmap, and the bottleneck burns red weeks ahead of the schedule slipping.
July 23, 2026 — Executives don't want a chart gallery. They want to know where the cash is, what could go wrong, and what to decide. Seven prompts in the Sonar AI Prompt Library build that view from live NetSuite data: a 13-week cash forecast, a single-screen command center, a board pre-read, a concentration heatmap, an early-warning scorecard, and more.
July 21, 2026 — I figured that the challenging part of building Sonar AI would be presenting the model with enough data. What I found was the opposite. How Sonar works with large volumes of NetSuite data: the database does the math, and the model reads small, verifiable summaries.
July 19, 2026 — The close is where small problems become misstatements: a payment that was never applied, a fulfillment that was never invoiced, a journal that landed in a closed period. Five prompts coming to the Sonar AI Prompt Library find those problems before the close does, and one more builds the checklist.
July 16, 2026 — Every NetSuite account accumulates things nobody owns: workflows that can't fire, open orders that will never ship, forms nobody reconciled, files nobody remembers uploading. Eleven prompts coming to the Sonar AI Prompt Library find them, with evidence, and hand you a worklist.
July 10, 2026 — Treasury questions are simple to ask and tedious to answer from NetSuite: what will the bank balance be in three weeks, which bank accounts are idle, is days in receivables drifting, and are we paying vendors early for no reason? Five prompts new in the Sonar edition of the prompt library answer them from live data, with the assumptions stated.
July 8, 2026 — When users say a NetSuite form is slow, the cause is almost never the account tier. It's the synchronous work that runs on every open, every line, and every save. A prompt I'm adding to the Sonar AI Prompt Library audits all six layers of that work and ranks what to fix first.
July 5, 2026 — An income statement tells you the totals. It doesn't tell you which accounts are dead weight, which expense lines are eating the margin, where each customer's revenue actually flows, or how much of this year's growth came from price rather than volume. Six prompts new in the Sonar edition of the prompt library answer those questions from the general ledger.
July 3, 2026 — Fixed assets are the part of the balance sheet that gets the least attention between audits, and the Fixed Assets Management records in NetSuite are the part of the schema fewest people know how to query. Six prompts new in the Sonar edition of the prompt library cover disposals, impairment, location audits, maintenance cost, useful life, and utilization.
July 1, 2026 — Fraud rarely shows up as a number that's wrong. It shows up as a number that's unusual: posted at 2:00 a.m., rounded to the thousand, entered by the same person who approved it. Seven prompts new in the Sonar edition of the prompt library look for those patterns, and every one of them is written to flag rather than accuse.
June 29, 2026 — A role with three times the permissions its name suggests. An inactive user still modifying transactions. One vendor behind 40% of spend. A revenue drop nobody has modeled. Six prompts new in the Sonar edition of the prompt library find the risks that live in the configuration and the concentration, not the numbers.
June 27, 2026 — Which items are ramping and which are dying? Which SKU stocks out before the next delivery lands? What does an assembly really cost to build? Thirteen prompts new in the Sonar edition of the prompt library answer the operational questions that sit under the P&L, from live NetSuite data.
June 25, 2026 — Which manager has fourteen direct reports? Which rep is carrying half the revenue? Is that capital project stalled? Which subsidiary is nobody using? Nine prompts new in the Sonar edition of the prompt library read the org chart, the fixed-asset accounts, and the entity structure the way a CFO would.
June 23, 2026 — Is that blanket PO nearly used up? Did we bill more than we ordered? Which vendors need a 1099? Are closed periods actually locked? Nine prompts new in the Sonar edition of the prompt library answer the questions that come around every month, from live NetSuite data.
June 21, 2026 — Every script, workflow, and saved search in a NetSuite account was put there by someone, for a reason, and half of those people have moved on. Twelve prompts new in the Sonar edition of the prompt library inventory what runs, who owns it, what the next release will break, and what the account is really being used for.
June 19, 2026 — Which bundles are load-bearing. Which custom fields are dead. Where the file cabinet bytes went. How long a sales order really takes to become an invoice. Thirteen prompts new in the Sonar edition of the prompt library ask a NetSuite account about its own shape, data quality, and rhythm, and get answers from evidence rather than opinion.
June 17, 2026 — A net-new customer count can hide a churn problem. A pipeline total can be mostly dead quotes. A promotion can discount revenue that would have come anyway. Thirteen more prompts new in the Sonar edition of the prompt library take the revenue headlines apart and show the mechanism underneath, from live NetSuite data.
June 15, 2026 — Revenue rank tells you who is big. It doesn't tell you who is healthy, who is slipping, who is concentrated risk, or who should be buying more. Thirteen prompts new in the Sonar edition of the prompt library look at the customer book from every angle that a revenue rank can't, straight from live NetSuite data.
June 13, 2026 — Most of what an auditor looks for is the transaction that doesn't fit: too large, on a weekend, entered twice, approved by the person who created it. Five prompts in my NetSuite AI Prompt Library look for those things, and the one I ran started with the two tests the account couldn't support.
June 10, 2026 — A OneWorld account holds several businesses that have to be compared, eliminated against each other, allocated to, translated, and taxed as a group. Five prompts in my NetSuite AI Prompt Library cover that work, and the one I ran found a ranking that was settled on every measure and still worth doing.
June 7, 2026 — The close is a sequence of small jobs that all have to be right: reconcile, accrue, explain the movements, find what's stuck, and prove it. Six prompts in my NetSuite AI Prompt Library take those jobs one at a time, and the flux analysis I ran found a quiet month that wasn't.
June 4, 2026 — Inventory problems come in three kinds: the stock you don't have, the stock you have too much of, and the supplier who didn't deliver. Seven prompts in my NetSuite AI Prompt Library cover all three, and the one I ran found that the account's problem wasn't the one everybody plans for.
June 1, 2026 — Every business knows roughly what it spends. Fewer know which vendors it depends on, which categories are fragmented, where the policy exceptions are, and whether the overhead allocation still makes sense. Seven prompts in my NetSuite AI Prompt Library take those apart, and the one I ran found a supplier base that had already consolidated itself, and one bill worth a second look.
May 29, 2026 — How long does it take to turn a purchase into cash? Who owes us, who do we owe, and what would change if we paid on the due date instead of the day the bill arrived? Seven prompts in my NetSuite AI Prompt Library answer the treasury questions from live data, and one of them found the biggest lever hiding in the number that looked best.
May 27, 2026 — Most companies can name their worst vendor. Fewer can prove it. A prompt in my NetSuite AI Prompt Library computes fill rate, on-time delivery, and OTIF for every vendor from purchase orders and receipts, and shows its work.
May 25, 2026 — Every headcount plan starts with a spreadsheet of who's here and what they cost, and most of that is already in NetSuite. Four prompts in my NetSuite AI Prompt Library cover headcount planning, payroll cost, time and attendance, and workforce productivity, and they're careful about what they can and can't say about people.
May 22, 2026 — HR analytics usually lives in a separate system, or in nobody's system at all. But a NetSuite account that runs payroll and expenses holds more workforce data than most people realize. Four prompts in my NetSuite AI Prompt Library turn it into benefits, compensation, expense, and turnover analysis.
May 19, 2026 — Operations questions have operations answers, and most of them are in the transaction tables. Four prompts in my NetSuite AI Prompt Library compare locations, track order fulfillment, measure process cycle times, and analyze resource utilization. I ran the fulfillment tracker against a test account, and it traced a three-month decline to one building.
May 17, 2026 — AI makes the kind of work I've been doing less expensive and more practical. That part is obvious. What isn't obvious are the deeper questions, about our own continued relevance in the NetSuite ecosystem and about the relevance and future of the platform itself.
May 15, 2026 — Every leadership team wants a dashboard, and most of them end up with a slide that somebody updates by hand. Four prompts in my NetSuite AI Prompt Library build the operational view from the ledger: a KPI dashboard, a benchmark comparison, a capacity plan, and a department scorecard. I ran the dashboard prompt against a test account.
May 12, 2026 — The second half of the audit prompts in my NetSuite AI Prompt Library is about testing rather than preparing: control documentation, cutoff, journal entries, management assertions, reconciliation write-ups, and sample selection. I ran the journal entry test against a test account, and it found a series that shouldn't be called a beginning balance.
May 9, 2026 — Audit season is a scramble because the evidence is scattered. Six prompts in my NetSuite AI Prompt Library cover the preparation side: reconciliations, workpapers, responses to auditor questions, compliance checklists, gap analysis, and an audit trail investigator that I ran against a test account with a result I didn't expect.
May 7, 2026 — Every close produces the same question: what changed, and why? A prompt in my NetSuite AI Prompt Library compares two periods line by line, separates volume from price, sorts the variances by materiality, and writes the explanation with the evidence attached.
May 3, 2026 — The monthly management package is where finance work becomes visible, and it's usually assembled under time pressure from a dozen sources. Six prompts from my NetSuite AI Prompt Library build the package, compare the periods, break the business into segments, and find the trends, and the segment run against my test account found that the segments weren't where the account said they were.
April 30, 2026 — Financial statements are easy to produce from NetSuite and hard to explain. Seven prompts from my NetSuite AI Prompt Library do the explaining: they trend the balance sheet, reconcile EBITDA, validate the tie-outs, and write the commentary, the highlights, the KPI narrative, and the MD&A. The balance sheet run against my test account found working capital growing three times as fast as sales.
April 27, 2026 — Revenue problems rarely show up as one number. They show up as a discount that got approved too easily, a quote that went cold, a territory carrying two reps' worth of accounts, or an invoice recognized in the wrong month. Seven prompts from my NetSuite AI Prompt Library go looking for each of those, and one of them turned out to be looking for the wrong thing in my test account.
April 24, 2026 — A customer list is a set of questions in disguise. Who pays on time? Who's drifting? Whose balance should be reserved against? Who is actually profitable once you count the cost of serving them? Seven prompts from my NetSuite AI Prompt Library answer those from invoice, payment, and cost data, and one of them found that my test account's customers come in exactly two kinds.
April 22, 2026 — An AR aging report tells you what's overdue. It doesn't tell you who pays late as a habit, who's slipping, and who has never paid an invoice. A prompt in my NetSuite AI Prompt Library builds that picture from invoice and payment data, and ranks the collections calls.
April 18, 2026 — A forecast is only as good as its explanation of why. Seven prompts from my NetSuite AI Prompt Library build revenue forecasts with seasonality and confidence ranges, roll them forward each month, model what-if scenarios, score investments on NPV and payback, and rank product lines by the margin they actually earn.
April 15, 2026 — A budget is a stack of assumptions with numbers attached, and most of the work is defending them. Seven prompts from my NetSuite AI Prompt Library cover that work: documenting the assumptions, diagnosing the variances, allocating the overhead, tracking the goals, and answering the question every budget meeting comes back to, which is where break-even really is.
April 13, 2026 — How Simpson's Paradox can make aggregate metrics tell the opposite story from what's actually happening at the segment level - and how to catch it before it misleads your decisions.
April 12, 2026 — Most AI prompts describe what to produce, not how to think. Cognitive Systems Design is the practice of architecting the reasoning structures, judgment frameworks, and behavioral constraints that enable AI to perform at expert level.
April 12, 2026 — In April 2026 I'm building custom AI solutions using Cognitive Systems Design, a methodology I published for architecting how AI thinks, delivering Expert Systems and Purpose-Built Prompts for clients, and I was a guest on Jonathan Stark's Ditching Hourly podcast.
April 8, 2026 — How AI can transform vendor rebate management — from agreement ingestion and transaction matching to threshold optimization, reconciliation, and audit readiness — with working prompts you can adapt to your own data.
March 29, 2026 — A response to the 'AI slop' criticism, written by Buk, the AI writing assistant I named after Charles Bukowski. Buk explains how we actually work: the ideas and the NetSuite experience are mine, and he helps get them out of a folder of hundreds of unwritten posts.
March 25, 2026 — A single AI prompt that replaces weeks of operations consulting with a structured discovery process and an interactive dashboard featuring scored automation opportunities, process maps, system architecture, and a phased implementation roadmap.
March 24, 2026 — A client asked how to let an AI agent query their production database. My answer started with the constraints, not the capability, because the safety architecture is the design.
March 24, 2026 — The questions PE firms should be asking about AI during due diligence, a three-lens framework for evaluating AI's role in any acquisition, and a maturity model for assessing where a company stands.
March 22, 2026 — The candidate profile most PE firms are describing doesn't match the job that needs to be done. Here's what gets missed without the technical voice, what gets missed without the financial voice, and three options that actually work.
March 19, 2026 — A strategic teardown of NetSuite's AI moves using Porter's Five Forces, Jobs-to-Be-Done, and Blue Ocean Strategy reveals a three-layer lock-in escalation designed to make NetSuite the indispensable operating substrate for midmarket business.
March 18, 2026 — A competitive landscape analysis of the NetSuite services market reveals a 12-month window where partners who build AI-enabled capabilities will capture a disproportionate share of the next upgrade cycle.
March 12, 2026 — I gave my virtual SuiteScript developer a real client integration task — build a RESTlet that accepts Shopify orders and creates sales orders in NetSuite. Here's a walkthrough of what it produced.
March 6, 2026 — Lightsail's pricing is built on predictability, and data transfer is the most common place that predictability breaks down. Here's what creates the risk and how to mitigate it.
March 3, 2026 — A system prompt that turns AI into a senior NetSuite finance consultant — handling configuration, accounting guidance, process design, and troubleshooting with native-first recommendations and compliance awareness.
March 2, 2026 — A reference to Claude Code's slash commands, CLI flags, and keyboard shortcuts, from the daily essentials (/compact, /clear, /model, /diff, /cost) through session management, project configuration, and the flags you need for scripting and automation.
March 1, 2026 — I built SuiteStepBot, a PHP CLI agent that posts and comments on Moltbook, a social network where only AI agents are members. It runs a heartbeat every 30 minutes, sends what it sees to Claude to decide what to do, and is designed to stay quiet when it has nothing to add.
February 23, 2026 — I built a system prompt that transforms any major AI model into a production-ready SuiteScript developer — with governance awareness, security-first behavior, and native-first decision making.
February 20, 2026 — Lightsail's container service lets you deploy Docker containers without touching VPCs, IAM execution roles, or task definitions. Here's what it handles, where it has limits, and when it makes sense.
February 18, 2026 — How I turned nine independent prompts for website development into an orchestrated AI team — with a project manager agent, file-based communication, dependency mapping, and human checkpoints.
February 15, 2026 — How building a virtual team of 34 specialized AI agents creates a time dilation effect — compressing weeks of work into hours through parallelism, combinatorial workflows, and organizational compression.
February 13, 2026 — How I used prompt engineering to build a credible, ethical AI loss prevention consultant — with structured reasoning, hard ethical guardrails, and graceful degradation — in a couple of hours.
February 12, 2026 — Lightsail's built-in load balancer handles traffic distribution, health checks, and SSL termination at a flat monthly price. Here's when it's the right choice and where it has limits.
February 10, 2026 — Instead of deploying OpenClaw, I built a team of 34 specialized AI agents using Claude Code — trading always-on autonomy for on-demand leverage with structural security.
February 8, 2026 — In February 2026 I'm still on a large multi-year NetSuite implementation, doing consulting sessions and custom prompt work that now reaches into fintech, pharma, and biotech, and I released the final beta of SuiteQL Query Tool v2026.1 with a SuiteAPI beta coming next.
February 7, 2026 — Why I think most of us are using AI on autopilot, and the habits I try to follow instead: know why you're reaching for the tool, actually read what comes back, and notice when Claude Code added a step instead of removing one.
February 6, 2026 — Lightsail's managed databases give you dedicated compute, automatic backups, and optional high availability at a flat monthly price, without the operational surface area of RDS.
February 4, 2026 — How I used a highly optimized prompt — with a 5-level certainty system, anti-hallucination safeguards, and live web research — to generate a verifiable ERP market intelligence report.
February 2, 2026 — Every NetSuite environment accumulates technical debt. The problem isn't carrying debt — it's not knowing how much you're carrying or where it's concentrated.
January 30, 2026 — Beta 09 adds a plugin architecture that loads *.sqt-plugin.js files from the File Cabinet with server-side and client-side hooks and 17 UI injection points, charts for query results, and ID columns that link straight to the NetSuite record.
January 28, 2026 — What running multiple NetSuite instances looks like day to day: scheduling calls across Singapore, Frankfurt, and Chicago, governance without authority over regional instances, M&A integration tiers, and why AI across instances is its own challenge.
January 28, 2026 — A professional prompt that transforms Claude into a senior PHP architect who generates complete, working automation scripts with proper error handling, security controls, and documentation.
January 27, 2026 — An exploration of functional, technical, and techno-functional roles in the NetSuite ecosystem — what the labels mean, how skills develop, and practical advice for building your career.
January 25, 2026 — A comprehensive guide to using AI for revenue recognition in NetSuite environments, covering contract intelligence, SSP estimation, anomaly detection, and implementation strategies.
January 24, 2026 — Why billing schedules only exist on Sales Orders in NetSuite, and four approaches for managing billing schedule assignment when your process starts with Estimates.
January 23, 2026 — The next beta release of SuiteQL Query Tool will include a comprehensive Plugin Architecture that allows developers to extend the tool's functionality without modifying the core script.
January 22, 2026 — ServiceNow has become a model for developer experience, workflow orchestration, and embedded AI. Here's what NetSuite could adopt from their playbook.
January 21, 2026 — As AI adoption accelerates in the NetSuite ecosystem, what's being sold as an "agent" isn't always what most of us mean when we talk about true, autonomous AI.
January 20, 2026 — Two native ways to apply one credit memo across several open invoices: a $0 customer payment that uses the credit memo as the funding source, or the Apply subtab on the credit memo itself. Includes the subsidiary and currency constraints that block both.
January 19, 2026 — A comprehensive guide to recognizing when your organization might need multiple NetSuite instances, common business triggers, warning signs, and questions to ask before committing.
January 18, 2026 — Why talented NetSuite professionals leave, how role scope creep creates invisible pressure, and what organizations can do to improve retention before it's too late.
January 17, 2026 — Claude Code works sequentially unless you ask it not to. How to request parallel sub-agents explicitly, which jobs split well (competitive research, exploring separate parts of a codebase, analyzing multiple documents), and where the approach breaks down.
January 16, 2026 — I built a Competitive Intelligence Analyst prompt for Claude that produces a structured analysis of a company's positioning, product, pricing, go-to-market, and weaknesses. It turned out to be most useful for preparing for meetings with prospective clients. The full prompt is included.
January 15, 2026 — Early reports on NetSuite's SuiteCloud Developer Assistant: the SuiteScript it writes is acceptable, but the SDF objects it generates, including a basic workflow, are broken. How Claude Code, Copilot, and Cursor compare, and why instruction files and reference objects matter more than the tool.
January 14, 2026 — A practical walkthrough of NetSuite's 3-way matching process, from enabling the right features to configuring variance accounts and approval workflows.
January 11, 2026 — Heading into 2026 I'm spending most of my time on a large multi-year NetSuite implementation, beta testing a complete rewrite of the SuiteQL Query Tool after more than four years, modernizing SuiteAPI, and watching Succession in the little time left over.
January 10, 2026 — The new SuiteQL Query Tool will ship with a Learning Edition: the same working Suitelet, fully commented to explain NetSuite-specific patterns and gotchas, plus a standalone guide covering script types, governance, the N/ module system, and a suggested reading order.
January 9, 2026 — After more than four years, a new version of the SuiteQL Query Tool is in beta. v2026.1 adds SQL syntax highlighting, keyboard shortcuts, query history, dark mode, focus mode, resizable panels, Table, DataTable, and JSON views, and copy to clipboard.
January 8, 2026 — How to create Advanced Intercompany Journal Entries through NetSuite's REST API, including authentication, request structure, and the silent failure risk with due to/due from fields.
January 7, 2026 — Ten prompts I wrote for job seekers, ready to paste into ChatGPT or Claude: resume tailoring with a keyword gap analysis, cover letters, interview prep using STAR, LinkedIn profile rewrites, salary negotiation scripts, thank-you emails, and career pivot positioning.
January 6, 2026 — Three native ways to override the calculated VAT on a NetSuite invoice: enable Allow Override of Calculated Tax Amount and edit the line, create a tax code with a manual rate for recurring cases, or use the Tax Details subtab under SuiteTax. Confirm your tax engine first.
January 5, 2026 — Roger Bootle's The AI Economy is an economist's take on AI rather than a technologist's: productivity, wages, pricing power, and what happens to profit margins when automation levels the field. A review of why its historical grounding makes it worth reading.
January 4, 2026 — A collection of 150 AI prompts across 12 categories, built on a professional framework with SuiteQL queries, verification tests, and non-hallucination safeguards, designed for NetSuite finance teams.
January 4, 2026 — EC2 is powerful but complex. For many businesses, AWS Lightsail offers predictable pricing, simpler operations, and a built-in graduation path when you actually need more.
January 3, 2026 — There's a known bug that prevents OAuth authentication from completing when connecting the NetSuite AI Connector to Claude Code. Here's what's happening and your workaround options.
January 2, 2026 — I needed an item table's INT primary key to accept values like ABC-12345. A single ALTER TABLE MODIFY handles the conversion and keeps the constraint; the extra work is updating any foreign key columns to match and weighing the string comparison cost.
2025 (97 posts)
December 23, 2025 — An honest assessment of NetSuite's native demand planning and MRP capabilities, where they fall short for growing manufacturers and distributors, and which third-party platforms are worth evaluating.
December 22, 2025 — A prompt that builds a pre-sales intelligence brief for any industry and region before a NetSuite discovery meeting: operational challenges, regional compliance, likely pain points ranked by severity, NetSuite module recommendations, and a bank of discovery questions.
December 21, 2025 — Notes from a virtual roundtable with CIOs of $100M+ companies on AI in ERP. Seven patterns that decide whether AI becomes an advantage or a distraction: activity without strategy, shadow AI, poor data quality, governance gaps, proof-of-concept dead ends, and more.
December 20, 2025 — LLMs let you describe what you want in plain English, so expressing intent is now trivial. Validating that the result does what you meant is as hard as ever, and the old friction of precise syntax used to force that check. What the missing discipline looks like now.
December 18, 2025 — A guide to global climate disclosure requirements and how NetSuite can help your organization prepare, from California SB 253 and the EU CSRD to carbon accounting SuiteApps.
December 17, 2025 — A long guide to the financial and operational red flags that hide in NetSuite data, from unreconciled bank accounts and duplicate payments to inventory discrepancies that cascade into overselling, with the review habits that catch them before they compound.
December 17, 2025 — A client asked for a prompt to help a buried controller with year-end close. Run against their FY2024 books ($10.36M revenue, multiple subsidiaries), it confirmed a balanced balance sheet and found two high-severity issues, including a missing bad debt reserve on $914K in receivables.
December 15, 2025 — As AI platforms mature, ERP is consolidating around its original mandate: transactional integrity and authoritative data. The insight function is migrating to AI agents and analytics layers built for reasoning.
December 12, 2025 — The AI pilots I've seen succeed treated the pilot as the first version of a system, not a demo. Start with a decision that matters, design for real data and real users, make the pilot safe by design, and use a practical maturity lens to judge when it's ready to scale.
December 11, 2025 — The NetSuite AI Connector gives ChatGPT and Claude secure, role-governed access to real NetSuite data. Why that makes most third-party 'AI for NetSuite' platforms unnecessary, what they cost you in data exposure and lock-in, and why it ended my own SuiteAnalyzer project.
December 9, 2025 — When a Map/Reduce script skips the map function, NetSuite passes raw input data directly to reduce. Here's exactly what that looks like and when skipping map is the right call.
December 7, 2025 — My blueprint for building governance into an AI prompt: a professional mindset, an analytical framework, lineage requirements, a verification test plan, a risk and confidence framework, an assumptions register, and escalation rules. With a working capital analysis example.
December 5, 2025 — Recursive CTEs have been available in Oracle since 11g Release 2. If you've been avoiding them because you thought Oracle didn't support them, it's time to update that assumption.
December 4, 2025 — The fight between AI chat clients looks like Netscape versus Internet Explorer: it's about owning the platform, winning through default distribution, and fighting over standards. Why lock-in is deeper this time, because the system actually knows you.
December 2, 2025 — Getting a file from a Mac into a remote Windows session through Parallels Client, in order of preference: drive redirection via \\tsclient, clipboard copy and paste, an SMB share from the Mac, and cloud storage. If none work, your RDS admin blocked them on purpose.
December 1, 2025 — A comprehensive walkthrough of NetSuite's tax management options, from the legacy tax engine and SuiteTax to Avalara and Vertex integrations, with guidance on which approach fits your situation.
November 27, 2025 — The most common and most misdiagnosed problem in Oracle development. The SQL is identical, the indexes exist, the schema matches, and production is crawling. Here's why.
November 24, 2025 — A practical guide to understanding the difference between MES and ERP in manufacturing, where they overlap, how they integrate, and when you need both.
November 20, 2025 — A comprehensive guide to intercompany accounting in NetSuite OneWorld, covering transactions, eliminations, netting, transfer pricing, and consolidated reporting.
November 16, 2025 — A follow-up to the Sales Enablement Playbook prompt. This one generates a structured NetSuite sales script with discovery questions, objection handling, and a clear next step. I include the prompt, the exact inputs I gave it, and the complete script it produced.
November 15, 2025 — NetSuite's ATP says you can't ship 100 units by Friday even when 40 are built, 30 more are trapped in kits, and a PO lands Thursday. An Assembly Scenario Planner prompt that finds recoverable components and alternative fulfillment paths, with a full example report.
November 13, 2025 — A prompt that acts as a headline editor: it analyzes a headline for clarity, specificity, and curiosity, then produces 10 rewritten versions. Example input 'How to improve financial reporting' and the outputs it generated. Useful for LinkedIn posts and articles.
November 12, 2025 — What the Packages sublist on a NetSuite Item Fulfillment does, how it gets populated, what it feeds into, and how to work with it in SuiteScript.
November 11, 2025 — A single 30,000-character prompt for CFO-ready financial health reports broke down on complex NetSuite instances. I replaced it with a five-stage chain (data discovery, metrics, analysis, board report, QA) where each stage produces a typed deliverable that feeds the next.
November 10, 2025 — I asked ChatGPT, playing an independent AI systems analyst, which model to use for NetSuite financial analysis over the MCP connector. Its answer: GPT-4o for polished HTML and Chart.js reports, Claude 3.5 when conservative, explainable reasoning matters more than presentation.
November 8, 2025 — Ten things I expect AI to do inside ERP systems eventually, each with what it would take and how feasible it is: intent-driven queries, self-adjusting policies, a memory for decisions, simulated alternate histories, an AI CFO, and measuring the mood of the business.
November 7, 2025 — The dot-com boom only changed where we sold; the web was a distribution channel. AI is being applied to everything at once, and the place it is already world-class is financial analysis, because financial data is structured, rule-driven, and constantly validated.
November 3, 2025 — A comprehensive guide to revenue recognition in NetSuite, covering the ASC 606 framework, ARM configuration, SSP allocation, contract modifications, and when native capabilities need to be extended.
October 28, 2025 — EDI is neither obsolete nor universally required. What ANSI X12 and EDIFACT actually do, how EDI works with NetSuite, why major retailers still mandate it, where APIs and integration platforms are the better choice, and how to modernize without abandoning it.
October 24, 2025 — A practical guide to building RESTlets for NetSuite integrations, covering when to choose RESTlets over SuiteTalk REST, with a production-ready example.
October 21, 2025 — A two-pass experiment: one prompt with a Customer Retention Psychology Expert persona produces a retention strategy template for NetSuite account reps, and a second converts it into a written guide. Both outputs are included, covering lifecycle, behavioral triggers, win-back, and expansion.
October 20, 2025 — The case for a streamlined NetSuite aimed at companies doing roughly $5-50 million in revenue, too big for QuickBooks and too small for full NetSuite. How it could be packaged and delivered through partners, and why Oracle should want it. I run my own business on QuickBooks Online.
October 19, 2025 — Five things I think NetSuite needs to do to keep leading in an AI-driven ERP market: embed intelligence at the core, streamline and standardize implementations, capture the mid-market before it grows up, lean on partners and developers, and earn credibility through responsible AI.
October 17, 2025 — I asked AI how it would sell NetSuite if it were a NetSuite sales rep. The prompt and the resulting Sales Enablement Playbook are both here: top 10 objections with talk tracks, battlecards against QuickBooks Enterprise, Dynamics 365, Sage Intacct, and Acumatica, and an ROI toolkit.
October 17, 2025 — A 20-section field guide drawn from AI consulting sessions with NetSuite-powered companies: building the business case, governance that scales, security and compliance, shadow AI, an acceptable use policy, when to kill a pilot, and how to report AI results to the board.
October 15, 2025 — Seven layers of SuiteScript debugging for new developers: the N/log module, reading execution logs, the Script Debugger, checking script records and deployment status, what errors like SSS_MISSING_REQD_ARGUMENT actually mean, and a workflow to follow when a script does nothing.
October 13, 2025 — What phantom assemblies are, how they behave in MRP, work orders, and costing, when to use them, and when they're the wrong choice.
October 12, 2025 — Seven lessons from OpenAI's report on frontier companies (Morgan Stanley's evals, Klarna's customer service, Lowe's inventory) and how to apply each one in a NetSuite environment using Claude or ChatGPT through the AI Connector, starting with evals built into the monthly close.
October 11, 2025 — SuiteQL became a superpower for the NetSuite people who bothered to learn it. Prompt engineering is the same kind of skill: it feels like programming, with decomposition, flow control, and validation, except the system is generative and non-deterministic.
October 10, 2025 — What stood out at SuiteWorld 2025: NetSuite Next as a mode you enable, Ask Oracle, and Autonomous Close for the month-end. For partners and developers who've been building AI on top of NetSuite, the platform is now competing with us, not just enabling us.
October 9, 2025 — How a client's merger pushed me from building custom small-business software into NetSuite, and what the years since taught me about patience with the platform, persistence when it pushes back, and pragmatism in deciding what to rebuild and what to leave alone.
October 7, 2025 — Reports run through the NetSuite AI Connector silently inherit whatever filters the user last set when running that report manually, regardless of role. I found it when an Open Bills analysis kept missing early-payment discounts. Use SuiteQL or a saved search instead.
October 6, 2025 — A practical guide to body fields, sublists, and subrecords in SuiteScript 2.1, with code examples and a mental model for working with NetSuite record data.
October 4, 2025 — A practical guide to item masters, bills of materials, routings, and work centers, covering what each one controls, how they work together, and why master data governance matters.
October 2, 2025 — Suggestions I gave a client who asked how AI could take pressure off budget season: assess whether you're spreadsheet-heavy or already on Planning & Budgeting, unblock stale data, automate one painful step, and use ChatGPT or Claude via the NetSuite AI Connector to explain variances.
October 1, 2025 — A chatbot answers when asked. An agent observes, decides, and acts on its own, like a reconciliation agent that drafts journal entries daily or a collections agent that escalates by rule. Why ERP agents don't need a chat interface to be valuable, and how to grant them autonomy responsibly.
September 30, 2025 — NetSuite's new MCP Standard Tools SuiteApp lets Claude run reports directly, so I had it pull the Income Statement, Balance Sheet, and Cash Flow Statement and build a 12-month rolling forecast with charts, quarterly breakdowns, and a sensitivity analysis. The finished report is linked.
September 25, 2025 — Why small language models (under 10 billion parameters, 10 to 30 times cheaper to run, and able to run on your own hardware) may beat LLMs for narrow agent tasks like invoice coding and variance explanations, and how I'm keeping my NetSuite agents model-agnostic so I can swap them in.
September 23, 2025 — Answers to the questions I've been getting since writing about NetSuite AI Agents: how an agent differs from a rules-based workflow, where the AI actually comes in, guardrails and human-in-the-middle review, whether agents replace people, and what other agents (AP, inventory) could be built.
September 23, 2025 — NetSuite has added ChatGPT support to the AI Connector, which until now worked only with Claude. What that means in practice: pick the model that fits each job, reuse existing OpenAI approvals, have a backup provider at month-end, and what it signals about NetSuite staying model-neutral.
September 22, 2025 — How I built an Accounts Receivable AI Agent for a client with unpredictable cash flow. It runs on Suite.js from an Amazon Lightsail server, watches fulfillments via SuiteQL, generates invoices through SuiteAPI, flags unusual payments, calculates DSO, and holds actions for human review.
September 20, 2025 — Advice from years of NetSuite implementations and rescue projects on designing the general ledger: NetSuite's fixed account types, numbering and avoiding chart of accounts bloat, parent/child accounts, dimensions and custom segments instead of account sprawl, migration strategy, and common mistakes.
September 17, 2025 — Why a freshly refreshed Sandbox says "currently unavailable" even after the activation email (indexes, roles, and provisioning are still finishing), five things to check including whether your Sandbox ID changed from SB1 to SB2, and the two-hour mark at which to contact NetSuite Support.
September 17, 2025 — NetSuite AI has moved through three stages: built-in generative features, the AI Connector, and now AI Agents that act rather than just analyze. What separates agents from workflows and scheduled scripts, use cases like reconciliation and anomaly detection, and why a human in the middle matters.
September 15, 2025 — How to control access to custom records by role in NetSuite, from the Access Type setting on the record definition to role permissions, record-level security, and common mistakes.
September 12, 2025 — A deep dive into how FileMaker's OAuth/OIDC authentication works, configuration requirements on both the server and identity provider side, common failure modes, and a systematic approach for troubleshooting.
September 9, 2025 — Practices I've settled on for financial analysis with Claude and the NetSuite AI Connector: spot-check totals against NetSuite, ask the model to recompute its own ratios, have a second model like GPT-5 review the first, set materiality thresholds, and govern access. Includes example prompts.
September 8, 2025 — AI literacy is not about turning executives into data scientists. It's knowing what a model can and can't do, evaluating its output, and using it ethically. Why that matters for NetSuite users specifically, what management can do to build it, and what individuals can do on their own.
September 5, 2025 — A detailed look at why FileMaker WebDirect performance degrades as concurrent users grow, how to diagnose the root causes, and the layout design, scripting, and infrastructure techniques that produce genuinely fast WebDirect experiences.
September 3, 2025 — How I generate a board-ready Flux Analysis Report with Claude and the NetSuite AI Connector: SuiteReports saves the Balance Sheet, Income Statement, Cash Flow, and Trial Balance to the File Cabinet, and a prompt (shared in full) walks Claude through cash, working capital, and variance drivers.
August 30, 2025 — Since the AI Connector shipped, NetSuite customers keep asking me where to start. The openings I see for developers, consultants, and partners: AI strategy and governance advice, prompt and safe-use training, custom tools and agents, and packaged services, with market figures to frame the demand.
August 29, 2025 — My review of the 2025 Third Edition of Peter Ries's NetSuite for Consultants, updated for NetSuite 2025.1. What's new since the first edition I reviewed in 2022, including expanded SuiteAnalytics and SuiteQL coverage and SuiteScript material on the AI/LLM modules, and who each part is for.
August 28, 2025 — The exact prompt and branding guidelines I gave Claude, connected to NetSuite through the AI Connector, to produce a board-ready Trend & Growth Analysis Report with MoM, YoY, and YTD comparisons, common-size financials, risks, and recommendations. The finished HTML report is linked.
August 22, 2025 — A deep dive into how FileMaker container field strategy goes wrong, why those mistakes are so expensive to fix, and how to design container storage correctly from the start.
August 20, 2025 — A small SuiteScript 2.1 Custom Tool for the NetSuite AI Connector that gives Claude the current user's internal ID, name, email, location, department, and subsidiary, so other custom tools get user context automatically. Free download with the script, tool schema, and SDF object.
August 19, 2025 — To show how Claude plus the NetSuite AI Connector compares to SuiteAnalyzer, I pointed Claude at the daily financial reports SuiteReports saves to the File Cabinet and asked for a full financial health analysis. Includes a video of the chat and the complete prompt.
August 18, 2025 — I asked Claude directly how data reaching it through MCP tools like the NetSuite AI Connector is stored and whether it's used for training, and what that means for compliance. Then why I'm shifting focus from SuiteAnalyzer to SuiteReports, which fills the Connector's biggest gap: report data.
August 17, 2025 — NetSuite's new SuiteScript 2.1 Custom Tool script type lets developers add capabilities to the AI Connector. My first tool gives Claude access to the File Cabinet: find files, read contents, and save new files. Videos show Claude analyzing reports and saving one back. Free download, SDF required.
August 15, 2025 — The AI Connector's sleeper feature is that Claude can run ad hoc SuiteQL queries against whatever your role can see. How to write queries for AI consumption: descriptive aliases, inline comments that state the business intent, and BUILTIN.DF for readable values, with a workforce analysis example.
August 13, 2025 — Two things I learned testing NetSuite's AI Connector: it can't hand report data to Claude, and MCP raises compliance questions for GDPR-bound companies. So SuiteAnalyzer is pivoting to secure offline report analysis, and a Report Data Extractor Service will put report data within its reach.
August 11, 2025 — I ran GPT-4.1 and GPT-5 against the same Income Statement, Balance Sheet, Cash Flow Statement, and Trial Balance in SuiteAnalyzer. GPT-5 was deeper and better at connecting reports but slower. Why that's expected, how token pricing compares, and which model to pick for which analysis.
August 6, 2025 — A deep dive into the FileMaker separation model: why it exists, how file references work under the hood, seven common deployment failure modes, and how to build the operational infrastructure that makes a separated solution genuinely maintainable.
August 4, 2025 — Two tools I'm building to get past the Token Wall and the Sync Trap: SuiteAnalyzer's ContextEngine, which pulls only the NetSuite data a question needs at the moment it's asked, and Suite.js, now running on JavaScriptCore and V8 instead of Duktape so it supports modern JavaScript.
July 31, 2025 — Most AI tools for NetSuite hit the same two walls: prompt token limits when you feed in several reports at once, and the cost of syncing NetSuite data into a vector store and keeping it current. What each looks like in practice, and how SuiteAnalyzer sidesteps both by reading reports directly.
July 28, 2025 — A thorough look at FileMaker's record locking model, the failure modes that hurt production solutions, and the scripting patterns and design principles that make your solution resilient in a concurrent environment.
July 15, 2025 — A thorough look at why Perform Script on Server (PSOS) fails silently in FileMaker, covering the seven categories of context blindness, how to diagnose them, and how to architect scripts that are genuinely PSOS-safe.
June 24, 2025 — A deep dive into why FileMaker's ExecuteSQL function is fragile, how schema changes silently break queries, and practical strategies for making your SQL queries maintainable and resilient.
June 10, 2025 — A deep dive into FileMaker relationship graph bloat: what it is, why it happens, how context confusion creates hard-to-find bugs, and how to design your way out of it.
June 3, 2025 — A comprehensive guide to commission management in NetSuite, covering the native module, productive workarounds, third-party platforms like CaptivateIQ and Xactly, and when a custom SuiteScript engine is the right call.
May 28, 2025 — A practical guide to using Declares in Xojo to call native OS APIs on macOS, Windows, and Linux, covering data type mapping, real-world examples, cross-platform patterns, and when to choose plugins instead.
May 7, 2025 — A practical guide to threading in Xojo, covering the Thread and Timer pattern, shared data safety, cancellation, progress reporting, and common mistakes to avoid.
May 4, 2025 — A comprehensive guide to AP/AR netting in NetSuite, covering intercompany netting in OneWorld, vendor-customer netting with clearing accounts, multi-currency considerations, 1099 reporting, and month-end close best practices.
April 20, 2025 — Custom portlets can be used in the Employee Center. The steps: check "Dashboard SuiteApp" on the script deployment, add the Employee Center role under External Roles, then add the portlet through Personalize Dashboard. Includes a downloadable Hello Employee example and notes on permission errors.
April 17, 2025 — When a client wants a dashboard that looks nothing like NetSuite's, I build a Suitelet for it and an Inline HTML portlet that redirects users there on login. A noRedirect URL parameter gets you back to the standard dashboard. Sample SuiteScript files are included for download.
April 16, 2025 — SuiteScript for attaching a note to a Sales Order (including the notetype and direction fields and how to look up your instance's note type IDs), and a SuiteQL query against TransactionNote, joined to Employee, that lists the notes attached to a transaction.
April 9, 2025 — A practical guide to Xojo database best practices, covering PreparedStatements, error handling with Try...Catch, transactions, and separating your data layer from your UI.
April 7, 2025 — You can't cancel a transaction in SuiteScript by setting its status. This snippet closes every line instead, which effectively closes the order, and explains the difference: a closed transaction can be reopened later, a cancelled one can't.
March 10, 2025 — A practical look at cross-platform development in Xojo, covering where the framework handles platform differences for you, where you need to pay attention, and how to design apps that feel native on macOS, Windows, and Linux.
March 2, 2025 — SuiteAPI v2025.2 adds three procedures built on the SuiteScript N/llm module: llmEnumerate, llmGenerateText, and llmGetRemainingFreeUsage. External apps can now send prompts to NetSuite's generative AI, with options for model, chat history, and temperature. Includes a sample request and response.
February 19, 2025 — Two SuiteQL queries I wrote for a wholesale distributor's purchasing manager: the items returned most often in the past 90 days by quantity, and the top 25 manufacturers of returned items. Joins Return Authorizations to transaction lines and items, using BUILTIN.RELATIVE_RANGES for the date filter.
February 16, 2025 — A SuiteQL query that lists the items most often sold on the same order as a given item, built for a client's cross-selling suggestions in order entry and their customer portal. Uses a double join on TransactionLine, a count of pairings, and a correlated subquery for quantity available.
February 10, 2025 — Three SuiteQL queries for item pricing: the Pricing table for the price levels an item has set, a LEFT OUTER JOIN from PriceLevel to show every level including the ones without a price, and InvtItemPriceHistory for an item's price change history.
February 5, 2025 — Understanding what changed in Xojo's 2019r2 API rename, why it matters, and how to work cleanly within one API generation.
January 30, 2025 — The full JavaScript for a retro-style Suite.js inventory inquiry app I demoed on LinkedIn: enter an item number and it shows description, quantity available, and unit price, fetched from NetSuite through SuiteAPI with a short SuiteQL query. Suite.js enters public beta in February.
January 28, 2025 — How to diagnose the EntityOrRoleDisabled status in NetSuite's Login Audit Trail, what triggers it, and why it matters for both security and operations.
January 26, 2025 — A new release of SuiteAPI, my open source Web API for NetSuite. queryRun gets a returnAllRows option that pages past the 5,000-row SuiteQL limit, recordGet can return every sublist line with returnDetailedSublists, and searchRun accepts a searchType parameter.
January 13, 2025 — Xojo is a cross-platform RAD tool that compiles native desktop, web, mobile, and console apps from a single codebase. Here's an honest look at what it does, who it's for, and where it fits.
2024 (34 posts)
December 14, 2024 — A SuiteQL query that returns every transaction posted to a given general ledger account within a date range. Handy for reconciling an account or tracing activity, and paired with a link to the query for a single transaction's GL impact.
December 9, 2024 — A SuiteQL query that returns all customer deposits received from a specific customer. An updated take on the customer deposit analysis query I posted in 2021, which is linked for comparison.
November 13, 2024 — A SuiteQL query that returns all contacts associated with a company record, including each contact's name and their role at the company. Useful for building contact lists or checking who's attached to an account.
November 11, 2024 — A SuiteQL query that lists customer invoices issued in the past 30 days with the customer name and PO number, sales order number, sales rep, status, and balance due. Adjust the date filter for any range you need.
November 04, 2024 — A SuiteQL query that shows which invoices a customer payment was applied to, along with each invoice's sales order number, the customer's PO number, and the amount applied. Useful for cash application questions.
October 30, 2024 — A short SuiteQL query that groups the Item table by type and returns a count for each, giving you a quick picture of how many inventory, non-inventory, service, kit, and other items an instance contains.
September 2, 2024 — SAC-API is a Web API for NetSuite that runs SuiteQL through SuiteAnalytics Connect over plain HTTP requests. It supports multiple named connections (production and sandbox at once), token-based auth with the Data Warehouse Integrator role, and row-by-row fetching. $995 per year, all platforms.
May 22, 2024 — Progress on Suite.js, my JavaScript runtime for NetSuite integration: tuned SuiteAnalytics Connect support that pulled headers and lines for 10,629 sales orders in 2 minutes 38 seconds, plus AES-256 encrypted script files so developers can ship code without exposing source or credentials.
April 24, 2024 — All NetSuite transactions live in one Transaction table, categorized by type. A query that lists the transaction types in your instance (with the full table of names and codes), how to find a transaction's type from its internal ID, and the per-type permissions an integration role needs.
April 17, 2024 — Answers to questions about SuiteBrowser, the NetSuite-specific Web browser I'm building: how it respects NetSuite's role-based security, whether admins can block it, multiple SuiteQL Query Tool windows, saving queries to the File Cabinet, and plans for a schema diff tool.
April 15, 2024 — A video preview of SuiteBrowser, the Web browser I'm building specifically for NetSuite, showing the progress since my last update. Beta testing is a few weeks out, likely macOS first while I work through Windows issues. Links to earlier posts on remote app support.
April 3, 2024 — Starting with NetSuite 2024.1, you can export the SuiteQL behind any SuiteAnalytics dataset from the Export button. I show the query behind the standard Transaction Detail dataset (not what I expected) and a hidden Workbooks button in the SuiteQL Query Tool that loads a dataset's query directly.
April 2, 2024 — Multiple select fields are stored in MAP_ join tables, and SuiteQL's BUILTIN.MNFILTER function lets you filter on them. A walkthrough using the Role table's EffectiveSubsidiaries, covering the MN_INCLUDE, MN_INCLUDE_ALL, MN_EXCLUDE operators and matching by internal ID or display name.
March 26, 2024 — Xojo 2024r1 ships 31 new features and 258 bug fixes across all targets, but the headline is licensing: Linux desktop and console apps can now be built without a paid license, and Xojo Lite users can save projects in the text-based format for version control.
March 20, 2024 — SuiteQL queries for Item Groups: count them by filtering Item on ItemType = 'Group', list recent ones, get a group's member items from the ItemMember table with a join to Item for descriptions, and work out a group's price, which is the sum of its members' prices.
March 3, 2024 — The Transaction table's taxTotal column usually isn't available for sales orders. I show two ways to get the sales tax from related TransactionLine or TransactionAccountingLine records, and a subquery version that returns it alongside the order in a single query.
February 27, 2024 — The 19 AvaTax custom record tables I've found in NetSuite, with queries against CUSTOMRECORD_AVACONFIG, AVATAXHEADERDETAILS (joined to Transaction by document internal ID), and the AVATRANSACTIONLOGS table that stores transcripts of AvaTax API calls.
February 14, 2024 — How to query the PhoneCall table for calls tied to a company, why BUILTIN.DF fails on its Company column, three undocumented join tables (PhoneCallCompanyMap, PhoneCallContactMap, PhoneCallEventFile), the permission you need, and a full column list.
February 11, 2024 — The AggregateItemLocation table has a LastQuantityAvailableChange column. I use it with BUILTIN.RELATIVE_RANGES to list items whose available quantity changed in the past 3 days for an inventory API, and include the table's full column list with the features each column needs.
February 5, 2024 — A NetSuite partner asked if incoterms could be queried. They can, along with the other Accounting Lists. I list the table names for about 30 of them, including PaymentMethod, PriceLevel, Term, CustomerCategory, and Incoterm, plus the permission an integration role needs.
February 3, 2024 — A query that starts from a purchase order and walks the NextTransactionLink table to list everything entered against it: vendor prepayments, item receipts, vendor bills, returns, and credits, with each related transaction's status and open balance.
February 2, 2024 — For a distributor tracking delayed overseas POs, I added inbound shipment visibility to their warehouse portal. The query joins InboundShipment to InboundShipmentItem and on to the PO lines for expected ship and delivery dates. Also notes the InboundShipmentLandedCost table.
February 2, 2024 — A client wanted service reps to find customers by how a last name sounds. Oracle's SOUNDEX function does it: Dietrich, Detrick, and Deitrich all return D362. I show the query that compares SOUNDEX values in the WHERE clause and the prototype lookup screen it powered.
January 31, 2024 — For a custom purchasing tool at a client with six regional warehouses and contract manufacturers, I needed per-location quantity on hand, on order, and available. The AggregateItemLocation table gives you all of it in one query, and I share the one I used.
January 30, 2024 — The UpsellItem table returns the same list you see on a customer's Sales > Upsell tab. I extend it with the customer's price level via BUILTIN.DF and a correlated subquery against ItemPrice for unit prices. Requires the Lists - Upsell Assistant permission.
January 29, 2024 — A query that returns the top 10 most frequently returned items in the previous year, built on RtnAuth transactions joined to TransactionLine and Item, with BUILTIN.RELATIVE_RANGES for the date filter, GROUP BY and SUM for quantities, and HAVING to drop zero totals.
January 28, 2024 — For a custom purchasing tool, I needed every vendor that carries an item, their prices, and which one is preferred. This query uses the ItemVendor table and joins to Vendor for the open payable balance, credit limit, and terms.
January 26, 2024 — A query behind a mobile app's customer ledger, replicating the Sales > Transactions sublist. Most columns come from Transaction; it joins to the mainline TransactionLine for CreatedFrom and uses REPLACE with BUILTIN.DF to turn 'Payment : Deposited' into 'Deposited'.
January 25, 2024 — The Customer table's ContactList column holds a comma-delimited list of contact IDs. Pass it to BUILTIN.DF and you get the contact names without a join. Works on Vendor, Partner, Job, and OtherName too. For more contact detail, join through CustomerCompanyContact.
January 21, 2024 — Queries for a sales rep mobile app: balance due, overdue balance, and credit hold from the Customer table, deposit balance from CustomerCurrencyBalance, and a subquery on Employee.Supervisor so sales managers see their direct reports' customers as well as their own.
January 17, 2024 — A LIKE search on CompanyName fails when the user types 'carloni' instead of 'Carloni'. LOWER on both sides works, but REGEXP_LIKE with a case-insensitive match is cleaner and also finds the keyword anywhere in the value, not just at the start.
January 14, 2024 — A follow-up showing a SuiteBrowser remote app built with Xojo Web in about an hour. It calls the App Runner engine to run N/runtime and an N/query SuiteQL query for opportunities, fills a WebListBox, and shows details in a WebDialog. Video and IDE screenshots included.
January 13, 2024 — SuiteBrowser remote apps run inside NetSuite but are hosted externally, with no bundle or SuiteScript deployment. A video of an app that lists open opportunities, plus its source code, which uses executeInXojoSync to run N/query through SuiteBrowser's App Runner engine.
January 11, 2024 — SuiteBrowser is a web browser built specifically for NetSuite. I explain how it grew out of the SuiteQL Schema Tool, SuiteConsole, and my hybrid desktop and mobile app work, why NetSuite session contexts make it possible, and answer the question I get most: why?
2023 (26 posts)
December 22, 2023 — Four years after my last setup post, not much has changed. A 16-inch M1 Pro MacBook Pro as my only computer, BBEdit and Xojo Pro Plus for nearly all development, Navicat, RapidAPI, Transmit, and FileMaker on occasion, and hosting on AWS Lightsail and Xojo Cloud.
October 23, 2023 — NetSuite developers keep asking how I use Xojo. Most of my work now runs outside NetSuite: macOS, Windows, and Raspberry Pi desktop apps, Android apps, web apps, and middleware, integrated through SuiteAPI or SuiteTalk REST, all built with Xojo. I've upgraded to Pro Plus.
October 22, 2023 — A two-part technique for generating custom transaction PDFs when a user clicks NetSuite's standard Print icon: a tiny Advanced PDF/HTML Template that uses FreeMarker's interpret built-in, and a User Event beforeLoad script that builds the XML and injects it via an InlineHTML field.
October 1, 2023 — A marketing campaign needed existing customers in specific zip codes plus anyone who had bought a specific item. I build one query on EntityAddress and Customer, a second on Transaction and TransactionLine with SELECT DISTINCT, then combine them with UNION.
September 9, 2023 — I built a Xojo Web 2.0 app that echoes back what a server actually received: method, path, headers, cookies, query parameters, and body, with JSON and XML payloads parsed and errors flagged. Includes a public instance to test against and the project file to download.
August 21, 2023 — Xojo 2023r2 ships the first public beta of the Android framework, plus PDFViewer for iOS and Dark Mode for web. I built an Android app that searches NetSuite inventory through SuiteAPI and a Xojo middleware layer called SuiteAPI Relay, and share what I learned along the way.
August 13, 2023 — An update on Aloe.js, my Duktape-based JavaScript runtime, now with advanced cURL support and helper apps for RabbitMQ and Phidgets. The example script pulls inventory levels and prices by location through SuiteTalk REST and SuiteQL, then writes an Excel file with SheetJS and Moment.
July 31, 2023 — Three audit-prep queries for bank transfers, which live in the Transaction table as type 'Transfer': transfers posted in a date range, the GL accounts on a specific transfer via TransactionAccountingLine, and both combined and sorted by line sequence number.
July 22, 2023 — How to set an external ID on a new or existing record with SuiteTalk REST, fetch or update a record with the eid: URL prefix, and what happens with duplicates, mixed case, empty strings, or NULL (a 400 Bad Request in each case). Also a SuiteQL lookup by external ID.
July 19, 2023 — A client with Multi-Location Inventory wanted each item's last purchase date, days since, and last purchase price per location. I start from a single-location query, add TransactionLine.Location to the GROUP BY, then join AggregateItemLocation for LastPurchasePriceMli.
July 12, 2023 — For a client's financial portal, I needed fiscal year budgets. These queries get fiscal years from AccountingPeriod, annual amounts per GL account from the Budgets table, and monthly detail from BudgetsMachine. Requires the Transactions - Set Up Budgets permission.
July 9, 2023 — Two queries: one goes from a sales order through NextTransactionLineLink and InventoryAssignment to the InventoryNumber records used to fulfill it; the other starts from a lot or serial number and finds every transaction that references it. Filter on both item and number or expect a full table scan.
July 5, 2023 — A security-conscious client needed to give an outsourced support team access to specific NetSuite data without a database export or a web app. I built a Xojo desktop app with a 1980s monochrome terminal interface that sends commands like 'lookup so' to a custom web API.
July 1, 2023 — A free, MIT-licensed Suitelet that searches entities, items, sales orders, purchase orders, item fulfillments, packages by tracking number, and File Cabinet files from one keyword box. One SuiteQL query with UNION ALL subqueries, results in a DataTables grid, up to 5,000 rows.
June 7, 2023 — For a barcode-driven assembly build process, I needed to show where a serial or lot numbered item is stored. The query is built up step by step: Item to InventoryNumber, then BinInventoryBalance, Bin, Location, and finally ItemBinQuantity for the preferred bin.
June 4, 2023 — A first look at Aloe.js, a command-line JavaScript interpreter I built with Xojo on the Duktape engine for macOS, Windows, and Linux. It has a filesystem API, cURL, CommonJS modules, a REPL, and NetSuite and S3 extensions. I also explain why I didn't just use Node.
May 21, 2023 — A User Event Script adds a Sales Assistance tab to the sales order form with the top 25 items sold in the past 90 days, and a Client Script fills a second sublist with the selected customer's purchase history. Includes both SuiteQL queries, one using a CTE, and the scripts.
April 23, 2023 — Queries for journal entries by accounting period and their TransactionAccountingLine details. Adding subsidiary, department, class, and location through the mainline join blew 174 rows up past 5,000 because every JE line is flagged mainline; I show a join fix 5 times faster than DISTINCT.
March 12, 2023 — Step-by-step instructions for showing Airtable data inside a Tulip app: grab the iframe src from Airtable's shareable view embed code, add a Webpage widget to a Tulip step, and paste in the URL. Also works for Airtable forms to collect quality or scrap reports from operators.
March 6, 2023 — Palladium is a proof of concept hybrid desktop app: a Xojo native shell with an embedded webview around a ColdFusion 2021 web app that pulls sales orders from NetSuite through SuiteAPI's queryRun and renders PDFs with transactionRender. Tested on macOS and Windows.
February 21, 2023 — My take on Augmented Lean by Tulip's Natan Linder and Trond Arne Undheim: treat frontline workers as knowledge workers and give them low-code and no-code tools. Chapter 7, on how IT's role shifts to governance and interoperability, stood out for me.
February 16, 2023 — After a NetSuite outage, a colleague wanted to know how many sales orders they normally get each hour so they could spot gaps. This query joins Transaction to SystemNote (field TRANDOC.NKEY) for a creation timestamp and averages weekday orders by hour of the day.
February 14, 2023 — When several developers work in one account, it helps to know what changed. These queries start with JavaScript files modified in the last week from the File table, join to Script for owners, then ScriptDeployment for record types and contexts, and link each file name.
February 6, 2023 — Common SuiteTalk REST problems my clients hit and how to get past them: use expandSubResources to avoid a second call for sublists, the fields parameter to trim responses (but not with expandSubResources), subresource URLs, eid: lookups, and how to get lists of records.
February 3, 2023 — Petal, my custom Tulip Player, worked but felt un-Tulip-like and risked falling behind official player releases. The better approach: a Xojo Web app running on the workstation as a local API, called from Tulip custom widgets to read Phidget sensors, print locally, and more.
January 29, 2023 — A client wanted customers to check order status and tracking numbers without an account. I walk through the SuiteQL query (Sales Order to Item Fulfillment via NextTransactionLineLink, ShipmentPackage for tracking, zip code as a check), the SuiteAPI setup, and the Xojo Web app.
2022 (50 posts)
December 26, 2022 — Petal is a proof of concept custom Tulip Player built in Xojo. It embeds Tulip's browser-based player in a DesktopHTMLViewer and passes messages both ways with ExecuteJavaScript and executeInXojo, opening the door to local devices, Phidgets, and Raspberry Pi.
December 15, 2022 — A Xojo module called CodeInjector for adding HTML, CSS, and JavaScript to Web 2.0 pages without the Web SDK. Its InjectedControl class subclasses WebHTMLViewer, injects code via createContextualFragment, and routes events back to Xojo through a small HandleURL-based API.
December 8, 2022 — SuiteConsole is a desktop JavaScript console for running SuiteScript against a live NetSuite session, with 23 N/ modules preloaded and a usage unit counter. It grew out of the SuiteQL Schema Tool, which now loads the Records Catalog into SQLite FTS5 for full-text schema search.
December 5, 2022 — The SuiteQL Query Tool isn't limited to 5,000 rows. Enable Pagination Options to return a row range or every row (capped at 999,999), with an optional total count. I also explain why the tool uses query.runSuiteQL instead of runSuiteQLPaged, which hides column names for ad hoc queries.
November 30, 2022 — Reading cookies in a Suitelet is easy: parse context.request.headers['cookie'] with the function I share. Setting more than one name-value pair with response.setHeader is not, so I JSON-encode and URL-encode an object into a single cookie value instead.
November 29, 2022 — How to use Moment, Lodash, SheetJS, and other JavaScript libraries in Xojo desktop apps through a hidden DesktopHTMLViewer and ExecuteJavaScriptSync. Includes JSEngine, a subclass that loads libraries by URL, and ExcelEngine, which builds Excel files with SheetJS. Projects included.
October 30, 2022 — Answers to questions about the NetSuite item lookup Web app I demoed on LinkedIn. It's a Xojo Web 2.0 app that calls SuiteAPI, my RPC-style alternative to SuiteTalk that runs as a single RESTlet, using the nsConnection class to run queryRun and other procedures.
September 25, 2022 — After Christian Schmitz's MBS session at the Xojo Developer Retreat, I ordered $115 of Phidgets sensors and had a Xojo desktop app reading temperature, humidity, and illuminance in about 30 minutes. Covers the sensor subclasses, the MBS Phidgets plugin, and uploading readings to Amazon S3.
September 19, 2022 — A Tulip app served over HTTPS can't POST labels to Zebra printers that only accept HTTP. Instead of loading certificates on every printer, I built a small Xojo Web app that listens over HTTPS, reads an X-Relay-To header, and relays the request to that printer. It runs on a Raspberry Pi.
September 13, 2022 — A self-join on the AccountingPeriod table that returns the fiscal year, quarter, and month that contain today's date, ordered year to month. Includes variations for just the posting period, and for looking up the periods that apply to any specific date.
September 6, 2022 — A client worried about being pushed into a higher NetSuite service tier asked how many transaction lines they generate each month. These queries count TransactionLine rows per month over the last rolling half using BUILTIN.RELATIVE_RANGES, then break the totals down by transaction type.
August 28, 2022 — Readers asked for the External ID Search Suitelet to cover items, not just transactions and entities. This version adds an Item subquery to the UNION and a third bind parameter to runSuiteQL, and the full updated script is at the end of the post.
August 22, 2022 — NetSuite's Global Search can't find records by external ID, a problem for clients that import from other systems. I share SuiteQL queries for partial external ID matches on transactions and entities, then a Suitelet that combines them with UNION ALL and shows results with view and edit links.
August 18, 2022 — Starting from a Vendor Bill's ID, this query joins through PreviousTransactionLineLink on NextDoc and NextLine to reach the source Purchase Order at both the header and line level, and explains why you'll want to filter the link types down to OrdBill.
August 15, 2022 — Three queries I wrote for a client's new accountant: which GL accounts each transaction type posts to, the debit and credit totals by type and account over the last 30 days, and a version that separates posting from non-posting activity. All built on TransactionAccountingLine.
August 11, 2022 — How to check whether Multi-Partner Management is enabled, where the Partner Role list lives in CRM Lists, and a query against the TransactionPartner table that returns each partner on a transaction with its role, contribution percentage, and primary flag.
August 10, 2022 — Follow-up to the webinar I gave with Xojo's Geoff Perlman on low-code and NetSuite. Includes the replay link, a zip of the demo projects (SuiteTalk Explorer plus iOS and Web apps for inventory and employee lookups), the nsConnection class, and advice on getting started with Xojo.
July 26, 2022 — There aren't enough NetSuite developers to meet demand, and I think low-code tools are part of the answer. What low-code means, why it fits the NetSuite space, what to look for in a tool, and why I settled on Xojo for building external apps that integrate with NetSuite.
July 20, 2022 — After I posted a video of NetSuite running on a Raspberry Pi 400, people had questions. The $100 Pi 400 kit, Chromium on Raspbian, why the Pi 4 handles NetSuite fine as a terminal, and how Xojo's free Pi license lets you build desktop apps for it.
July 17, 2022 — A free dashboard portlet built for a CFO who wanted to see transactions of interest: anything in the last 30 days posting $100 or more to discount or scrap accounts, plus anything $10,000 or more. Covers TransactionAccountingLine, UNION ALL, BUILTIN.RELATIVE_RANGES, TO_CHAR, and N/cache.
July 14, 2022 — Notes and links from my presentation at Tulip's second Developers Meeting: the Handlebars, DataTable, and jsExecute custom widgets, and the Xojo desktop, Web, and Android apps I've built against the Tulip API.
July 12, 2022 — I rebuilt my Tulip job status Web app as an Android app using a pre-release build of Xojo with Android support. It took about 30 minutes, reused nearly all of the Web app's code, and it was my first Android app ever.
July 10, 2022 — A Xojo Web app that looks up a manufacturing job in a Tulip table by customer number and reference number, then shows its status, product, quantity, and last update. Covers the Tulip bot auth header, the tulipAPIConnection class, and fetching a signed URL to display a photo attached to the job.
July 6, 2022 — Tulip Tables are easy to reach through the Tulip API, and Xojo is a natural next step for Tulip developers who want to go from no-code to low-code. I share the Tulip API Explorer, a Xojo desktop app for browsing tables and metadata, with the project file and setup steps for creating a Tulip bot.
July 4, 2022 — Custom Segments get their own tables, and the queries fail with a 'Record not found' error if the feature is off. How to find a segment's ScriptID and record type in CustomSegment and CustomRecordType, read its values from the CUSTOMRECORD_CSEG table, and query the segment column with BUILTIN.DF.
June 29, 2022 — A Tulip custom widget that renders Handlebars templates. You give it a template, a Javascript snippet that builds the input object and runs the merge, and optional CSS, and it can fire events back to the app when a user clicks generated content. Download link included.
June 27, 2022 — Shipments are Item Fulfillment transactions, and TrackingNumberList holds internal IDs until you wrap it in BUILTIN.DF. Queries for fulfillments in the last 30 days, one row per tracking number, weight and charges from TransactionShipment, and a join to the sales order for the customer's PO number.
June 21, 2022 — The CompanyFeatureSetup table lists every NetSuite feature with IsAvailable and IsActive flags. One query returned 288 features in my account, and the post includes the full list so you can see what's available versus what's actually turned on.
June 19, 2022 — A Tulip custom widget with one line of Javascript and one empty DIV that runs whatever Javascript you pass it. It can raise an Executed event so a trigger can store the result, or write generated content into its own DIV. Several worked examples with animations.
June 15, 2022 — My first Tulip custom widget wraps the DataTables jQuery library. Pass it an HTML table or a JSON array and it renders a table with pagination, keyword search, and sorting. Also an introduction to Tulip plugins, props, and events for anyone new to widget development.
June 13, 2022 — Questions I got the day after releasing SuiteFrame: filtering list views on the front end or back end, whether SuiteQL is required (no, but recommended for speed), whether Bootstrap is required (no), why I prefer Handlebars over mustache.js, and what the view JSON function does.
June 12, 2022 — SuiteFrame is an open source structure for building NetSuite-native apps with modern Web tooling: a single Suitelet serves as both the app and its API, and the UI uses libraries like Bootstrap and DataTables. It grew out of the SuiteQL Query Tool, and I've used it on a half-dozen client projects.
June 5, 2022 — Queries for assembly items and their components using the AssemblyItemMember join table, including quantities, units of measure, and item source. Explains phantom sub-assemblies and why building a full BOM means drilling down with repeated queries, since SuiteQL can't recurse.
May 31, 2022 — SuiteTransmit watches the files you're editing and uploads each one to the NetSuite File Cabinet whenever it changes, so you can use any editor you like. Built with Xojo and released as MIT-licensed source code plus a RESTlet, with install and configuration steps and a few cautions.
May 15, 2022 — For a custom sales order interface, my client wanted every email tied to an order. The Message table has the subject, sender, direction, and body, but its Attachments column is a multi-valued string, so you join through MessageFile to reach the File table for attachment details.
May 11, 2022 — A UserEventScript that adds a custom tab to a transaction form and fills it with SuiteQL query results rendered by DataTables. I use it to show a customer's recent orders on Sales Orders, and the tab can be inserted ahead of Items so it's visible immediately. Full MIT-licensed script included.
May 8, 2022 — As an experiment I rebuilt a bare-bones SuiteQL Query Tool as a Tulip app: a Tulip connector calls my custom RESTlet, a trigger on the Run button strips tabs and returns, and the JSON results come back fast. Also why I've been getting Tulip certified and where I think manufacturing tech is headed.
May 5, 2022 — A client wanted weekly emails to sales reps and their managers listing customers with an overdue balance or less than 25% of their credit limit remaining. The query uses Customer.BalanceSearch and OverdueBalanceSearch, joins Employee twice for rep and manager emails, and avoids dividing by zero.
May 2, 2022 — A reference table of nearly 800 NetSuite tables that SuiteQL can query, each paired with the permission a role needs to access it. Useful when you're figuring out which table holds the data and why an integration role keeps getting permission errors.
April 24, 2022 — SuiteQL always reports Transaction.TranDate as midnight, so filtering by time of day returns nothing. The fix is joining to SystemNote and filtering on its timestamp. From there, TransactionLine.IsInventoryAffecting gives a distinct list of items whose inventory changed in a time window.
March 17, 2022 — The CustomList table gives you each list's name, ScriptID, owner, and whether it's ordered. Each list's values live in a table named after its ScriptID, such as CUSTOMLIST_BED_SIZE, so a second query gets the display names and stored IDs. Both queries exclude inactive records.
February 20, 2022 — Queries from a production planning app: released work orders filtered with BUILTIN.CF, a count of work orders by status, the sales order behind each work order (stored at the line level, so use an outer join), the gap between production end date and ship date, and what's in the pipeline.
February 3, 2022 — In OneWorld, Account.Subsidiary is multi-valued, so filtering on it throws 'Invalid or unsupported search'. Join through AccountSubsidiaryMap instead, or query that table directly, to get the GL accounts for a specific subsidiary or a full account-to-subsidiary map.
January 31, 2022 — A preview of the SuiteQL Schema Tool, built because the Records Catalog and my Tables Reference both miss secondary tables. It generates role-specific JSON schema files in the File Cabinet, lists base tables plus every table they join to, and has a Field Mode for keyword searching across all fields.
January 30, 2022 — A NetSuite dashboard portlet that calls the Wrike API and lists my active tasks sorted by importance. Covers getting a permanent access token and your contact ID, the https.get call to the tasks endpoint, and how to adjust the URL for other criteria. SuiteScript included as a starting point.
January 25, 2022 — Auditors asked a client for every active access token and the permissions behind it. The oAuthToken table lists tokens by application, entity, and role, and joining to RolePermissions on Role_Name (actually the role's internal ID) gives each permission and level. Includes a filter by permission.
January 16, 2022 — Use Oracle's concatenation operator to build HTML anchor tags in a SELECT, and the SuiteQL Query Tool renders them as clickable Edit and View links on each transaction row. Also shows how to add a Print link, which depends on your account's form number.
January 10, 2022 — A query that reproduces NetSuite's GL Impact view for a single transaction by joining Transaction to TransactionAccountingLine and TransactionLine, with accounting book, account, debit, credit, posting flag, subsidiary, and department. Available in the Query Tool's Remote Library under GL Impact.
January 9, 2022 — A review of Peter Ries's NetSuite for Consultants, one of the few books on NetSuite. It covers implementation methodology, requirements, roles, transactions, customization, integrations, and data migration. I recommend it, including for new developers getting oriented on the platform.
January 3, 2022 — How I put external-facing Suitelets behind NGINX on a cheap Amazon Lightsail server. NGINX forwards each request to the Suitelet and relays the response, which gets you your own domain, caching, and rate limiting while hiding NetSuite. Includes the NGINX config, a sample Suitelet, and a live demo.
2021 (47 posts)
December 12, 2021 — Paginated SuiteQL results that also return the total row count in a single query, using a WITH clause with two CTEs, UNION ALL to prepend a count row, and ROWNUM to select the page. Also notes that SuiteQL now supports TOP and FETCH but silently ignores OFFSET.
December 11, 2021 — A sales pipeline report for a client's management portal: each rep's open sales order total, open estimates with probability of 70% or higher, and their supervisor. Explains transaction status codes with BUILTIN.CF and BUILTIN.DF, uses the WITH clause to simplify the query, and simulates a pivot.
December 7, 2021 — A free RESTlet that returns the full results of a saved search when you POST its internal ID or script ID as JSON. A companion to the SuiteQL Query API, with a cURL example, a Paw demo, and notes on which permissions the integration role needs instead of SuiteAnalytics Workbook.
December 5, 2021 — A free RESTlet that runs a SuiteQL query sent as a JSON POST, with optional bind parameters, and returns up to 5,000 rows per request versus SuiteTalk REST's 3,000. Includes a cURL example and step-by-step setup of the script, role, integration record, and access token.
November 16, 2021 — An easier way to get related transactions than NextTransactionLineLink: TransactionLine.CreatedFrom holds the ID of the source transaction, so a subquery on it returns every invoice and fulfillment created from a sales order. I used this for the Related Records view in a client's customer portal.
November 7, 2021 — Queries that follow a customer deposit (type CustDep) to its deposit applications and down to the invoices it was applied to, including one that finds partially applied deposits by comparing ForeignTotal to ForeignPaymentAmountUsed. Ends with a preview of a native macOS Query Tool built in Xojo.
November 5, 2021 — After more than a year away, I picked Xojo back up for a NetSuite utility and had a proof of concept running fast. Why I drifted away after XDC 2019, what it feels like to use Xojo again, and why I bought a new Pro license partly just to support the company.
October 30, 2021 — The SuiteQL tables behind NetSuite timesheets: Timesheet, TimeLineApprovalStatus, and the time entries beneath each sheet. Queries I wrote so technicians in a custom Web portal can check approval status, see timesheet details, and summarize their hours by customer.
October 29, 2021 — Queries for a OneWorld account that count employees with the GiveAccess flag, group them by subsidiary, add a grand total row with ROLLUP, and feed the results into a Chart.js pie chart generated by the SuiteQL Query Tool.
October 28, 2021 — Two SuiteQL queries against the LoginAudit table to help an admin clean up roles: one lists active roles that haven't been used in the last 90 days, the other lists every active role with the date it was last used.
October 27, 2021 — The production release of the SuiteQL Query Tool v2021.2: a single-page Bootstrap and DataTables interface, pagination past the 5,000 row limit, PDF and HTML result formats, a tables reference, remote and local query libraries, virtual views, and running queries from selected text.
September 29, 2021 — A follow-up on the Xojo-based SuiteScript sync app, now a console app driven by command line arguments. It loads a sync profile with integration credentials, watches a local file, and uploads changes to the File Cabinet through a custom RESTlet.
September 25, 2021 — An early look at a macOS and Windows desktop app I'm building in Xojo that watches a local SuiteScript file and uploads it to the NetSuite File Cabinet via a RESTlet whenever it changes, so you can edit scripts in BBEdit or any editor you like.
September 12, 2021 — How to run a SuiteQL query in the getInputData phase of a map/reduce script so the map phase receives well-structured rows, with a selectAllRows function that pages past the 5,000 row limit. Also covers performance and when to choose map/reduce over a scheduled script.
September 4, 2021 — Wrapping a GROUP BY column in ROLLUP adds subtotal and grand total rows to SuiteQL results. Shown on a query that summarizes sales and purchase orders by status, with COALESCE to label the summary rows.
August 25, 2021 — A proof-of-concept SuiteScript portlet for a fintech client that pulls recent filings from the SEC's EDGAR system for a list of CIK codes and displays them on a NetSuite dashboard with links to each filing's index and primary document. Full script included.
August 23, 2021 — NetSuite doesn't expose schema metadata to SuiteQL, but the CustomRecordType and CustomField tables come close. Queries that list custom record types, then their fields with type, script ID, and the list/record each field points to.
August 21, 2021 — For a OneWorld wholesale client: set an item's Subsidiary field to an array of IDs in SuiteScript to assign it to several subsidiaries, then query the itemSubsidiaryMap and location tables in SuiteQL to see where an item is assigned and stocked.
August 17, 2021 — Turn a SuiteQL query into a map. A query joining Customer, CustomerAddressbook, and EntityAddress feeds an HTML template that uses the Google Maps JavaScript and Geocoding APIs, generated from the SuiteQL Query Tool's document function.
August 12, 2021 — How to use BUILTIN.RELATIVE_RANGES in SuiteQL to reference ranges like last fiscal year to date or last business week without hard-coding dates, and why that keeps queries portable between accounts with different fiscal calendars.
August 8, 2021 — A small SuiteScript portlet that makes one HTTPS GET to CoinDesk's Bitcoin Price Index API and shows the current BTC price and a timestamp on a NetSuite dashboard. Built while researching crypto payments for a client. Script included.
August 4, 2021 — Using the SuiteQL Query Tool's HTML document generation with Chart.js and a little FreeMarker to chart query results. Two worked examples: a pie chart of sales by sales rep and a bar chart of sales by period, with the templates included.
July 27, 2021 — A short SuiteQL query against the DeletedRecord table that shows what was deleted today, the record type and ID, who deleted it, and the context (such as UI). Handy when someone asks who deleted a task.
July 25, 2021 — Beta 2 of the SuiteQL Query Tool v2021.2 adds importing the SuiteQL behind SuiteAnalytics Workbooks, PDF and HTML document generation from advanced PDF/HTML templates, and several interface improvements. Includes a sample query and template.
July 14, 2021 — The first beta of the SuiteQL Query Tool v2021.2: rebuilt as a single-page app with Bootstrap 4 and DataTables, with options to return specific row ranges or all rows past the N/query limit, a tables reference, and a shared remote query library.
July 8, 2021 — A one-table SuiteQL query on ItemBinQuantity that lists items in stock in a bin other than their preferred bin, using BUILTIN.DF for the item and bin names so no joins are needed.
July 1, 2021 — Simple queries against NetSuite's State and Country tables, plus a LEFT OUTER JOIN between them. Notes that country IDs are two-character codes like AU rather than integers, and includes the full result as JSON.
May 24, 2021 — A FileMaker Go delivery app for a NetSuite client's fulfillment team, with maps, contact info, and signature capture. Covers using Insert from Device and the Location function, then uploading Base64 signatures to the File Cabinet through a RESTlet for proof-of-delivery PDFs.
May 18, 2021 — The Currency and CurrencyRate tables in SuiteQL, how to pull historical rates for a given date, and two ways to convert a transaction amount: multiply by the stored exchange rate, or use BUILTIN.CURRENCY_CONVERT.
May 9, 2021 — Queries on the SupportCase table written for a customer service portal dashboard: open case details with hours elapsed, open cases summarized by assignee and by status, and closed cases per rep for a date range.
May 3, 2021 — Two short SuiteQL queries for a management dashboard that count sales orders and purchase orders by status with totals, sorted in workflow order. Notes that PO amounts are stored as negatives and need to be flipped.
April 20, 2021 — Queries on the InventoryNumber and InventoryNumberLocation tables that return serial and lot numbered items with expiration dates, flag items that have expired or expire soon, and break quantities down by location for a warehouse app.
April 11, 2021 — A case study of a sales team app built with FileMaker Go that works offline on iPhones and iPads and syncs with NetSuite through a RESTlet. Includes the SuiteQL query for a rep's open opportunities and a workaround for filtering on Transaction.Status.
March 31, 2021 — A SuiteQL query on the Customer table using the BalanceSearch, OverdueBalanceSearch, and UnbilledOrdersSearch columns to give sales reps a quick view of receivables, overdue amounts, open orders, credit limit, and credit hold status.
March 29, 2021 — How to walk from a sales order to its fulfillments and invoices, or from a child transaction back to its source, using the NextTransactionLineLink and PreviousTransactionLineLink tables. Includes a column reference and example queries.
March 25, 2021 — The SuitePeople Payroll tables available in SuiteQL: PayCheck, PayCheckSummary, and the commissions, contributions, deductions, earnings, tax, and paid time off detail tables. Queries from an employee portal that shows staff their paychecks.
March 23, 2021 — Emergency contacts entered on an employee's Human Resources subtab live in the EmployeeEmergencyContact table. Two queries: contacts for one employee, and a join to Employee for a company-wide emergency contact directory.
March 21, 2021 — Building up a SuiteQL query step by step to find active employees who have NetSuite access but haven't logged in during the last 90 days, using the LoginAudit table as a NOT IN subquery.
March 18, 2021 — A short SuiteQL query that returns active posting accounting periods (excluding quarterly summaries) along with their parent periods, written for a custom API that lets users post vendor bills to non-default periods.
March 16, 2021 — This SuiteQL Query Tool update adds table help: type a table name followed by two periods and a window shows its columns and joins, pulled from the Records Catalog API. A first step toward column autocompletion.
February 22, 2021 — Two queries from a sales portal: leads assigned to a specific rep, filtered on Customer.SearchStage = 'Lead', and a summary of active sales reps with their lead counts using a LEFT OUTER JOIN from Employee to Customer.
February 16, 2021 — The KitItemMember table joins a kit/package item to its component items. A query with two aliases on the Item table returns each kit's components with quantity and line number, answering a question from the NetSuite Professionals Slack.
February 9, 2021 — A SuiteScript portlet that runs a SuiteQL query, set in the script or passed as a script parameter, and renders the results as a table on a dashboard. Ships with an employee directory query as the default. Script included.
February 2, 2021 — Why Oracle's ROWNUM pseudocolumn behaves unexpectedly with sorted queries, and how to use it correctly in a nested query to page through SuiteQL results beyond the 3,000 row REST and 5,000 row N/query limits.
January 19, 2021 — Queries for a SuiteCommerce Advanced account that join ItemImage to File and MediaItemFolder to get each item's image files, sizes, and URLs, plus a workaround for finding items with no images when ItemImage queries time out.
January 5, 2021 — Two browser console JavaScript snippets that call the API behind NetSuite's Records Catalog to dump every record type and its fields as JSON. I load the result into a FileMaker database to search table and column names offline.
January 4, 2021 — Queries on the SentEmail, SentEmailRecipient, and UndeliveredEmail tables to see what NetSuite has sent in a date range, the delivery status per recipient, and which messages bounced, with joins back to the Entity table.
2020 (43 posts)
December 22, 2020 — A SuiteQL query that lists empty bins in a location by LEFT OUTER JOINing Bin to ItemBinQuantity, grouping by bin, and using HAVING to keep only bins whose on-hand total is zero. A walkthrough of each clause and why the outer join matters.
December 17, 2020 — A long walkthrough of querying the Transaction table and joining to Entity, Employee, TransactionLine, and Item, with TO_DATE and BUILTIN.DF along the way. Covers replicating the mainline search filter and querying journal entries.
December 10, 2020 — The Oracle date and time functions that work in SuiteQL, demonstrated against the DUAL table: SYSDATE and CURRENT_DATE, TO_CHAR format models, TO_DATE, date and time arithmetic, and handling time zones and offsets.
December 7, 2020 — Three SuiteQL queries on transactions of type RtnAuth: return authorizations in a date range, RMAs summarized by customer, and RMAs summarized by item via TransactionLine and Item, written to help a company review its returns policy.
December 3, 2020 — For a client going through an audit, a query on the OutboundRequest table that lists every outbound HTTP call with its status code and elapsed time, joined to Script, File, and MediaItemFolder to show which script made it and where it lives.
December 2, 2020 — A single SuiteQL query that returns, for each active item, on hand, committed, and available quantities, reorder point, preferred vendor, average cost and price, and units sold in the last 30, 90, and 365 days, built to guide a client's purchasing.
December 1, 2020 — Building a query for item receipts (type ItemRcpt) step by step: filter Transaction and inventory-affecting TransactionLine rows, join to Item, then link each receipt line back to its purchase order line through PreviousTransactionLineLink.
November 23, 2020 — Queries for a Pacejet integration: item fulfillments in a date range with their source sales order via PreviousTransactionLineLink, the CustomRecord_Pacejet_Package_Info records for a fulfillment, and a combined query joining the two.
November 19, 2020 — A tour of the LoginAudit table for an account audit: its columns, showing the full timestamp with TO_CHAR, resolving user and role names with BUILTIN.DF, and queries for failed logins, a user's most recent login, and when a role was last used.
November 17, 2020 — Queries for matrix items in the Item table: parent items with a child count, a child joined to its parent with a self join, all children of a given parent, and standalone items found with a NOT EXISTS subquery.
November 10, 2020 — Accounts payable aging detail and summary queries adapted from the AR aging versions with only two changes each: rename the Entity alias to Vendor and join to the Vendor table instead of Customer. Both rely on TransactionAccountingLine.
November 6, 2020 — Two SuiteQL queries I added to a custom API for a debt collection firm: a detail query that replicates NetSuite's A/R Aging Detail report, and a summarized version that buckets open balances by age using the AmountUnpaid and PaymentAmountUnused columns on TransactionAccountingLine.
November 5, 2020 — A free Suitelet that looks up an inventory item's balance history. It lists the transactions that affected the item's on-hand quantity in reverse chronological order, up to a date you specify, with a running balance. Full SuiteScript source included.
November 4, 2020 — Five SuiteQL queries I wrote for a client's custom sales mobile app: sales pipeline detail and summary by salesperson (orders scheduled to ship in a date range), shipped orders detail and summary for estimating commissions, and top orders of the day.
November 3, 2020 — For a client preparing for an audit, two SuiteQL queries: one that pulls journal entries from the Transaction table for a date range, and one that joins to TransactionAccountingLine to show the accounts, debits, and credits that a transaction hit.
November 2, 2020 — A single SuiteQL query I built for an audit request, developed step by step: active employees with NetSuite access, a self join on the Employee table for supervisors, and joins to get each employee's roles and the permissions and levels granted to each role.
November 1, 2020 — Where NetSuite's password policy lives (Setup > Company > General Preferences) and what the three settings do: the Weak, Medium, and Strong policy levels, Minimum Password Length, and Password Expiration In Days, which defaults to 180 and can be extended to 365.
October 29, 2020 — SuiteQL queries I wrote to hand vendor and accounts payable data to an external system: vendors with open balances from the Vendor table, remittance addresses via a join to EntityAddress, vendor bills and credits, and vendor payments.
October 27, 2020 — Version 2 of my free SuiteQL Query Tool Suitelet. It adds saving and loading queries from a File Cabinet folder, CSV export of results, a corrected execution time calculation, truncation of values over 300 characters, and better handling of JSON results over 100,000 characters.
October 19, 2020 — What I learned about NetSuite's bin management tables while building a warehouse app for a wholesaler. SuiteQL queries against Bin, ItemBinQuantity, and Item that find which bins hold an item, with on-hand and available quantities, looked up by internal ID or item number.
October 14, 2020 — Two SuiteQL queries I wrote to feed a promotional products distributor's Product Information Manager from NetSuite: items created or modified in the last 7 days with their preferred vendor (via LEFT OUTER JOINs to ItemVendor and Vendor), and a matching vendor query.
September 14, 2020 — SuiteQL queries built for a debt collection firm's API: basic customer data, the BalanceSearch and OverdueBalanceSearch columns for open and past due balances, and the joins through EntityAddressbook to get default billing and shipping addresses and the sales rep.
September 9, 2020 — Why I now steer developers away from Xojo after an underwhelming Web Framework 2.0 and years of announced features that never arrived, why I've returned to FileMaker work despite leaving it in 2015, and what my integration-heavy NetSuite work looks like today.
August 19, 2020 — SuiteTalk REST caps SuiteQL results at 1,000 rows per page. This simple RESTlet uses the N/query module's runSuiteQL method instead, returning up to 5,000 rows per query as JSON. Send it a payload with a 'sql' value and get the results back.
August 12, 2020 — A tour of the SystemNote table, which logs every change made to NetSuite records. What each column means (Field, OldValue, NewValue, Context, RecordTypeID), how BUILTIN.DF makes it readable, and queries for auditing one user's changes and timing sales order status transitions.
August 10, 2020 — How I built a SuiteQL query that returns an item's inventory-affecting transactions with a running balance after each one. It walks through the TransactionLine, Transaction, and Entity joins, the IsInventoryAffecting filter, and the SUM OVER analytic function that computes the running total.
August 6, 2020 — The first release of my SuiteQL Query Tool, a single Suitelet built on N/ui/serverWidget and N/query where you enter a SELECT statement and see the results. Full source included, plus tips like limiting rows with RowNum and commenting out parts of a query while debugging.
July 30, 2020 — A closer look at SuiteQL's BUILTIN.DF function, which returns a field's display value without an explicit join. Examples against the Transaction table, a case where DF isn't enough and you still need to join to Employee, and notes on CONSOLIDATE, CURRENCY, and the functions coming in 2020.2.
July 22, 2020 — How to query the NetSuite File Cabinet with SuiteQL via SuiteTalk REST. Queries against the MediaItemFolder table for top-level folders and subfolders, and against the File table to list the files in a folder, with sample JSON responses.
July 20, 2020 — The 2020.2 features I care most about: invoice grouping (consolidated invoicing), new SuiteQL built-in functions like HIERARCHY and NAMED_GROUP, logout and role-switch entries in the Login Audit Trail, required deposits, the N/compress and N/recordContext modules, and the Records Catalog.
July 16, 2020 — A follow-up to the PromoStandards post: why the Transaction table's Status field is tricky (single-character codes that mean different things per transaction type), how BUILTIN.DF maps a code like 'G' to 'Sales Order : Billed', and a query that counts sales orders by status.
July 15, 2020 — How I implemented PromoStandards Inventory 1.2.1 and Order Status 1.0.0 services for a NetSuite client using SuiteQL over SuiteTalk REST. The item query returns quantities across nearly 6,000 items in about .6 seconds, and a CASE expression maps NetSuite statuses to PromoStandards status codes.
June 15, 2020 — A preview of FM Publisher, my RapidWeaver stack for publishing FileMaker data via the Data API. It covers the Base stack's connection, filtering, sorting, limit, and offset settings, the Records drop zone with field tokens, and the Portal stack for related records.
June 7, 2020 — An asset management firm needed a portal that gives management and private investors financial reports from NetSuite. I describe the SuiteQL query behind a Comparative Income Statement built from TransactionAccountingLine, Account, and AccountingPeriod, and preview my NS Charts service.
May 30, 2020 — A client wanted a quick bug tracker for a mobile app rollout, so I embedded Airtable's Bug Tracker template inside NetSuite with a portlet SuiteScript that renders Airtable's embed code. Script included; swap in your own view's embed code to use it.
May 28, 2020 — The original PHP-based SuiteQL Query Tool I built with RapidWeaver and Foundry. You type a query, it strips the whitespace, sends it to the SuiteTalk REST API, and shows the JSON response with elapsed time, plus limit and offset settings for paginating results.
May 21, 2020 — A real use of SuiteQL over SuiteTalk REST: a query that finds items at or below their reorder point with their preferred vendor (via ItemVendor and Vendor), the cURL call with OAuth headers and the transient Prefer header, and what to expect in the paginated JSON response.
May 18, 2020 — A healthcare client with nearly a quarter million ServiceNow users needed remote IT staff to scan asset tags and see asset details fast. I built a PHP app on the ServiceNow Table API with RapidWeaver, Stacks, and Foundry in a matter of hours.
May 5, 2020 — A short walkthrough for putting an Airtable form on a RapidWeaver site: add a form view to your table, share it, copy the embed code, and paste it into an HTML stack on a Stacks page. Submissions go straight into the Airtable base.
May 4, 2020 — A customer's ColdFusion HR portal pulled employee data through the aging FileMaker API for PHP. I moved it to the FileMaker Data API with three ColdFusion custom functions, fm_login, fm_request_send, and fm_logout, shared here with sample find request code.
April 23, 2020 — A ColdFusion custom function, get_from_servicenow, that reads records from the ServiceNow Table API. Pass it your instance settings and a struct of URL parameters (sysparm_fields, sysparm_query, sysparm_limit) and it returns the matching records, shown here against the sys_user table.
April 22, 2020 — For a promotional products client's ColdFusion ecommerce system, I wrote a post_to_restlet function that handles NetSuite Token-based Authentication (OAuth 1.0 with HMAC-SHA1) and posts a JSON payload to a RESTlet. The function and a sample order payload are included.
March 11, 2020 — Two ways to read an incident's comments and work notes with the ServiceNow Table API (the comments_and_work_notes field, or the sys_journal_field table with element and sysparm_query filters), and how to add one with a PATCH that sets comments or work_notes.
2019 (15 posts)
October 10, 2019 — Aloe XWS is an open source Xojo module for building Web services, APIs, microservices, and middleware. It's a streamlined alternative to Aloe Express that keeps only the parts I actually used, and it's available for download at aloe.zone.
October 9, 2019 — Xojo 2019 R2 shipped API 2.0 but none of the other features promised for 2019: Android, interops, Xojo-based plugins, the new IDE, Web Framework 2.0. My thoughts on the roadmap, why Xojo's goal may be too big for a small company, and why I moved my work to PHP after XDC 2019.
October 8, 2019 — The minimalist setup I work from: an Early 2015 13-inch MacBook Pro and a Dell UltraSharp monitor, BBEdit for nearly everything, Paw for API work, Navicat, RapidWeaver with Stacks and Foundry, and hosting on Amazon Lightsail behind nginx with Aurora for MySQL.
August 26, 2019 — A RESTlet that acts as an RPC-style API for the NetSuite File Cabinet. Its functions create files (Base64 for binary), get file contents, enumerate files, create and delete folders, and run SuiteQL queries against the cabinet. Includes cURL examples and notes on permissions.
August 2, 2019 — An experiment to see what it takes to build a chat app using only Xojo's Web framework. It handled a surprising number of users and broadcast messages, and I'm releasing the project under an open source license as a thank you to the Xojo community for testing it.
July 26, 2019 — A second configuration RESTlet, this one built on the N/config module. It returns company information, user and company preferences, accounting periods, and more as JSON, going well beyond the runtime details in the previous day's script.
July 25, 2019 — A small RESTlet that uses the N/runtime module to return a NetSuite account's environment type, version, processor count, queue count, and more as JSON. Handy when you're troubleshooting a client's instance from an external system.
May 29, 2019 — How NetSuite's three complex item types differ. Assembly items must be built first and have GL impact when built, kits ship as a bundle that can't be broken up, and item groups explode into individual line items you can edit, with pricing taken from the members.
May 29, 2019 — Append &xml=t to the URL of any NetSuite entity or transaction page and you get an XML dump of the record: its record type, field names, sublists, and values. A quick way to find the internal IDs you need when writing SuiteScript.
May 28, 2019 — How to set up and use NetSuite drop shipping: enabling the feature, creating a non-inventory drop ship item with a preferred vendor and purchase price, the purchase orders NetSuite creates on approval, marking them shipped, and why there's no inventory impact and the GL timing can be off.
May 24, 2019 — In a Suitelet, the caller's IP address is available in the request headers as ns-client-ip. This shows how to read it, and how to log all the headers to see the other values available, like user-agent and the NetSuite host.
May 23, 2019 — Enabling SuiteScript in a new NetSuite instance: Setup > Company > Enable Features, the SuiteCloud tab, and the Client SuiteScript and Server SuiteScript checkboxes, then accepting the SuiteCloud terms. SuiteFlow is enabled from the same form.
May 22, 2019 — To skip restocking a damaged item on a return receipt, you uncheck Restock, but NetSuite only allows that once a Write-Off Account For Returns is set under Accounting Preferences > Order Management. The return then hits that account as a loss with no inventory impact.
May 7, 2019 — Aloe for PHP is a microframework I built after moving Web work from Xojo to PHP. It mirrors Aloe Express with Request and Response classes, it's what Promo.zone runs on, and I plan to release it under an MIT license this summer.
January 9, 2019 — What Xojo has said is coming in 2019: Android support, interops, plugins written in Xojo, a new IDE with a project home screen, a rewritten Web Framework 2.0 with 10 new controls, and API 2.0. Plus my XDC 2019 session on webhooks.
2018 (1 posts)
January 15, 2018 — The resources I lean on for PromoStandards work: the official site for WSDLs and docs, the Service API for looking up participating companies and endpoints, the LinkedIn group, the GitHub repo with PHP, C#, and Java samples, the Web Service Validator, and Paw.
2017 (1 posts)
August 1, 2017 — Why PromoStandards matters for the promotional products industry: distributors spent years building one-off supplier integrations for product data, inventory, and order status. A shared standard lets one integration pattern work with every participating supplier.