ProcessConfig: {
    addonCheckInsDeadline?: string;
    addonCreatorContext?: {
        addon?: string;
        bcc?: string | string[];
        bodyIsHtml?: boolean;
        bulkDownloadTickets?: boolean;
        businessName?: string;
        cardCountField?: string | null;
        caseTitleFormat?: string;
        checkInType?: "repeat" | "norepeat" | "sessions" | "norepeatSessions" | "inout" | "norepeatInout" | "custom";
        customQrContentField?: string | null;
        disableGoogleWallet?: boolean;
        disableMultiCardZipLink?: boolean;
        disableTicketFooter?: boolean;
        docId?: string;
        docName?: string;
        email?: string;
        emailBody?: string;
        emailField?: string | number;
        emailFieldConfirmed?: boolean;
        emailFieldName?: string;
        emailSubject?: string;
        externalQrProvider?: ExternalQrProvider | null;
        findAndCheckIn?: boolean;
        form?: FormConfig;
        fromName?: string;
        gWalletAttendeeNameFormat?: string;
        gWalletEventName?: string;
        gWalletOrganizationName?: string;
        gps?: boolean;
        handlingConditions?: {
            field: string;
            values: (string | number)[];
        }[];
        inlineQr?: boolean;
        ip?: string;
        loc?: string;
        maxCheckInsField?: string | null;
        mode?: "sponsored" | "normal";
        noLinkInEmail?: boolean;
        offlineSync?: boolean;
        passName?: string;
        replyTo?: string;
        senderPolicy?: "gmail" | "trak" | "both" | "smtp";
        sessionPermissions?: boolean;
        sheetName?: string;
        signature?: boolean;
        smtpCredentials?: {
            connectionTimeoutMs?: number;
            enabled?: boolean;
            fromEmail?: string;
            fromName?: string;
            host?: string;
            ignoreTLS?: boolean;
            password?: string;
            port?: number | string;
            replyTo?: string;
            requireTLS?: boolean;
            secure?: boolean;
            username?: string;
        };
        sourceId?: string | number;
        sourceUrl?: string;
        title?: string;
        v?: number;
        whatsapp?: {
            chrome?: {
                attachmentUrl?: string;
                includeTicketImage?: boolean;
                lastSentAt?: number;
                messageTemplate?: string;
                minDelayMs?: number;
            };
            greenApi?: {
                attachmentUrl?: string;
                includeTicketImage?: boolean;
                lastSentAt?: number;
                messageTemplate?: string;
                minDelayMs?: number;
                selectedInstanceId?: string;
            };
            phoneInterpretation?: {
                defaultCountryCode?: string;
                localLeadingZeroMode?: "reject" | "replace-with-country-code";
                numbersWithoutPrefixMode?: "reject" | "already-international" | "prepend-country-code";
            };
            provider?: "waba" | "green-api" | "chrome";
            waba?: {
                lang?: string;
                lastSentAt?: number;
            };
            whatsappColumn?: string;
        };
        whatsappAutoReplyTemplate?: string | null;
        wpFormPlugin?: string;
    };
    addonOverrides?: {
        customEmailFooter?: string;
        disableGoogleWallet?: boolean;
        disableMailApp?: boolean;
        disableTrakEmail?: boolean;
        enableMultiCardZip?: boolean;
        forceEnableSponsored?: boolean;
        fullCaseImportBackendUi?: boolean;
        handlingConditions?: {
            field: string;
            values: (string | number)[];
        }[];
        inlineQr?: boolean;
        noLinkInEmail?: boolean;
        receiverEmail?: string;
        supportTools?: boolean;
        timestampMs: string | number;
    };
    agentForm?: FieldConfig[];
    agentInputMaskError?: string;
    agentInputMaskRegex?: string;
    agentTags?: string[];
    agentTemplates?: {
        [index: string]: {
            steps: string[];
            tags: string[];
        };
    };
    aggregatedReportFields?: string[];
    allReportDays?: number;
    assignationHandledSteps?: string[];
    assignationStep?: string;
    assignedAgentField?: string;
    assignedHelperAgentsField?: string;
    assigneeByTagBulkClientField?: string;
    assigneeByTagSteps?: {
        [index: string]: string;
    };
    autoRecognizeNaturalKeyRegex?: {
        expression: string;
        flags?: string;
    };
    autoRules?: AutoRuleConfig[];
    autoSaveBulkClientTagToCreationAttachment?: {
        internal?: boolean;
        kind: string;
    };
    autoSaveNaturalKeyToCreationAttachment?: {
        internal?: boolean;
        kind: string;
    };
    blockRules?: BlockRuleConfig[];
    brandingColor?: string;
    bulkClientField?: string;
    bulkClientForm?: FieldConfig[];
    bulkClientInputMaskError?: string;
    bulkClientInputMaskRegex?: string;
    bulkClientMandatoryAtSteps?: string[];
    bulkClientTags?: string[];
    bulkClientTitleFormat?: string;
    bulkClientsubtitleFormat?: string;
    bulkCreation?: {
        sourceKind: string;
        targetKind: string;
        targetType: EditorId;
    };
    cameraSteps?: string[];
    caseBadgeColorField?: string;
    caseCreationAutoTags?: {
        [index: string]: string[];
    };
    caseGroupsDays?: number;
    caseSummaries?: CaseSummarySpec[];
    caseTitleFormat?: string;
    checkInSteps?: string[];
    contact?: string;
    correlationIdAttachment?: string;
    customAdminActions?: CustomAdminAction[];
    customCheckInRequestProcessed?: boolean;
    customContacts?: {
        label: string;
        url: string;
    };
    customReports?: CustomReport[];
    defaultAgentTemplate?: string;
    defaultLang?: ProcessLang;
    delayThresholds?: {
        [index: string]: number;
    };
    description?: string;
    directSubscriptionFields?: string[];
    discount?: number;
    discountCode?: string;
    displayedFieldsPerAgentTag?: {
        [tag: string]: string[];
    };
    doneIndicatorFields?: string[];
    externalApp?: ExternalAppConfig;
    extidUpdaterAttachmentKind?: string;
    extraFilterFields?: string[];
    feedback?: FeedbackSettings;
    fileLinksPrefix?: string;
    flagCaseAsEmptyFields?: string[];
    flags?: {
        agentActionStats?: boolean;
        agentPushNotifications?: boolean;
        alertDeniedGps?: boolean;
        allowCaseLookupInFocusedUi?: boolean;
        allowDuplicatedNaturalKeys?: boolean;
        assignedToMe?: boolean;
        bulkCreationAdminTools?: boolean;
        caseGroups?: boolean;
        caseViewStepCounts?: boolean;
        correlationIdAsReadableCode?: boolean;
        debugGps?: boolean;
        debugRules?: boolean;
        displayCaseAfterCreation?: boolean;
        emails?: boolean;
        enableCreatedCaseEmailNotifications?: boolean;
        externalAgents?: boolean;
        extraSteps?: boolean;
        findAndCheckIn?: boolean;
        fineGrainedCameraSelection?: boolean;
        focusedUiForNonAdmins?: boolean;
        formListEntryUpdate?: boolean;
        fullCaseImportBackendUi?: boolean;
        genCode?: boolean;
        genReadableCode?: boolean;
        hideCaseTitleInAdminCaseView?: boolean;
        hideShortCaseCode?: boolean;
        hideStatsSection?: boolean;
        homeGpsLookup?: boolean;
        homeReports?: boolean;
        lockedDownConfig?: boolean;
        lockedDownQrCard?: boolean;
        manualCameraDeviceIdSelection?: boolean;
        manualQrCardFormats?: boolean;
        naturalKey?: boolean;
        nfcUidAsNaturalKey?: boolean;
        noAgentInPublic?: boolean;
        noAssignment?: boolean;
        noFilterableSelect?: boolean;
        noFormNotes?: boolean;
        noHomeAgentReport?: boolean;
        noHomeAssignedToMeReport?: boolean;
        noManualCodeInput?: boolean;
        noManualDataEntry?: boolean;
        noPendingMoves?: boolean;
        noRafale?: boolean;
        noRafaleAtCreatedStep?: boolean;
        noWasmQr?: boolean;
        offlineCaseData?: boolean;
        operationalViewAsHomeReports?: boolean;
        optionalCaseAutoAssignation?: boolean;
        publicAccess?: boolean;
        publicNotifReminder?: boolean;
        rafaleCameraInCaseLookup?: boolean;
        readonlyCases?: boolean;
        readonlyCasesForNonAdmins?: boolean;
        resolveFormEntities?: boolean;
        restrictedRead?: boolean;
        uuidNaturalKeys?: boolean;
    };
    focusedUiAgentTags?: string[];
    form?: FormConfig;
    formRestrictions?: FormRestriction[];
    formValidationRules?: FormValidationRule[];
    gWalletClassSuffix?: string;
    gWalletHeroImageUrl?: string;
    gpsField?: string;
    gpsLabelField?: string;
    gpsLabelStep?: string;
    gpsNotesField?: string;
    gpsStep?: string;
    homeReportDays?: number;
    inFlightStep?: string;
    jotformPublishedUrl?: string;
    kind: ProcessKind;
    logo?: string;
    makeCasesReadonlyAtSteps?: string[];
    metabaseEmbeds?: {
        [name: string]: {
            height?: number;
            id: number;
            type: "question" | "dashboard";
        };
    };
    naturalKeyTransformations?: TextTransformation[];
    naturalKeyUpdates?: {
        _isGenerated?: boolean;
        att: string;
        step: string;
    }[];
    noCameraSteps?: string[];
    numericIndicatorFields?: string[];
    objective?: string;
    operationalReports?: OperationalReportDefinition[];
    payLinkLastAccess?: string;
    paypalLinkLastAccess?: string;
    pendingRules?: PendingRuleConfig[];
    polarLinkLastAccess?: string;
    publicAppUrl?: string;
    publicPortal?: PublicPortalConfig;
    publicReportDays?: number;
    publicReportFields?: string[];
    qrCard?: {
        applyColorToBackground?: boolean;
        applyColorToBackgroundUrlMap?: boolean;
        applyColorToTitle?: boolean;
        bgColor?: string;
        bgRepeatX?: number;
        bgRepeatY?: number;
        bgUrl?: string;
        bgUrlMap?: {
            [color: string]: string;
        };
        cardCountField?: string;
        codeColor?: string;
        colorFormat?: string;
        customGoogleWallet?: boolean;
        designer?: string;
        extendedAttribution?: boolean;
        footerBackgroundColor?: string;
        format?: "default" | "loyalty" | "advanced" | "credit-card" | "vertical-credit-card";
        grid?: {
            cellHeight?: number;
            cellWidth?: number;
            columns: number;
            gapX?: number;
            gapY?: number;
            marginBottom?: number;
            marginLeft?: number;
            marginRight?: number;
            marginTop?: number;
            rows: number;
        };
        logoUrl?: string;
        noAttribution?: boolean;
        noCode?: boolean;
        noFooter?: boolean;
        pageOrientation?: "portrait" | "landscape";
        pageSize?: "A4" | "LETTER" | "LEGAL" | {
            height: number;
            width: number;
        };
        pages?: {
            bgColor?: string | true;
            bgUrl?: string | true;
            footer?: boolean;
            qr?: boolean | {
                dark?: string;
                light?: string;
                size: number;
                x: number;
                y: number;
            };
            standardTicket?: boolean;
            texts?: {
                alignment?: "left" | "right" | "justify" | "center";
                background?: string;
                bold?: boolean;
                characterSpacing?: number;
                color?: string;
                fontSize?: number;
                format?: string;
                italics?: boolean;
                maxChars?: number;
                maxSize?: number;
                minChars?: number;
                minSize?: number;
                preset?: "title" | "subtitle";
                text?: string;
                transform?: "upper" | "lower";
                width?: number;
                x: number;
                y: number;
            }[];
        }[];
        qr?: {
            dark?: string;
            light?: string;
            size: number;
            x: number;
            y: number;
        };
        qrLogo?: {
            scale: number;
            url: string;
        };
        qrScale?: number;
        renderer?: "pdfmake" | "typst";
        subTitleTextScale?: number;
        subtitleColor?: string;
        subtitleFormat?: string;
        titleColor?: string;
        titleFormat?: string;
    };
    qrPdfFormat?: "6x5" | "8x6" | "8x6 (mini)" | "8x6 (double)" | "4x3";
    qrSubtitleFormat?: string;
    qrTitleFormat?: string;
    readableCodeFormat?: string;
    readerFormats?: CodeReaderFormat[];
    readonlyControlMatchingAgentAndCaseTags?: string[];
    readonlySteps?: string[];
    repeatedSteps?: string[];
    reportDays?: number;
    reportFields?: string[];
    resetSteps?: string[];
    scheduledActions?: ScheduledAction[];
    searchDays?: number;
    selfReportDays?: number;
    source?: string;
    stepReportDays?: number;
    steps: string[];
    translationSubs?: TranslationConfig;
    translations?: TranslationConfig;
    uiCaseTitleFormat?: string;
    updateScanMaxMinutes?: number;
}

Type declaration

  • Optional addonCheckInsDeadline?: string

    ISO date string after which new check-ins are no longer allowed (currently not enforced, but documents long term, regular use add-ons)

  • Optional addonCreatorContext?: {
        addon?: string;
        bcc?: string | string[];
        bodyIsHtml?: boolean;
        bulkDownloadTickets?: boolean;
        businessName?: string;
        cardCountField?: string | null;
        caseTitleFormat?: string;
        checkInType?: "repeat" | "norepeat" | "sessions" | "norepeatSessions" | "inout" | "norepeatInout" | "custom";
        customQrContentField?: string | null;
        disableGoogleWallet?: boolean;
        disableMultiCardZipLink?: boolean;
        disableTicketFooter?: boolean;
        docId?: string;
        docName?: string;
        email?: string;
        emailBody?: string;
        emailField?: string | number;
        emailFieldConfirmed?: boolean;
        emailFieldName?: string;
        emailSubject?: string;
        externalQrProvider?: ExternalQrProvider | null;
        findAndCheckIn?: boolean;
        form?: FormConfig;
        fromName?: string;
        gWalletAttendeeNameFormat?: string;
        gWalletEventName?: string;
        gWalletOrganizationName?: string;
        gps?: boolean;
        handlingConditions?: {
            field: string;
            values: (string | number)[];
        }[];
        inlineQr?: boolean;
        ip?: string;
        loc?: string;
        maxCheckInsField?: string | null;
        mode?: "sponsored" | "normal";
        noLinkInEmail?: boolean;
        offlineSync?: boolean;
        passName?: string;
        replyTo?: string;
        senderPolicy?: "gmail" | "trak" | "both" | "smtp";
        sessionPermissions?: boolean;
        sheetName?: string;
        signature?: boolean;
        smtpCredentials?: {
            connectionTimeoutMs?: number;
            enabled?: boolean;
            fromEmail?: string;
            fromName?: string;
            host?: string;
            ignoreTLS?: boolean;
            password?: string;
            port?: number | string;
            replyTo?: string;
            requireTLS?: boolean;
            secure?: boolean;
            username?: string;
        };
        sourceId?: string | number;
        sourceUrl?: string;
        title?: string;
        v?: number;
        whatsapp?: {
            chrome?: {
                attachmentUrl?: string;
                includeTicketImage?: boolean;
                lastSentAt?: number;
                messageTemplate?: string;
                minDelayMs?: number;
            };
            greenApi?: {
                attachmentUrl?: string;
                includeTicketImage?: boolean;
                lastSentAt?: number;
                messageTemplate?: string;
                minDelayMs?: number;
                selectedInstanceId?: string;
            };
            phoneInterpretation?: {
                defaultCountryCode?: string;
                localLeadingZeroMode?: "reject" | "replace-with-country-code";
                numbersWithoutPrefixMode?: "reject" | "already-international" | "prepend-country-code";
            };
            provider?: "waba" | "green-api" | "chrome";
            waba?: {
                lang?: string;
                lastSentAt?: number;
            };
            whatsappColumn?: string;
        };
        whatsappAutoReplyTemplate?: string | null;
        wpFormPlugin?: string;
    }

    add-on metadata and round-tripped settings. canonical runtime behavior should usually be read from top-level config (form, flags, qrCard, operationalReports, etc.); this object mostly exists so add-ons can reopen their last saved settings. a smaller subset is still read directly by backend/admin/check-in flows.

    • Optional addon?: string

      non-ticket addon identifier (for addons like ct-status-addon)

    • Optional bcc?: string | string[]

      optional BCC recipients; stored either as CSV text or as an email array

    • Optional bodyIsHtml?: boolean

      whether emailBody should be interpreted as HTML

    • Optional bulkDownloadTickets?: boolean

      whether bulk ticket download reports should be generated into canonical config

    • Optional businessName?: string

      voucher-addon business label used to regenerate canonical ticket subtitle settings

    • Optional cardCountField?: string | null

      source field for generating multiple cards per attendee; canonical effect is generated into qrCard.cardCountField

    • Optional caseTitleFormat?: string

      custom attendee title format used by add-ons; canonical display still comes from top-level title formats

    • Optional checkInType?: "repeat" | "norepeat" | "sessions" | "norepeatSessions" | "inout" | "norepeatInout" | "custom"

      selected check-in mode; still used by the check-in app and backend support hooks

    • Optional customQrContentField?: string | null

      source field whose value becomes the attendee natural key / QR payload

    • Optional disableGoogleWallet?: boolean

      legacy/compat fallback for hiding Google Wallet links in attendee emails

    • Optional disableMultiCardZipLink?: boolean

      whether multi-ticket emails should hide the ZIP download link; only applies when cardCountField is set

    • Optional disableTicketFooter?: boolean

      whether generated ticket PDFs should hide the footer; canonical effect is generated into qrCard.noFooter

    • Optional docId?: string

      non-ticket addon source document id

    • Optional docName?: string

      non-ticket addon source document title

    • Optional email?: string

      email of the add-on/project owner; used by billing, invoices and support hooks

    • Optional emailBody?: string

      body template used when sending attendee emails

    • Optional emailField?: string | number

      attendee email field identifier used by add-ons/check-in tools

    • Optional emailFieldConfirmed?: boolean

      add-on UI hint confirming the chosen email field really looks like an email field

    • Optional emailFieldName?: string

      attendee email field label shown in add-on/check-in email tools

    • Optional emailSubject?: string

      subject template used when sending attendee emails

    • Optional externalQrProvider?: ExternalQrProvider | null

      external provider whose QR payloads need to be normalized before natural-key lookup

    • Optional findAndCheckIn?: boolean

      whether the addon prefers explicit lookup-before-check-in; canonical effect is generated into flags

    • Optional form?: FormConfig

      partner-events custom form editor state; top-level form remains canonical

    • Optional fromName?: string

      sender display name used for attendee emails

    • Optional gWalletAttendeeNameFormat?: string

      custom Google Wallet attendee name format; falls back to top-level qrTitleFormat when unset

    • Optional gWalletEventName?: string

      custom Google Wallet event name; storing this opts the project into a dedicated class

    • Optional gWalletOrganizationName?: string

      custom Google Wallet issuer name; storing this opts the project into a dedicated class

    • Optional gps?: boolean

      whether Done scans should capture GPS; canonical effect is generated into top-level form/report config

    • Optional handlingConditions?: {
          field: string;
          values: (string | number)[];
      }[]

      forms-only handling gate used before creating/sending attendee output

    • Optional inlineQr?: boolean

      legacy/compat fallback for embedding QR images in attendee emails

    • Optional ip?: string

      creator IP captured by the add-on for support/analytics

    • Optional loc?: string

      creator location/country captured by the add-on for support/admin views

    • Optional maxCheckInsField?: string | null

      source field that caps allowed check-ins; canonical effect is generated into blockRules

    • Optional mode?: "sponsored" | "normal"

      current add-on pricing mode; some frontend/backend payment flows still read it directly

    • Optional noLinkInEmail?: boolean

      legacy/compat fallback for stripping external links from attendee emails

    • Optional offlineSync?: boolean

      whether the offline case cache / sync workflow should be enabled; canonical effect is generated into flags

    • Optional passName?: string

      attachment filename stem for generated ticket PDFs

    • Optional replyTo?: string

      default reply-to address used for attendee emails regardless of sender transport

    • Optional senderPolicy?: "gmail" | "trak" | "both" | "smtp"

      which sender path should be used for attendee emails

    • Optional sessionPermissions?: boolean

      whether session-specific staff permissions should be generated into canonical config

    • Optional sheetName?: string

      non-ticket addon sheet/tab name

    • Optional signature?: boolean

      whether Done scans should capture a signature; canonical effect is generated into top-level form config

    • Optional smtpCredentials?: {
          connectionTimeoutMs?: number;
          enabled?: boolean;
          fromEmail?: string;
          fromName?: string;
          host?: string;
          ignoreTLS?: boolean;
          password?: string;
          port?: number | string;
          replyTo?: string;
          requireTLS?: boolean;
          secure?: boolean;
          username?: string;
      }

      custom SMTP settings; consulted only when senderPolicy is smtp

      • Optional connectionTimeoutMs?: number
      • Optional enabled?: boolean
      • Optional fromEmail?: string
      • Optional fromName?: string
      • Optional host?: string
      • Optional ignoreTLS?: boolean
      • Optional password?: string
      • Optional port?: number | string
      • Optional replyTo?: string
      • Optional requireTLS?: boolean
      • Optional secure?: boolean
      • Optional username?: string
    • Optional sourceId?: string | number

      source document / upstream record id used for support links and add-on reopening

    • Optional sourceUrl?: string

      source document / form URL used in admin/support views

    • Optional title?: string

      user-facing title captured by the add-on; used by billing/invoice flows

    • Optional v?: number

      add-on payload/schema version used by some add-ons during migrations

    • Optional whatsapp?: {
          chrome?: {
              attachmentUrl?: string;
              includeTicketImage?: boolean;
              lastSentAt?: number;
              messageTemplate?: string;
              minDelayMs?: number;
          };
          greenApi?: {
              attachmentUrl?: string;
              includeTicketImage?: boolean;
              lastSentAt?: number;
              messageTemplate?: string;
              minDelayMs?: number;
              selectedInstanceId?: string;
          };
          phoneInterpretation?: {
              defaultCountryCode?: string;
              localLeadingZeroMode?: "reject" | "replace-with-country-code";
              numbersWithoutPrefixMode?: "reject" | "already-international" | "prepend-country-code";
          };
          provider?: "waba" | "green-api" | "chrome";
          waba?: {
              lang?: string;
              lastSentAt?: number;
          };
          whatsappColumn?: string;
      }

      WhatsApp delivery settings round-tripped by Sheets/Excel add-ons

      • Optional chrome?: {
            attachmentUrl?: string;
            includeTicketImage?: boolean;
            lastSentAt?: number;
            messageTemplate?: string;
            minDelayMs?: number;
        }
        • Optional attachmentUrl?: string
        • Optional includeTicketImage?: boolean
        • Optional lastSentAt?: number
        • Optional messageTemplate?: string
        • Optional minDelayMs?: number
      • Optional greenApi?: {
            attachmentUrl?: string;
            includeTicketImage?: boolean;
            lastSentAt?: number;
            messageTemplate?: string;
            minDelayMs?: number;
            selectedInstanceId?: string;
        }
        • Optional attachmentUrl?: string
        • Optional includeTicketImage?: boolean
        • Optional lastSentAt?: number
        • Optional messageTemplate?: string
        • Optional minDelayMs?: number
        • Optional selectedInstanceId?: string
      • Optional phoneInterpretation?: {
            defaultCountryCode?: string;
            localLeadingZeroMode?: "reject" | "replace-with-country-code";
            numbersWithoutPrefixMode?: "reject" | "already-international" | "prepend-country-code";
        }
        • Optional defaultCountryCode?: string

          digits only, without + or 00 prefix

        • Optional localLeadingZeroMode?: "reject" | "replace-with-country-code"
        • Optional numbersWithoutPrefixMode?: "reject" | "already-international" | "prepend-country-code"
      • Optional provider?: "waba" | "green-api" | "chrome"
      • Optional waba?: {
            lang?: string;
            lastSentAt?: number;
        }
        • Optional lang?: string
        • Optional lastSentAt?: number
      • Optional whatsappColumn?: string

        last selected phone-number column, shared across providers

    • Optional whatsappAutoReplyTemplate?: string | null

      auto-reply template used by Sheets/Excel WhatsApp delivery flows

    • Optional wpFormPlugin?: string

      supported WordPress form plugin identifier for event-ticket projects

  • Optional addonOverrides?: {
        customEmailFooter?: string;
        disableGoogleWallet?: boolean;
        disableMailApp?: boolean;
        disableTrakEmail?: boolean;
        enableMultiCardZip?: boolean;
        forceEnableSponsored?: boolean;
        fullCaseImportBackendUi?: boolean;
        handlingConditions?: {
            field: string;
            values: (string | number)[];
        }[];
        inlineQr?: boolean;
        noLinkInEmail?: boolean;
        receiverEmail?: string;
        supportTools?: boolean;
        timestampMs: string | number;
    }

    settings to push from API to Google addon local data stores

    • Optional customEmailFooter?: string

      custom HTML snippet to use as footer in emails

    • Optional disableGoogleWallet?: boolean

      disable "Add to google wallet" link in ticket emails

    • Optional disableMailApp?: boolean

      do not send emails with MailApp (only Trak)

    • Optional disableTrakEmail?: boolean

      do not send emails with Trak (only MailApp)

    • Optional enableMultiCardZip?: boolean

      legacy/compat fallback for multi-card ZIP download links in emails

    • Optional forceEnableSponsored?: boolean

      enable sponsored projects event when conditions are not met

    • Optional fullCaseImportBackendUi?: boolean

      enable full import of cases (with naturalkey) using backend ui at /full-case-import

    • Optional handlingConditions?: {
          field: string;
          values: (string | number)[];
      }[]

      response is sent to trak and qr cards sent only when these values match

    • Optional inlineQr?: boolean

      insert QR image inside ticket email

    • Optional noLinkInEmail?: boolean

      avoid (external) links in email, because of strict email firewalls

    • Optional receiverEmail?: string

      send all tickets to this fixed email address

    • Optional supportTools?: boolean

      show support tools in the add-on UI

    • timestampMs: string | number

      timestamp of last override update use iso timestamp so it can be human readable, like 2024-05-18T17:11

  • Optional agentForm?: FieldConfig[]

    extra data recorded for each agent

  • Optional agentInputMaskError?: string

    error message displayed when agentInputMaskRegex doesn't match

  • Optional agentInputMaskRegex?: string

    constrains agent names

  • Optional agentTags?: string[]

    tags that can be assigned to agents to group them. can be used to filter agent selection in a form (whitelist/blacklist). extAgent is special (external agent with only scan rights and no report access) Feedback is special (robot agents used to receive public feedback)

  • Optional agentTemplates?: {
        [index: string]: {
            steps: string[];
            tags: string[];
        };
    }

    templates to quickly setup tags and steps for new agents (new agent form)

    • [index: string]: {
          steps: string[];
          tags: string[];
      }
      • steps: string[]
      • tags: string[]
  • Optional aggregatedReportFields?: string[]

    fields for which the value in reports (all, step, assignee) is a list of all value in history

  • Optional allReportDays?: number

    period length for AllCases

  • Optional assignationHandledSteps?: string[]

    for assigned cases: steps where the agent must scan to handle the assignment

  • Optional assignationStep?: string

    step that assigns the case to the scan author

  • Optional assignedAgentField?: string

    field that sets the agent responsible for this case

  • Optional assignedHelperAgentsField?: string

    field that sets other agents assigned to help the assignee (used for notifs)

  • Optional assigneeByTagBulkClientField?: string

    field that sets the agent responsible for this case by matching the bulk client (field value) tags

  • Optional assigneeByTagSteps?: {
        [index: string]: string;
    }

    any case that reaches these steps is automatically assigned to the first agent with the associated tag

    • [index: string]: string
  • Optional autoRecognizeNaturalKeyRegex?: {
        expression: string;
        flags?: string;
    }

    if a free-form case lookup matches this, apply naturalKeyTransformations and submit a findCase query instead

    • expression: string

      regex expression to match

    • Optional flags?: string

      regex matching flags, 'i' by default

  • Optional autoRules?: AutoRuleConfig[]

    automatic processing applied to incoming scans

  • Optional autoSaveBulkClientTagToCreationAttachment?: {
        internal?: boolean;
        kind: string;
    }

    At creation step, save the first bulk client tag to attachments, using this attachment template

    • Optional internal?: boolean
    • kind: string
  • Optional autoSaveNaturalKeyToCreationAttachment?: {
        internal?: boolean;
        kind: string;
    }

    At creation step, save the natural key to attachments using this attachment template

    • Optional internal?: boolean
    • kind: string
  • Optional blockRules?: BlockRuleConfig[]

    conditions under which an incoming scan is rejected and discarded

  • Optional brandingColor?: string

    color used to distinguish the process in a listing, and added to top app-bar

  • Optional bulkClientField?: string

    field that the bulkclients table entries map to (used for client column in reports) applications with this field set a considered to be using bulk clients

  • Optional bulkClientForm?: FieldConfig[]

    extra data recorded for each bulkclient

  • Optional bulkClientInputMaskError?: string

    error message displayed when bulkClientInputMaskRegex doesn't match

  • Optional bulkClientInputMaskRegex?: string

    constrains bulkClient names

  • Optional bulkClientMandatoryAtSteps?: string[]

    steps at which a bulkClient should be set, either because already set or set but this step's attachments unless the app sending the events doesn't handle failures, prefer reqAtt block rule to this

  • Optional bulkClientTags?: string[]

    tags used to organize bulk clients into groups can be used to filter agent selection in a form (whitelist/blacklist).

  • Optional bulkClientTitleFormat?: string

    format string used for page title when exporting bulkclient-indexed data QR PDF

  • Optional bulkClientsubtitleFormat?: string

    format string used for page subtitle when exporting bulkclient-indexed data QR PDF

  • Optional bulkCreation?: {
        sourceKind: string;
        targetKind: string;
        targetType: EditorId;
    }

    settings for auto-creating multiple cases with values of field target taken from multiple values set for field source (only field kinds from Created step attachments are allowed)

    • sourceKind: string
    • targetKind: string

      field that is automatically created for each source value (NOTE: values of this field can't be edited later)

    • targetType: EditorId

      attachment.dataType to use for the target field; this should be idempotent under asUpdatableEditor()

  • Optional cameraSteps?: string[]

    when generating code, main buttons (except Created) are useless because they don't have the code to work with, thus hidden. exceptions (which must be there because they use camera) are listed here. this is typically the done step (done in the fields)

  • Optional caseBadgeColorField?: string

    field that sets the case code badge color (to denote priority, category, etc.)

  • Optional caseCreationAutoTags?: {
        [index: string]: string[];
    }

    for each agent tag listed in keys, whenever any such agent creates a case, assign the corresponding tags to the case

    • [index: string]: string[]
  • Optional caseGroupsDays?: number

    period length for case groups listing

  • Optional caseSummaries?: CaseSummarySpec[]

    Values computed from case history data and shown at the top of case views

  • Optional caseTitleFormat?: string

    used to format case readable names in email notifications (only field kinds from Created step attachments are allowed) example: {Nom} {Prénoms}

  • Optional checkInSteps?: string[]

    fields for which a check-in scanner should be used. the check-in scanner continually saves scans without leaving the scanner screen, and shows the latest scans

  • Optional contact?: string

    free-form contact info, provided on application creation

  • Optional correlationIdAttachment?: string

    attachment field copied into the internal correlationId attachment on case creation example: Référence du pli

  • Optional customAdminActions?: CustomAdminAction[]

    Custom admin actions, triggered from the UI and handled by the backend worker

  • Optional customCheckInRequestProcessed?: boolean

    set by backend: did we already send an email to user about custom add-on check-in?

  • Optional customContacts?: {
        label: string;
        url: string;
    }

    used at the bottom of the UI for quick-n-dirty whitelabeling

    • label: string

      custom contact label

    • url: string

      custom contact url

  • Optional customReports?: CustomReport[]

    list of custom (dedicated backend stored proc) reports (download & display)

  • Optional defaultAgentTemplate?: string

    agent template selected by default in new agent form

  • Optional defaultLang?: ProcessLang

    default 2-letter language code (used on the server side)

  • Optional delayThresholds?: {
        [index: string]: number;
    }

    thresholds for acceptable delays, in number of working days, per step; used for visual highlighting

    • [index: string]: number
  • Optional description?: string

    the description provided on process creation, used to help the client setup the process

  • Optional directSubscriptionFields?: string[]

    form fields (names) used to directly notify people on case move

  • Optional discount?: number

    discount percent for add-on payment (0-100)

  • Optional discountCode?: string

    discount code for payment add-on (shown to user and received in paypal notif)

  • Optional displayedFieldsPerAgentTag?: {
        [tag: string]: string[];
    }

    case fields whitelist, per agent tag; currently only used in FindAndCheckIn

    • [tag: string]: string[]
  • Optional doneIndicatorFields?: string[]

    done scans with these fields are counted for the indicators report

  • Optional externalApp?: ExternalAppConfig

    tenant-routing config for ct-preparer's human-login (external app accounts) flow

  • Optional extidUpdaterAttachmentKind?: string

    Use the value of this attachment to replace the previous case extid

  • Optional extraFilterFields?: string[]

    select fields to add to the AllCases/CustomReport/CasesAtStep/PerClientStepPdfReport filters (mostly useful when agent is used for a custom field)

  • Optional feedback?: FeedbackSettings

    Feedback UI config

  • Optional fileLinksPrefix?: string

    prefix to use for file links when rendering in casehistory

  • Optional flagCaseAsEmptyFields?: string[]

    when these fields all have false-ich values, the case is considered empty for filtering purposes; this is used for situations like pickups where nothing was collected, but we have a record to prove the attempt happened.

  • Optional flags?: {
        agentActionStats?: boolean;
        agentPushNotifications?: boolean;
        alertDeniedGps?: boolean;
        allowCaseLookupInFocusedUi?: boolean;
        allowDuplicatedNaturalKeys?: boolean;
        assignedToMe?: boolean;
        bulkCreationAdminTools?: boolean;
        caseGroups?: boolean;
        caseViewStepCounts?: boolean;
        correlationIdAsReadableCode?: boolean;
        debugGps?: boolean;
        debugRules?: boolean;
        displayCaseAfterCreation?: boolean;
        emails?: boolean;
        enableCreatedCaseEmailNotifications?: boolean;
        externalAgents?: boolean;
        extraSteps?: boolean;
        findAndCheckIn?: boolean;
        fineGrainedCameraSelection?: boolean;
        focusedUiForNonAdmins?: boolean;
        formListEntryUpdate?: boolean;
        fullCaseImportBackendUi?: boolean;
        genCode?: boolean;
        genReadableCode?: boolean;
        hideCaseTitleInAdminCaseView?: boolean;
        hideShortCaseCode?: boolean;
        hideStatsSection?: boolean;
        homeGpsLookup?: boolean;
        homeReports?: boolean;
        lockedDownConfig?: boolean;
        lockedDownQrCard?: boolean;
        manualCameraDeviceIdSelection?: boolean;
        manualQrCardFormats?: boolean;
        naturalKey?: boolean;
        nfcUidAsNaturalKey?: boolean;
        noAgentInPublic?: boolean;
        noAssignment?: boolean;
        noFilterableSelect?: boolean;
        noFormNotes?: boolean;
        noHomeAgentReport?: boolean;
        noHomeAssignedToMeReport?: boolean;
        noManualCodeInput?: boolean;
        noManualDataEntry?: boolean;
        noPendingMoves?: boolean;
        noRafale?: boolean;
        noRafaleAtCreatedStep?: boolean;
        noWasmQr?: boolean;
        offlineCaseData?: boolean;
        operationalViewAsHomeReports?: boolean;
        optionalCaseAutoAssignation?: boolean;
        publicAccess?: boolean;
        publicNotifReminder?: boolean;
        rafaleCameraInCaseLookup?: boolean;
        readonlyCases?: boolean;
        readonlyCasesForNonAdmins?: boolean;
        resolveFormEntities?: boolean;
        restrictedRead?: boolean;
        uuidNaturalKeys?: boolean;
    }

    feature flags

    • Optional agentActionStats?: boolean

      enable agent stats report (it proved confusing for early clients)

    • Optional agentPushNotifications?: boolean

      enables agents to setup push notifications for process events

    • Optional alertDeniedGps?: boolean

      alert agents when a scan failed to read gps because denied

    • Optional allowCaseLookupInFocusedUi?: boolean

      allow case lookup in focusedUiForNonAdmins mode

    • Optional allowDuplicatedNaturalKeys?: boolean

      this process expects duplicated natural keys, the latest entry will be used

    • Optional assignedToMe?: boolean

      does this application assign cases to agents? (so they can check a report of cases assigned to them)

    • Optional bulkCreationAdminTools?: boolean

      display bulk client/agent creation tools for all admins

    • Optional caseGroups?: boolean

      use named case groups

    • Optional caseViewStepCounts?: boolean

      display how many times each step was found in history in case view

    • Optional correlationIdAsReadableCode?: boolean

      use correlationId as readableCode in UI display

    • Optional debugGps?: boolean

      send gps failure messages back to server

    • Optional debugRules?: boolean

      add technical debug logging for rules that don't match

    • Optional displayCaseAfterCreation?: boolean

      after a creation scan is validated, show case view page (done automatically for genCode)

    • Optional emails?: boolean

      allow agents to set their emails: used for notifs. caseTitleFormat is required when this is set

    • Optional enableCreatedCaseEmailNotifications?: boolean

      enable the Created email notification; disabled by default to avoid unexpected high-volume alerts

    • Optional externalAgents?: boolean

      allow giving external agents access to specific cases

    • Optional extraSteps?: boolean

      allow extra steps in agent creation form

    • Optional findAndCheckIn?: boolean

      show find-and-check-in button on homepage

    • Optional fineGrainedCameraSelection?: boolean

      in code reader, allow cycling through all cameras (instead of default front/back)

    • Optional focusedUiForNonAdmins?: boolean

      used minimal UI for non-admin agents (designed for singe-application devices)

    • Optional formListEntryUpdate?: boolean

      allow admins to update or remove existing form list entries (in addition to adding new entries)

    • Optional fullCaseImportBackendUi?: boolean

      allow access to the backend-hosted UI for importing cases (naturalkey)

    • Optional genCode?: boolean

      allow case code generation

    • Optional genReadableCode?: boolean

      allow readable code generation (in the backend, consecutive integers)

    • Optional hideCaseTitleInAdminCaseView?: boolean

      do not show case title in CaseView (caseSummaries can be more readable)

    • Optional hideShortCaseCode?: boolean

      do not show short case code in reports, etc.

    • Optional hideStatsSection?: boolean

      do not display the stats section in the reports tab

    • Optional homeGpsLookup?: boolean

      put gps lookup widget on home page

    • Optional homeReports?: boolean

      display reports on home tab (assigned to me, my summary)

    • Optional lockedDownConfig?: boolean

      instruct API config modules (like the Forms/Sheets addons) to not change config for this process

    • Optional lockedDownQrCard?: boolean

      do not update config.qrCard with local addon config in Google Apps Script (preserve custom card)

    • Optional manualCameraDeviceIdSelection?: boolean

      force use of manual detection of front/back camera this tends to work better than facingMode constrainst on phones with multiple back cameras, but is artisanal

    • Optional manualQrCardFormats?: boolean

      instructs the google workspace addons to not automatically generate (overwrite) qrTitleFormat and qrSubtitleFormat

    • Optional naturalKey?: boolean

      enable natural key scan in the reader + mapping on the server

    • Optional nfcUidAsNaturalKey?: boolean

      enable nfc tag uid use as natural key; requires naturalKey:true

    • Optional noAgentInPublic?: boolean

      disable agents in public app reports

    • Optional noAssignment?: boolean

      this (parcel application) doesn't use an assignment (PausedStepID) step

    • Optional noFilterableSelect?: boolean

      disable filterable select editor use

    • Optional noFormNotes?: boolean

      do not show notes in reader form

    • Optional noHomeAgentReport?: boolean

      on the home tab, hide the My summary report

    • Optional noHomeAssignedToMeReport?: boolean

      on the home tab, hide the Assigned to me report

    • Optional noManualCodeInput?: boolean

      disable field for manually entering the scanned UUID code (useless clutter when using micro PDF format, etc.)

    • Optional noManualDataEntry?: boolean

      disable manual data entry in QR forms (everything comes from the scanned QR; this hides the form to users)

    • Optional noPendingMoves?: boolean

      do not put scans into pending moves (reject them right away)

    • Optional noRafale?: boolean

      disable rafale in case scanner (auto-submit every step)

    • Optional noRafaleAtCreatedStep?: boolean

      disable rafale in case scanner at Created step (auto-submit)

    • Optional noWasmQr?: boolean

      don't use the default wasm-based QR reader (fallback to JS)

    • Optional offlineCaseData?: boolean

      show button for caching case data for offline lookups

    • Optional operationalViewAsHomeReports?: boolean

      show operation view reports as home reports

    • Optional optionalCaseAutoAssignation?: boolean

      when auto-assignation by tag (bulkclient/step) fails, don't raise 'No agent_id extracted by...' api-err, just leave the case unassigned

    • Optional publicAccess?: boolean

      enable Public app access to cases (without a bulkclient key)

    • Optional publicNotifReminder?: boolean

      for bulk clients, show a reminder to activate notifs if notifs not active on bc reports

    • Optional rafaleCameraInCaseLookup?: boolean

      in case lookup, put camera in rafale mode (this makes single searches require confirmation)

    • Optional readonlyCases?: boolean

      forbid case data removal

    • Optional readonlyCasesForNonAdmins?: boolean

      for non-admins, forbid case data removal

    • Optional resolveFormEntities?: boolean

      apply automatic entity (agent, bulkclient, select fields) resolution for all scans

    • Optional restrictedRead?: boolean

      read access to scan (form) data should be restricted for this application (see canReadAllCasesAgentTag, canUnlockAllCasesAgentTag and caseCreationAutoTags)

    • Optional uuidNaturalKeys?: boolean

      marks this process as having UUID-valued natural keys, which influences scanned value resolution

  • Optional focusedUiAgentTags?: string[]

    apply focusedUiForNonAdmins (if enabled) only to agents with these tags, no matter if they are admin or not

  • Optional form?: FormConfig

    scan form definition per step

  • Optional formRestrictions?: FormRestriction[]

    used to disable some form fields based on agent tags

  • Optional formValidationRules?: FormValidationRule[]

    global validation rules that involve multiple fields; currently only checked client-side

  • Optional gWalletClassSuffix?: string

    class suffix (generated by the backend) for Google Wallet

  • Optional gWalletHeroImageUrl?: string

    hero image URL for the Google Wallet card

  • Optional gpsField?: string

    field that records gps (gps lookup report)

  • Optional gpsLabelField?: string

    field that records gps subject/label (gps lookup report)

  • Optional gpsLabelStep?: string

    step at which gps label is recorded into gpsLabelField (gps lookup report)

  • Optional gpsNotesField?: string

    field that records gps step notes/comments (gps lookup report)

  • Optional gpsStep?: string

    step at which gps data/notes is recorded into gpsField/gpsNotesField (gps lookup report)

  • Optional homeReportDays?: number

    period length for reports on the home page

  • Optional inFlightStep?: string

    at this step, cases (parcels) are considered inflight

  • Optional jotformPublishedUrl?: string

    legacy top-level copy of the published Jotform URL, kept for old Jotform-backed processes

  • kind: ProcessKind

    Which kind of item is tracked by this application?

  • Optional logo?: string

    url to https png logo (shown in the public app's header) you can use https://share.darkaa.com/ (make sure it doesn't expire!)

  • Optional makeCasesReadonlyAtSteps?: string[]

    whenever a case reaches these steps, apply the readonlyCase tag to them

  • Optional metabaseEmbeds?: {
        [name: string]: {
            height?: number;
            id: number;
            type: "question" | "dashboard";
        };
    }

    metabase dashboards that can be added to operational reports

    keyed by internal id as used in the "metabase" kind of operationalReports

    • [name: string]: {
          height?: number;
          id: number;
          type: "question" | "dashboard";
      }
      • Optional height?: number

        height of the host iframe, 800 (px) by default

      • id: number

        metabase id, can be found in the url on https://mb.int.trak.codes/

      • type: "question" | "dashboard"
  • Optional naturalKeyTransformations?: TextTransformation[]

    apply these regex transformations before using user-supplied naturalKeys; the transformatons are applied in definition order NOTE: this applies to scanned codes, not to codes manually entered into a field that happens to be mapped to a naturalKey (use an inputMask for that)

  • Optional naturalKeyUpdates?: {
        _isGenerated?: boolean;
        att: string;
        step: string;
    }[]

    use the value of this attachment at this step to update the naturalKey

  • Optional noCameraSteps?: string[]

    Some steps are only used on items located via search (like when changing the item's QR code). It doesn't make sense to display them on the home page.

  • Optional numericIndicatorFields?: string[]

    fields to sum and show in indicators report

  • Optional objective?: string

    the objective (tracking scenario) provided on process creation

  • Optional operationalReports?: OperationalReportDefinition[]

    reports to show in the operational (top) view

  • Optional payLinkLastAccess?: string

    set by backend: last time add-on user opened the payment page

  • Optional paypalLinkLastAccess?: string

    set by backend: last time add-on user opened the PayPal payment page

  • Optional pendingRules?: PendingRuleConfig[]

    conditions under which an incoming scan is put aside, waiting for a regularization scan

  • Optional polarLinkLastAccess?: string

    set by backend: last time add-on user opened the Polar payment page

  • Optional publicAppUrl?: string

    alternative public url to use for public QR scans; the cextid is forwarded to it as fc

  • Optional publicPortal?: PublicPortalConfig

    tenant-specific config for the standalone public portal hosted on portal.trak.codes

  • Optional publicReportDays?: number

    period length for bulk client reports in the public app

  • Optional publicReportFields?: string[]

    report columns for public app (defaults to reportFields)

  • Optional qrCard?: {
        applyColorToBackground?: boolean;
        applyColorToBackgroundUrlMap?: boolean;
        applyColorToTitle?: boolean;
        bgColor?: string;
        bgRepeatX?: number;
        bgRepeatY?: number;
        bgUrl?: string;
        bgUrlMap?: {
            [color: string]: string;
        };
        cardCountField?: string;
        codeColor?: string;
        colorFormat?: string;
        customGoogleWallet?: boolean;
        designer?: string;
        extendedAttribution?: boolean;
        footerBackgroundColor?: string;
        format?: "default" | "loyalty" | "advanced" | "credit-card" | "vertical-credit-card";
        grid?: {
            cellHeight?: number;
            cellWidth?: number;
            columns: number;
            gapX?: number;
            gapY?: number;
            marginBottom?: number;
            marginLeft?: number;
            marginRight?: number;
            marginTop?: number;
            rows: number;
        };
        logoUrl?: string;
        noAttribution?: boolean;
        noCode?: boolean;
        noFooter?: boolean;
        pageOrientation?: "portrait" | "landscape";
        pageSize?: "A4" | "LETTER" | "LEGAL" | {
            height: number;
            width: number;
        };
        pages?: {
            bgColor?: string | true;
            bgUrl?: string | true;
            footer?: boolean;
            qr?: boolean | {
                dark?: string;
                light?: string;
                size: number;
                x: number;
                y: number;
            };
            standardTicket?: boolean;
            texts?: {
                alignment?: "left" | "right" | "justify" | "center";
                background?: string;
                bold?: boolean;
                characterSpacing?: number;
                color?: string;
                fontSize?: number;
                format?: string;
                italics?: boolean;
                maxChars?: number;
                maxSize?: number;
                minChars?: number;
                minSize?: number;
                preset?: "title" | "subtitle";
                text?: string;
                transform?: "upper" | "lower";
                width?: number;
                x: number;
                y: number;
            }[];
        }[];
        qr?: {
            dark?: string;
            light?: string;
            size: number;
            x: number;
            y: number;
        };
        qrLogo?: {
            scale: number;
            url: string;
        };
        qrScale?: number;
        renderer?: "pdfmake" | "typst";
        subTitleTextScale?: number;
        subtitleColor?: string;
        subtitleFormat?: string;
        titleColor?: string;
        titleFormat?: string;
    }

    settings for generated QR cards from cases (data-qr)

    • Optional applyColorToBackground?: boolean

      apply generic color (colorFormat) to page background

    • Optional applyColorToBackgroundUrlMap?: boolean

      use the color (colorFormat) entry of the record as index in the qrCard.bgUrlMap to get the background image

    • Optional applyColorToTitle?: boolean

      apply generic color (colorFormat) to title text?

    • Optional bgColor?: string

      background color, in case background image is not defined

    • Optional bgRepeatX?: number

      for inline bgUrl (data-url or svg), number of horizontal repetitions

    • Optional bgRepeatY?: number

      for inline bgUrl (data-url or svg), number of vertical repetitions

    • Optional bgUrl?: string

      url to download background from

    • Optional bgUrlMap?: {
          [color: string]: string;
      }

      map of color name (colorFormat) to background URL

      • [color: string]: string
    • Optional cardCountField?: string

      for multi-card configurations, the Created form field providing the page count. this also makes a groupIndex field available for qrTitleFormat

    • Optional codeColor?: string

      text color for code

    • Optional colorFormat?: string

      generic color format, same syntax as caseTitleFormat

    • Optional customGoogleWallet?: boolean

      use a custom Google Wallet design (will lazily create gWalletClassSuffix)

    • Optional designer?: string

      app used to design this card (vibes for https://qr-editor.vibes.darkaa.com/)

    • Optional extendedAttribution?: boolean

      use extended attribution, with explicit ad (used for Darkaa-sponsored events)

    • Optional footerBackgroundColor?: string

      background of footer content (transparent by default)

    • Optional format?: "default" | "loyalty" | "advanced" | "credit-card" | "vertical-credit-card"

      qr card preset design

    • Optional grid?: {
          cellHeight?: number;
          cellWidth?: number;
          columns: number;
          gapX?: number;
          gapY?: number;
          marginBottom?: number;
          marginLeft?: number;
          marginRight?: number;
          marginTop?: number;
          rows: number;
      }

      for format=advanced, tiles each configured page template into a sheet grid. page/text/qr coordinates stay relative to the grid cell, not the full sheet.

      • Optional cellHeight?: number
      • Optional cellWidth?: number
      • columns: number
      • Optional gapX?: number
      • Optional gapY?: number
      • Optional marginBottom?: number
      • Optional marginLeft?: number
      • Optional marginRight?: number
      • Optional marginTop?: number
      • rows: number
    • Optional logoUrl?: string

      url to download logo from

    • Optional noAttribution?: boolean

      skip the attribution link (QR code ticket)

    • Optional noCode?: boolean

      skip the short code in the footer

    • Optional noFooter?: boolean

      skip the whole footer

    • Optional pageOrientation?: "portrait" | "landscape"

      for format=advanced, selects a page orientation

    • Optional pageSize?: "A4" | "LETTER" | "LEGAL" | {
          height: number;
          width: number;
      }

      for format=advanced, selects a page size

    • Optional pages?: {
          bgColor?: string | true;
          bgUrl?: string | true;
          footer?: boolean;
          qr?: boolean | {
              dark?: string;
              light?: string;
              size: number;
              x: number;
              y: number;
          };
          standardTicket?: boolean;
          texts?: {
              alignment?: "left" | "right" | "justify" | "center";
              background?: string;
              bold?: boolean;
              characterSpacing?: number;
              color?: string;
              fontSize?: number;
              format?: string;
              italics?: boolean;
              maxChars?: number;
              maxSize?: number;
              minChars?: number;
              minSize?: number;
              preset?: "title" | "subtitle";
              text?: string;
              transform?: "upper" | "lower";
              width?: number;
              x: number;
              y: number;
          }[];
      }[]

      pages spec for advanced format, use https://darkaa.com/canvas-editor.html

    • Optional qr?: {
          dark?: string;
          light?: string;
          size: number;
          x: number;
          y: number;
      }

      explicit QR position and size, use https://darkaa.com/canvas-editor.html

      • Optional dark?: string

        optional dark QR module color override

      • Optional light?: string

        optional light QR background color override

      • size: number
      • x: number
      • y: number
    • Optional qrLogo?: {
          scale: number;
          url: string;
      }

      logo image to be drawn at the center of the QR

      • scale: number

        scale of the logo (0 to 1) relative to QR

      • url: string

        url to download qr logo from

    • Optional qrScale?: number

      a QR scale factor between 0 and 1; position is auto-shifted (center)

    • Optional renderer?: "pdfmake" | "typst"

      engine to use to render the PDF, defaults to pdfmake

    • Optional subTitleTextScale?: number

      a positive, real scale factor applied to (multiline) subtitle

    • Optional subtitleColor?: string

      text color for subtitle

    • Optional subtitleFormat?: string

      subtitle format set by addon user, same syntax as caseTitleFormat

    • Optional titleColor?: string

      text color for title

    • Optional titleFormat?: string

      title format set by addon user, same syntax as caseTitleFormat

  • Optional qrPdfFormat?: "6x5" | "8x6" | "8x6 (mini)" | "8x6 (double)" | "4x3"

    format for printing QR codes

  • Optional qrSubtitleFormat?: string

    format string used for page subtitle when exporting case codes as PDF (autogenerated or set by admin)

  • Optional qrTitleFormat?: string

    format string used for page title when exporting case codes as PDF (autogenerated or set by admin)

  • Optional readableCodeFormat?: string

    used to format generated readable codes example: N° {code} if empty, the code is not displayed

  • Optional readerFormats?: CodeReaderFormat[]

    1-D and 2-D label formats recognized by the wasm code reader

  • Optional readonlyControlMatchingAgentAndCaseTags?: string[]

    if the overlap between agent tags and case tags is included here, then the agent can add/remove the readonlyCase tag to/from the case

  • Optional readonlySteps?: string[]

    steps for which removal or update is forbidden

  • Optional repeatedSteps?: string[]

    steps for which multiples scans are expected per case decides ONLY which scan buttons are shown on a CaseView

  • Optional reportDays?: number

    period length for (full, client, agent) stats reports

  • Optional reportFields?: string[]

    report columns for institution app

  • Optional resetSteps?: string[]

    used to interpret some block rules

  • Optional scheduledActions?: ScheduledAction[]

    background worker actions interpreted from config, without changing case state

  • Optional searchDays?: number

    period length for CaseLookup

  • Optional selfReportDays?: number

    period length for AgentReport

  • Optional source?: string

    from which marketing channel did we get this prospect?

  • Optional stepReportDays?: number

    period length for CaseCurrentStep

  • steps: string[]

    all steps for which cases can be scanned standard ones are Created, Paused, Done

  • Optional translationSubs?: TranslationConfig

    regex substitutions on translations keyed by short lang name, then namespace, then regex.

    for example, use this to replace "client" by "centre" everywhere:

     "fr": {
    "all": {
    "\\bclient\\b": "centre"
    }
    }

    Typical app-wide words to replace: client, agent, dossier/case. This is case sensitive, so you might need another entry for uppercase.

  • Optional translations?: TranslationConfig

    complete translations keyed by short lang name, then namespace, then translation key

    • use (fr|en).common.step(Created|Paused|Done|...) for step labels
    • use (fr|en).common.stepAction(Created|Paused|Done|...) for step button labels (optional for custom steps)
  • Optional uiCaseTitleFormat?: string

    used to format case readable names in admin UI (alls fields from all step attachments are allowed, later fields overwrite earlier ones) example: {Nom} {Prénoms}

  • Optional updateScanMaxMinutes?: number

    after how many minutes can a non-admin agent update a scan they created? use -1 to remove the time limit