declare type int = number;
declare type double = number;
declare type date = Date;
declare type datetime = Date;
interface StandardEntityAttributes {
    account: {
        Name: string;
        NextRenewalDate: date;
        TotalContractAmount: double;
        IsActive: boolean;
        BillingAddressLine1: string;
        BillingAddressLine2: string;
        BillingAddressCity: string;
        BillingAddressState: string;
        BillingAddressZip: string;
        StartDate: datetime;
        EndDate: datetime;
        LicenseCount: int;
        OwnerUserAccount: string;
        ParentAccountExternalId: string;
    };
    contact: {
        FirstName: string;
        LastName: string;
        Email: string;
    };
}
declare type EntityType = keyof StandardEntityAttributes;
interface Methods {
    setAppKey(key: string): void;
    setContact(accountExternalId: string, contactExternalId: string): void;
    trackEvent(name: string, description?: string, quantity?: number, customFields?: Record<string, any>): void;
    setAttribute<E extends EntityType, N extends keyof E>(entity: EntityType, name: N, value: E[N]): void;
    setAttribute<E extends EntityType>(entity: EntityType, attributes: Partial<StandardEntityAttributes[E]>): void;
    incrementAttribute<E extends EntityType>(entity: E, name: string | number | symbol, value: number): void;
    stop(): void;
    setModule(module: string): void;
    urltracking(enabled: boolean): void;
    silent(enabled: boolean): void;
    open(): void;
    close(): void;
}
declare type PushArgs = {
    [P in keyof Methods]: [P, ...Parameters<Methods[P]>];
}[keyof Methods];
interface ChurnZero {
    push<Args extends PushArgs>(args: Args): void;
    verify(): void;
    debug(): void;
}
export interface ChurnZeroAPI {
    ChurnZero: ChurnZero;
}
declare type ExposedMethods = Omit<Methods, 'setAppKey' | 'setContact' | 'stop'>;
export interface Config {
    url: string;
    apiKey: string;
    accountId: string;
    contactId: string;
}
export declare class Client implements ExposedMethods {
    private methods;
    private static embedScript;
    private constructor();
    static connect(config: Config): Promise<Client>;
    trackEvent(...args: Parameters<Methods['trackEvent']>): void;
    setAttribute<E extends EntityType>(entity: EntityType, attributes: Partial<StandardEntityAttributes[E]>): void;
    incrementAttribute<E extends EntityType>(entity: E, name: keyof StandardEntityAttributes[E], value: number): void;
    setModule(...args: Parameters<Methods['setModule']>): void;
    urltracking(...args: Parameters<Methods['urltracking']>): void;
    silent(...args: Parameters<Methods['silent']>): void;
    open(...args: Parameters<Methods['open']>): void;
    close(...args: Parameters<Methods['close']>): void;
}
export {};
