The notifications doesn't necessarly have to be saved in WordPress database nor loaded from JSON files. A good example is dynamic trigger testing where all the notifications are created on the fly.
Basic example
You can define the notification with a simple array. Below is a minimal example with all the required parameters.
if ( function_exists('notification') ) :notification( ['title'=>'My programmatic notification',// For internal reference.'trigger'=>'trigger_slug',// Trigger slug (can be a Triggerable object).'carriers'=> [ // An array with format: carrier_slug => data array'email'=> ['activated'=>true,// Must be true.'enabled'=>true,// Must be true.'subject'=>'Email from ghost notification!','body'=>'This is nice, {user_first_name}, huh?','recipients'=> [ ['type'=>'administrator','recipient'=>'', ], ['type'=>'email','recipient'=>'{user_email}', ], ], ], ],'enabled'=>true,// Must be true.] );endif;
You can reference the Carrier fields by checking the source code. You should check the add_form_field method calls which will contain the field slug and other useful info about the type.
All arguments
All arguments available:
if ( function_exists('notification') ) :notification( ['hash'=>'my_programmatic_notification',// Unique notification hash, automatically generated.'title'=>'My programmatic notification','trigger'=>'trigger_slug','carriers'=> ['email'=> ['activated'=>true,'enabled'=>true,'subject'=>'Email from ghost notification!','body'=>'This is nice, {user_first_name}, huh?','recipients'=> [ ['type'=>'administrator','recipient'=>'', ], ['type'=>'email','recipient'=>'{user_email}', ], ], ], ],'enabled'=>true,'extras'=> [],// Extra data array, ie. config for add-ons.'version'=> time(),// Version of the notification, should be a timestamp. Default: current time.] );endif;