Skip to main content

Invoice Ninja integration

You already keep the books.

So a ticket sale should not need a second set. Sell it in Event Schedule and the entry is written into your Invoice Ninja company: a client, a line per ticket type, the QR code on the invoice, and a payment reconciled to the cent.

Invoice

#1042

Posted to Folio 01
Currency
USD
VIP admission 2 x 75.00 150.00
Discount SPRING10 -10.00
Total 140.00

This invoice is the ticket. The code is printed in the notes when the invoice is created, and scanned at the door.

Illustration. Jazz Night, two seats at 75.00, one promo code.

Folio 01

What gets posted

One purchase, written on both sides.

Nothing is summarised and nothing is exported later. At the moment of sale the integration writes into your company, in the words you would have used yourself, which is also why a corporate buyer ends up with paperwork they can expense.

Account · Ticket sales

Invoice mode · one purchase

What Event Schedule writes into Invoice Ninja for a single ticket purchase
The sale Posted in Invoice Ninja
The buyer [email protected] A client, looked up by email address and currency. Found, and it is reused. Not found, and it is created, with the name split into a first and last name on the contact.
Each ticket type 2 x VIP admission A line item: the ticket name as the product, its description as the note, the quantity bought and the price each.
A promo code SPRING10 A negative line item with the code itself as the note, so the discount reads on the invoice instead of vanishing into a total.
A volume discount or a gift card if either applies One more negative line each, the gift card noted with its code. The invoice adds up to what was actually charged.
The ticket itself QR code Printed into the invoice notes, so the invoice the buyer receives is the ticket they present at the door.
The payment recorded in Invoice Ninja Reported back by webhook. That entry is what marks the sale paid in Event Schedule and sends the confirmation.
Balances Sale 140.00 USD, invoice #1042 140.00 USD. The two sides were never allowed to drift.

Pro No ceiling on ticket sales, plus the check-in dashboard, promo codes and gift cards, at $5 a month. Selfhosted installs get every Pro and Enterprise feature, and no plan pays a platform fee on sales.

Free The schedule itself, its public page, calendar sync, RSVP with a capacity per date, the embeddable calendar, and the first 25 paid tickets a month, each one scanned at the door like any other.

Folio 02

Where the cart lives

Two places to take the money.

One setting, chosen once under payment methods. It decides which side of the arrangement the buyer actually stands on while they pick their tickets.

Invoice

The default

Buyers pick tickets and enter promo codes on your Event Schedule page. Each purchase becomes its own invoice in Invoice Ninja.

The cart
Event Schedule
Promo codes
Several per event, each able to target specific ticket types
Invoices
One per purchase
Buyer lands on
The invoice in your client portal

Payment link

Cart in Invoice Ninja

Buyers pick tickets and enter a promo code on the Invoice Ninja purchase page. A product is created for each ticket type and add-on, wired to one purchase page per event.

The cart
Invoice Ninja
Promo codes
One active code per event, applied to everything
Invoices
Grouped in Invoice Ninja for bulk handling
Buyer lands on
Your Invoice Ninja purchase page

Either way, the count still holds. In payment link mode the purchase page belongs to Invoice Ninja, so remaining stock is checked again when the purchase is reported back, and quantities are capped to what was actually left. And if a payment link cannot be created at all, checkout quietly falls back to an invoice rather than failing in front of a buyer.

Compare the modes in detail

Folio 03

Before it is paid

Nothing is marked paid on trust.

A payment arriving from outside is an assertion, not a fact. It is agreed against what the sale should have cost before a seat is considered sold.

The agreement

Invoice #1042

Reported paid in Invoice Ninja
140.00 USD
What the sale should have cost
140.00 USD
Difference
0.00

Tolerance is one cent. In payment link mode the figure on the second line is recomputed here from your own ticket prices before the comparison runs, so an edited payload cannot talk the total down.

01

When it does not agree

More than a cent apart and the sale is parked with an amount mismatch status for you to look at, rather than quietly confirmed. The invoice id is kept against it either way, so the entry is still findable.

02

The row is locked

The sale is locked while it changes state, and a webhook that has already been handled does nothing the second time. A retry cannot pay for the same seat twice.

03

Then the ticket goes out

Only once the sale actually flips to paid does the confirmation email with the QR ticket send. A gift card bought this way activates on the same entry.

Every one of those state changes is written to the audit log, tagged as having come from Invoice Ninja, and the sale keeps the invoice's own id against it. A disputed seat can be traced back to the entry that closed it.

Folio 04

Connecting

Two fields, then it is your server's business.

An API token from Settings, Account Management, and the base address of your install. Leave the address blank and it uses invoicing.co instead.

  • The base address, not the API path - A trailing /api/v1 is stripped for you, and an install mounted on a sub-path keeps its sub-path. A port is kept too.
  • A selfhosted install can be private - Point it at a LAN address, a Docker service name or loopback and it will go there. On the shared hosted platform the address is validated and pinned to the IP it resolved to, because there anyone can type one.
  • One webhook, cleaned up after - Connecting registers a single payment webhook on your company. Unlinking removes it again, and reconnecting prunes the one it replaces rather than leaving it behind.

Read the setup guide

If it will not connect

7 causes

The settings page names which of these it was, in plain language, next to the raw response. A connection that fails should not leave you guessing between a bad token and a firewall.

  1. 01 Token rejected Invoice Ninja answered 401 or 403. Mint a new token under Settings, Account Management.
  2. 02 Not an Invoice Ninja install A 404 from that address. It wants the base address of the install, without /api/v1.
  3. 03 Something answered instead A proxy, firewall or bot protection replied with a page rather than JSON. Allow API requests from this server.
  4. 04 The address redirects Reported, never followed, because a followed redirect can turn a create into a read that returns 200 and creates nothing.
  5. 05 Unreachable The connection did not complete. Check the address, DNS, and any firewall between the two servers.
  6. 06 TLS rejected The certificate is not one this server trusts.
  7. 07 Rate limited Invoice Ninja is throttling this server. Try again shortly.

Issue 110. A selfhosted install that worked from a plain curl and failed here. The URL was being trimmed by a character list rather than a suffix, requests carried no user agent for bot protection to recognise, and redirects were silent. All three are fixed.

Folio 05

Small print

The four details that come up.

104 currency codes

Event Schedule maps 104 currency codes onto Invoice Ninja currencies, and the client lookup is scoped by currency, so the same email can hold a separate client per currency rather than being force-fitted into one.

Where the invoice lands

Usually straight to the invoice in your client portal. Where the buyer turns out to match an existing client that is not verifiably theirs, and that portal has no password on it, the invoice is emailed instead of handing a stranger a link into somebody else's record.

Gift cards, the same way

A gift card sold through Invoice Ninja is amount-checked and activated by the same payment entry, then emailed to whoever it was bought for.

No platform fee

Event Schedule takes nothing out of a ticket sale. Whatever your Invoice Ninja gateway charges is the whole cost of getting paid.

Folio 06

Questions

Asked at the month end.

Can I use this with a selfhosted Invoice Ninja?

Yes, and it is the case the integration is built for. Enter the base address of your install and an API token, and Event Schedule talks to your server. A trailing /api/v1 is stripped for you and an install mounted on a sub-path keeps that sub-path. Leave the address blank and it uses invoicing.co instead. Event Schedule can be selfhosted too, so both halves can sit on hardware you own.

Are QR code tickets generated automatically?

Yes. The QR code is printed into the invoice notes when the invoice is created, so the invoice doubles as the ticket, and when the payment is recorded in Invoice Ninja the confirmation email with the ticket goes out on its own.

Does it create client records for me?

Yes. Event Schedule first looks for an existing client with that email address in the sale currency and reuses it, which is what keeps a regular buyer from turning into five clients. If there is no match it creates one, splitting the name given at checkout into a first and last name on the contact.

Can I use Stripe and Invoice Ninja at the same time?

Yes. Both connect once under payment methods on your profile, and then each event chooses how it takes money: cash, Stripe, Invoice Ninja or a plain payment URL. A corporate booking that needs an invoice and a public show that wants a card payment can run side by side.

What happens if a payment link cannot be created?

Checkout falls back to invoice mode and the buyer gets an invoice, rather than seeing an error. The failure is logged for you instead of being handed to the customer.

My selfhosted install connected from curl but failed here. Why?

That was a real bug, reported as issue 110, and it had three causes. The API URL was being trimmed by a character list rather than a suffix, so a host ending in a, p, i, v or 1 lost its last letter. Requests carried no user agent, which Cloudflare bot protection and most managed firewall rules answer with an HTML page that looks exactly like a bad token. And redirects were invisible. All three are fixed, and a failed connection now names which of those it was instead of saying only that it failed.

Free to start

Sell the tickets. Keep one set of books.

Connect the Invoice Ninja company you already use, and every sale posts itself. No platform fee comes out of the ticket price.

.eventschedule.com
Get started free

No credit card required