Skip to main content

Google Sheets settings reference

Audience: developers & AI agents · Scope: every setting that holds a sheet reference or the Google credentials · Last reviewed: 2026-07-20

TL;DR — Sheet references come in two shapes: the BcGoogleSheet picker (stores <spreadsheetId>#<gid>, validated against what the service account can see) and plain strings (a spreadsheet id plus a tab title, unvalidated). All of them are per-environment rows on the settings record; many live in extension tables rather than the base one.

All settings are defined in data/customization/models/adminbcsettings.php unless noted.

Credentials — the Google Cloud Integration group

SettingLabelTypeNotes
reps_fileGoogle API Service Account Key file (JSON)BcGoogleJsonFileRequired. Max 50 KB, application/json. Stored as <settingsRecordId>.json under the private data store private/custom_media/sheets_json. The derived reps_file_path is what every consumer reads.
bigquery_project_idBigQuery Project IDstringOptional; BigQuery, not Sheets

reps_file is the single Google credential for the whole site — Sheets, Drive, BigQuery and Vertex AI. The reps_ prefix is historical.

Picker settings (BcGoogleSheet)

Stored as <spreadsheetId>#<gid>. requireWriteAccess disables read-only options in the dropdown — a UI-only guard, not re-validated on save or at write time.

SettingLabelSettings groupWrite accessStored in
product_filters_sheetGoogle sheet with product filter dataProduct overview page settingsnobase
reps_sheetRep Master SheetReps Synchronizationno_settings_reps
branches_sheetRep Master SheetBranches Synchronizationno_settings_branches
order_tracking_sheetSheet for reading shipment dataShipment trackingnobase
order_tracking_sheet_add_shipping_addressSheet for adding the ship to addressShipment trackingyesbase
order_tracking_sheet_add_po_numberSheet for adding the PO numberShipment trackingyesbase
infor_code_normalization_report_sheetSheet for code normalization reportsInfor REST API Integrationyesbase
quote_nudge_sheetFollow-up nudge sheetQuote Follow-upsyes_settings_quote_follow_up
quote_stage_sync_sheetQuote stage-change log sheetQuote Follow-upsyes_settings_quote_follow_up
cold_quotes_report_sheetCold Quotes Report SheetCold Quotesyesbase
performance_data_import_sheetPerformance Data Import SheetPerformance Datanobase (required)
performance_data_multiplier_import_sheetPerformance Data Multiplier Import SheetPerformance Datanobase (required)

One more lives on a different model: ConfigboxModelSqlexports::sheet (models/sqlexports.php:87-96), label Google Sheet, requireWriteAccess true — one per export record rather than one per site.

reps_sheet and branches_sheet share the label "Rep Master Sheet" and are told apart only by their settings group. They are two separate imports from the same source workbook.

Plain-string settings (spreadsheet id + tab title)

No picker, no validation, no access pre-flight. The tab is addressed by title, so renaming a tab breaks these (unlike the picker settings, which use the tab id).

GroupSettings
Google Sheet Exportsexports_fabrication_schedule_spreadsheet / _sheet, exports_fabrication_schedule_priority_spreadsheet / _sheet, exports_engineering_schedule_spreadsheet / _sheet, exports_assembly_schedule_spreadsheet / _sheet, exports_warehouse_kitting_spreadsheet / _sheet, kitting_bom_spreadsheet_id / kitting_bom_sheet_title
Google Sheet Exports (legacy)fabrication_schedule_spreadsheet_id / _sheet_title, fabrication_schedule_priority_spreadsheet_id / _sheet_title, engineering_schedule_spreadsheet_id / _sheet_title, warehouse_kitting_data_spreadsheet_id / _sheet_title — read only by the …Old methods, which have no live callers
Price list importspricelist_key, pricelist_matrices_tab, pricelist_feedback_tab
Order Schedulingorder_scheduling_sheet_id, order_scheduling_orders_tab_name, order_scheduling_items_tab_name
Scheduled Job BOM Calculationjob_bom_calc_source_spreadsheet / _tab, job_bom_calc_target_spreadsheet / _tab
Margin Analysis Toolcosting_sheet_google_spreadsheet_id, costing_sheet_google_sheet_title

Not configurable

Two consumers carry literal spreadsheet ids in code — changing their destination needs a code change:

  • Production schedule exportmodels/bcproductionschedule.php:18-32, tabs Jobs and Raw BOM Data.
  • Converted LUM codes importmodels/convertedcodes.php:4-11.

Header-keyword settings

The rep and branch imports don't hardcode column headers; they match the sheet's header row against per-column settings, and abort with a specific message when one is missing. Each import has its own *_header_keyword_* set — for branches: branch code, name, organisation id, sync flag, RSM email, RSM name, agent discount groups, agent win rate (adminbcsettings.php:481-580).

Storage — why settings live in extension tables

The base settings row outgrew MySQL's row-size limit, so groups of columns were carved into settings_id-keyed extension tables with cascade-delete foreign keys, joined back transparently by Kenedo's storeExternally / foreignTableName / foreignTableAlias / foreignTableKey:

TableCreated by
#__configbox_external_settings_repsupdates/0.5.59.php
#__configbox_external_settings_branchesupdates/0.5.60.php
#__configbox_external_settings_exportsupdates/0.5.58.php, extended by 0.5.62.php
#__configbox_external_settings_quote_follow_upupdates/0.5.69.php
#__configbox_external_settings_pipedriveupdates/0.5.56.php

When adding a new sheet setting, add it to the right extension table, not the base one — see migrations.

Schema history worth knowing

Sheet references were originally stored as two columns (spreadsheet_id + sheet_reference). They were consolidated into the single <id>#<gid> form: updates/0.4.84.php (backfilling #__configbox_external_sql_exports.sheet), updates/0.4.90.php (the export log), and the old column pairs dropped in updates/0.4.91.php. A stale docblock in models/googlesheets.php:64 still describes the separator as a colon.