Review the .env.example file to see additional settings.

Recurring invoices and reminder emails

Create a cron to call the ninja:send-invoices and ninja:send-reminders commands once daily.

0 8 * * * /usr/local/bin/php /path/to/ninja/artisan ninja:send-invoices
0 8 * * * /usr/local/bin/php /path/to/ninja/artisan ninja:send-reminders

If you server doesn’t support crons commands can be run by setting a value for COMMAND_SECRET in the .env file and then loading /run_command?command=<command>&secret=<secret>. The following commands are supported: send-invoices, send-reminders and update-key.

Email Queues

When sending an email in the app the default behavior is to wait for the response, you can use queues to improve the perceived performance. To enable the feature add QUEUE_DRIVER=database or QUEUE_DRIVER=redis to the .env file.


You can process the jobs by running php artisan queue:listen or php artisan queue:work --daemon.

Postmark bounce and open notifications

Include the following two setting in the .env file, the rest of the email settings can be commented out.


In your Postmark account settings make sure ‘Open tracking’ is enabled and enter the following values under Settings > Outbound.

Social/One-Click Login

Create an application in either Google, Facebook, GitHub or LinkedIn and then set the client id, secret and redirect URL in the .env file. For example:



There are two methods to attach PDFs to emails sent by background processes: or local PhantomJS install.

To use check for the following line in the .env file.


To use a local PhantomJS install add PHANTOMJS_BIN_PATH=/usr/local/bin/phantomjs.


  • Check storage/logs/laravel-error.log for relevant errors.
  • To determine the path you can run which phantomjs from the command line.
  • We suggest using PhantomJS version >= 2.1.1, users have reported seeing ‘Error: 0’ with older versions.
  • You can use this script to test from the command line, change __YOUR_LINK_HERE__ to the link in the error and then run phantomjs test.pjs.
  • It may help to test with HTTP to check the problem isn’t related to the SSL certificate.
  • You may need to add an entry in the /etc/hosts file to resolve the domain name.
  • If you require contacts to enter a password to see their invoice you’ll need to set a random value for PHANTOMJS_SECRET.
  • If you’re using a proxy and/or self-signed certificate this comment may help.
  • If you’re using a custom design try using a standard one, if the PDF is outside the printable area it can fail.
  • If you’re using a non-English language try changing to English.

Custom Fonts

Follow these steps to add custom ttf fonts: ie, Google fonts

  • Create a new folder in public/fonts/invoice-fonts/ and copy over the ttf files
  • Run grunt dump_dir
  • Add the font to database/seeds/FontsSeeder.php
  • Run php artisan db:seed --class=FontsSeeder
  • Clear the cache by adding ?clear_cache=true to the end of the URL


We use Omnipay to support our payment gateway integrations.

Follow these steps to add a custom driver.

  • Run composer require <package_name>
  • Add a row to the gateways table. name is used in the gateway select, provider needs to match the Omnipay driver name
  • Clear the cache by adding ?clear_cache=true to the end of the URL


Most drivers also require code changes to work correctly.


To require a password to update the app add UPDATE_SECRET=random_value to the .env file and then use /update?secret=random_value to update.

By default the app clears the session when the browser is closed and automatically logs the user out after 8 hours. This can be modified by setting REMEMBER_ME_ENABLED and AUTO_LOGOUT_SECONDS in the .env file.

To include a secret when notifying subscriptions add SUBSCRIPTION_SECRET=random_value to the .env file.

Google Map

You need to create a Google Maps API key for the Javascript, Geocoding and Embed APIs and then add GOOGLE_MAPS_API_KEY=your_key to the .env file.

You can disable the feature by adding GOOGLE_MAPS_ENABLED=false to the .env file.

Voice Commands

Supporting voice commands requires creating a subscription key, then set the following values in the .env file.


Lock Invoices

Adding LOCK_SENT_INVOICES=true to the .env file will prevent changing an invoice once it has been sent.

Using a (Reverse) Proxy

If you need to set a list of trusted (reverse) proxies you can add a TRUSTED_PROXIES value in the .env file. ie,



Our developer guide has more details about our application’s codebase.

You can add currencies and date/time formats by adding records to their respective tables in the database. This data is cached, to clear it load any page with ?clear_cache=true added to the end of the URL.

The JavaScript and CSS files are compiled to built files, you can recompile them by running bower install and then gulp.