Skip to content

Meeting Extraction — Billing Configurator Discussion

Meeting Details

Field Value
Date 2026-02-19
Duration ~51 minutes
Participants Jerry, Ash Alexander, Sarah Shalfoun
Facilitator Jerry
Recording video.mp4
Transcript transcript.txt

Context

This session was a deep-dive into the billing configurator — what it was designed to do, what actually works, and how it relates to the billing instruction records in NetSuite. Jerry (original architect) walked through every tab of the configurator suitelet, explaining the design intent and current state. The discussion was triggered by the need to understand the configurator's technical foundation before deciding whether to rebuild it.


Key Topics Discussed

Topic 1: Billing Instructions Architecture (Ash & Jerry)

Summary: Ash explained the current Pymble architecture — billing instructions modeled after the BPOS subscription plan pattern. Jerry confirmed understanding.

Key Points: - The current Pymble setup uses Billing Profile (equivalent to BPOS Subscription Plan) and Billing Instruction (equivalent to Subscription Item) - Each billing profile is per family (debtor) - Billing instructions sit against each family and drive invoice generation - For Pymble, Ash manually built the billing instructions in Excel and imported them — he was "the configurator" - The configurator suitelet was designed to automate what Ash does manually

Jerry's comment: "So that's the customer, that's the line item. So you're storing this per family... and based on this the invoice gets generated."

Topic 2: Configurator Suitelet — Tab-by-Tab Walkthrough (Jerry)

Summary: Jerry walked through all 9 tabs of the billing configurator suitelet, explaining the purpose and design intent of each. He was clear that most of the tabs do not work — the UI exists but the back-end logic is incomplete.

Tab 1: Segmentation

  • Splits items into charges (sales) and discounts
  • Asks the school: which charge categories and discount categories apply to your billing?
  • Data sourced from a custom classification field on item records in NetSuite (called "billing engine type" or "class field")
  • Some schools may have multiple discount categories (sibling, staff, parent), others may have just one
  • If a school doesn't use categories, this tab is irrelevant — can be skipped

Segmentation tab

Tab 2: Items

  • Direct replication of the NetSuite item list
  • Allows the user to select which items should be included in the current billing cycle
  • Purpose: not all items in NetSuite are used every cycle (e.g., COVID-19 discount was a one-time item)
  • Selected items are passed to the billing engine; unselected items are ignored
  • Jerry: "It's really giving a better interface for NetSuite's item list — that's all this screen does"

Items tab

Tab 3: Families/Debtors

  • Pulls the full list of families (debtors) from NetSuite
  • Filters: family code, family status
  • 99% of debtors should be pre-selected — this tab handles the exceptions
  • Schools can exclude specific families from the billing engine (e.g., families needing manual invoicing, special conditions)
  • Also serves as a visual reconciliation checkpoint — "we have 920 students, does this match?"
  • Ash added: the SIS integration runs daily, so movements (students joining/leaving) are reflected; this tab helps iron out the 2-5% edge cases

Families tab

Tab 4: Items-to-Years Mapping

  • Maps selected items to year levels and student types
  • Example: laptop hire fee → year 8 and 11 only; building levy → all years (7-12); staff discount → "staff" student type only
  • Jerry: "It's basically writing code visually — applying instruction to the system"
  • Student types (all students, staff only, etc.) are school-specific and configurable
  • The category groupings shown in the UI are cosmetic — no back-end classification exists yet
  • Jerry: "We've just grouped it on the design, but there's no back-end classification as yet — that's something you need to build"

Items-to-years mapping

Tab 5: Exceptions

  • For excluding specific students or families from particular items or rules
  • Example: laptop fee applies to year 8 and 11, but exclude a specific student from year 8
  • Can target individual students, groups of students, or specific family codes
  • Jerry: "This is more for exception handling"

Exceptions tab

Tab 6: Scheduling/Period

  • Sets the billing period (start date, end date)
  • Configures preset messages for families with pending balances (e.g., "you must pay in full")
  • Can exclude certain debtors from batch processing based on outstanding amounts
  • Also includes options for opening balance handling (though Jerry clarified this tab is not related to the "update opening balances" script — that's a separate background process)

Scheduling tab

Tab 7: Payments

  • Configures which payment options to show on the parent payment suitelet
  • Options: credit card, bank/direct debit
  • Payment frequency: weekly, fortnightly, monthly — and how many payment splits for each
  • Sarah asked why monthly would have anything other than 12 payments — Jerry explained: the school had a requirement where weekly/fortnightly cycles could be shortened (e.g., "pay within 20 weeks instead of 24")
  • The number of splits is configurable per frequency, not hardcoded
  • Ash clarified: annual payment splitting (for banking limit reasons, e.g., splitting $100K across multiple dates) is controlled by the parent on the payment suitelet, not by this tab

Payments tab

Tab 8: Mid-Year

  • Handles students who start mid-year (outside the standard billing period)
  • Sets a different billing period start/end for mid-year enrollees
  • Uses a "divisible value" to calculate prorated billing amounts
  • Jerry: "This is all particular to the school... the idea behind midyear was if any kid starts in the middle of the year, there needs to be a start date and end to the billing engine"
  • Jerry clarified: this is a one-time setup instruction, not something run each time a mid-year student enrolls — it's a preset for how the engine treats mid-year students

Mid-year tab

Tab 9: Maintenance

  • Data cleansing utility — deletes unnecessary records created by prior billing cycles
  • The configurator creates batches of custom records each cycle; this tab cleans up stale data
  • Can be set to auto-clean every 3 or 6 months
  • Jerry: "A lot of the way this solution was designed... we couldn't go back 2-3 steps to where we created certain records which were unnecessary, which could have been done by code itself"

Maintenance tab

Topic 3: Current State — What Works and What Doesn't (Jerry)

Summary: Jerry was explicit that the configurator is largely non-functional beyond the basic flow.

Key Statements from Jerry: - "This billing configurator does not work. Everything you see on the UI is all bells and whistles. It's all smokes and mirrors. It's just a business solution that we wanted, designed on the UI, and I'm probably 10% of this works." - The second tab (items-to-years mapping) "does not work — it does not do anything. Even if you keyed in any data and submitted, it does nothing." - The design was done "with NetSuite in mind, a particular school in mind, as well as our final outcome in mind — so it became like a big soup of all three and that's when the clarity got missed and everything was left half baked" - The Weddington Academy version was "quite comprehensive, but again had a few parts which did not work"

What actually works (Saint Edwards): - Ash confirmed: Saint Edwards uses the configurator, but only the bare minimum — they go to the Families tab, verify the debtor count, verify the student count, optionally change the billing period number (e.g., 22 instead of 24), and hit Submit - "They don't change anything. They don't change any inputs, nothing." - "They don't alter anything on the screen, they don't do anything on the screen... just hit submit and then the billing instructions are generated"

Topic 4: Billing Instruction Records in NetSuite (Jerry & Ash)

Summary: Jerry explained how the billing instruction and billing instruction applied-to records work as the back-end data store that the configurator was meant to create automatically.

Key Points: - Billing Instruction is the master record — one per item per year level (e.g., "Student Year Fee 7") - Each billing instruction has a billing engine type field — this is the custom classification that ties back to the segmentation tab - Billing Instruction Applied To is the child record — lists every student/family that instruction applies to (e.g., 45 year-7 students who get laptop hire fee) - The configurator, when working, would automatically create these records based on the user's selections - Jerry: "The configurator is simply a visual representation of what NetSuite's back-end is... because this screen is not user-friendly for a school user, we've simplified that into the UI" - Currently, Ash creates these manually via Excel/CSV import for Pymble and Al Faisal - For the newest accounts (post-Al Faisal), they don't use billing instructions or billing engine type at all — just the simpler billing instruction applied-to records

Billing instruction record Billing instruction applied-to

Topic 5: Version Control Problem (Jerry)

Summary: Jerry identified the fundamental problem — there are now 3-4 different versions of the billing solution across clients, and version control has become unmanageable.

Key Statements from Jerry: - "Saint Edwards has a version. Al Faisal has a version. And the rest of the two schools have another version." - "4 schools down and we already have 3 versions" - "The whole code architecture, the deployment architecture, the whole management of generic versioning versus specific versioning went into a havoc and all the solutions got mixed. And now it's like a big soup." - The standard flow is: GitHub → Development Account → Demo Account → Client Accounts

Ash confirmed: The current deployment flow is GitHub → dev account → demo + every client.

Topic 6: Jerry's Architectural Recommendations

Summary: Jerry laid out a clear three-layer architecture recommendation for rebuilding the configurator.

Recommendation — Three-Layer Architecture:

Layer Description Jerry's Words
Layer 1: Generic Base Core billing engine features (~15 features) that apply to any school. Standard, never customized per client. "There needs to be a generic version which can apply to any school — that should be the base. It's probably 10-15 features."
Layer 2: Configurable Point-and-click configuration for school-specific preferences (items, year mappings, payment options, billing frequency). This is what the configurator UI should handle. "Then there's another additional layer which can be handled by the configurator — which I can tweak and change and play how my engine should work."
Layer 3: Custom/Exception An open framework for school-specific exceptions that can't be handled by configuration. Must integrate back into the central solution. Decide per exception whether to promote to the generic version. "You need to keep another open framework to be able to integrate new exceptions for that particular school back into our primary solution."

Jerry's other recommendations: - Start from the cleanest version: "The new two schools which have the simpler version — that would be a good starting point. Take pieces from Saint Edwards, not the entire thing." - Don't fix old clients first: Saint Edwards and Al Faisal should be "a backup fix" — don't spend time or money on those now - Build outside NetSuite and integrate: Jerry's "big recommendation" — consider building the configurator outside NetSuite and integrating back, "because this is the mistake we did last time — the design was done with NetSuite in mind, a particular school in mind, as well as our final outcome in mind" - Version control discipline: "The whole versioning and the flow of how the version control has to happen — that's the real game in this" - Keep the dev account permanent: "The development account needs to be like a permanent account. We can't lose that account — if you lose it, the entire solution crumbles" - Schools won't self-serve: "I'm not sure if any school would have somebody trained to do this, or we can train some administrator in a school to do this on their own because it's quite technical"

Sarah's response: Agreed with the approach — will aim to abstract school-specific requirements into generic capabilities when possible, rather than hard-coding per client.


Decisions Made

Decision Details
Configurator needs rebuild Current implementation is ~10% functional; cannot be patched to full functionality
Start from the simplest version Use the newest (post-Al Faisal) accounts as the starting codebase, not Saint Edwards or Al Faisal
Three-layer architecture Generic base → Configurable → Custom exception
Fix existing clients later Saint Edwards and Al Faisal are "backup fix" — deprioritized

Action Items

Action Owner Deadline Status
Flush out requirements with Ravi and Ash — define generic vs configurable vs custom features Sarah TBD Open
Design repository and version control architecture for the three-layer approach Sarah TBD Open
Build centralized version on the dev account Sarah / Ash TBD Open
Jerry available for brainstorming sessions as needed Jerry Ongoing Open

Key Screenshots

Timestamp Screenshot Description
1:00 Billing profile Billing profile record in NetSuite — equivalent to BPOS subscription plan
3:30 Configurator launch Configurator suitelet — loaded after launch
6:40 Segmentation tab Segmentation tab — charges vs discounts
10:40 Items tab Items tab — selecting items for the billing cycle
13:00 Families tab Families/debtors tab — family selection and reconciliation
17:00 Items-to-years Items-to-years mapping — which items apply to which year levels
20:00 Exceptions tab Exceptions tab — Ash demonstrating exception handling
23:20 Scheduling tab Scheduling/period tab — billing period and preset messages
25:20 Payments tab Payments tab — payment method and frequency configuration
28:50 Mid-year tab Mid-year tab — handling mid-year student enrollments
31:20 Maintenance tab Maintenance tab — data cleansing utility
42:20 Billing instruction record Billing instruction record — individual record showing classifications
45:00 Applied-to record Billing instruction applied-to — child record listing students/families

Technical Insights

  • The configurator suitelet is a NetSuite Suitelet — a server-side SuiteScript page
  • The segmentation tab sources data from a custom classification field on item records (billing engine type / class field)
  • The class field was introduced by NetSuite as part of a release adding more custom fields under classification — used by Feoda for item categorization
  • Billing instruction records store the "what" (item + year level + period), applied-to records store the "who" (students/families)
  • The configurator creates custom records in the background when executed — this is why the maintenance tab exists for cleanup
  • The development account is the source of truth; code flows: GitHub → dev account → demo + client accounts

Open Questions

  • How will the three-layer architecture map to the GitHub repository structure? Single repo with feature flags, or separate branches/packages?
  • What are the 10-15 "generic features" for Layer 1? Needs requirements workshop with Ravi and Ash
  • Should the configurator be rebuilt inside NetSuite (Suitelet) or outside (external app integrating via SuiteTalk/REST)?
  • What's the plan for fixing Saint Edwards and Al Faisal after the centralized version is built?
  • Can schools realistically self-serve with a configurator, or will Feoda always run the billing cycle?

Source Files

File Location
Video video.mp4
Transcript (docx) transcript.docx
Transcript (txt) transcript.txt
Frames extracted frames