ahlan hamad

Setup guide · QuickBooks Online payroll journals · Early access

Set up QuickBooks Online payroll journals: step by step

This guide is for two people working together: your QuickBooks admin, who knows your chart of accounts, creates your company's Intuit app and approves the connection, and the person who runs payroll in AhlanHamad, who connects QuickBooks and maps the accounts. Follow it in order. Every AhlanHamad label below is the one you will see on screen.

Updated 12 October 2026

1. Before you start

Early access. Posting payroll journals to QuickBooks Online is switched on one company at a time, when you ask us. It is not open to every company yet. Until it is on for your company, the Field Mapping tab says “Posting payroll journals to QuickBooks Online isn't switched on for your workspace yet.”

CheckWhat you need
QuickBooks planA QuickBooks Online company whose plan has journal entries: Intuit's help covers Simple Start, Essentials, Plus and Advanced (Intuit help). Before you start, check that + Create → Journal entry opens in your company; if it doesn't, your plan can't take payroll journals. QuickBooks Desktop can't be connected.
Where it standsTested end to end on an Intuit sandbox company: payroll journals, a retry, and the reversal of a deleted run. It has not yet posted to a customer's live QuickBooks company, so check your first journals closely and tell us if anything looks wrong.
Currency and decimalsJournals are posted in your QuickBooks home currency; QuickBooks multicurrency is not used. QuickBooks Online keeps 2 decimals, so for KWD, BHD or OMR each line is rounded to 2 decimals and the rounding difference is put on the largest line (the journal's memo says so). The journal still balances.
Your own Intuit appAhlanHamad connects through an app your company creates in the Intuit Developer portal (free; section 2). Its Development keys work straight away with an Intuit sandbox company, for testing. Its Production keys, for your live company, appear after Intuit reviews your app's details and compliance questionnaire.
A QuickBooks adminCreates the Intuit app and signs in to Intuit to approve the connection. Use an admin of the QuickBooks company you keep payroll in.
In AhlanHamadA company admin who can manage settings (to connect QuickBooks and save the mapping), and the person who finalizes and pays payroll. Your accountant should help with the mapping.

Only totals are sent to QuickBooks Online: one line per account, never a line per employee. Names, IDs and individual salaries stay in AhlanHamad (the journal's description carries the number of employees in the run, nothing more).

2. In Intuit: create your own QuickBooks app

AhlanHamad connects to QuickBooks through an app your company creates in the Intuit Developer portal and uses only for itself. Test it first with its Development keys and an Intuit sandbox company; switch to its Production keys for your live company once Intuit has reviewed the app. Intuit's steps: create an app, keys and credentials, production keys.

  1. Go to developer.intuit.com and sign in, or create a free developer account.
  2. Open My Hub → App dashboard (top right), select the app card with a +, and follow the steps. Name the app something you will recognise, for example AhlanHamad payroll.
  3. When Intuit asks for permissions (scopes), choose accounting (com.intuit.quickbooks.accounting). Nothing else is needed.
  4. In the app's Settings → Redirect URIs tab, add https://ahlanhamad.com/auth/quickbooks/callback under Development, and again under Production, exactly as written: https, same casing, no slash at the end; Intuit requires an exact match (Intuit: redirect URIs). AhlanHamad shows the same address on the Connection tab under “Redirect URI to register on your app”, with a Copy button.
  5. Test first with Development keys. Open Keys and credentials → Development and copy the Client ID and Client secret (Intuit: keys). Development keys only reach Intuit sandbox companies, and your developer account comes with one (Intuit sandboxes). You paste them in section 4.
  6. Then get Production keys for your live company. Intuit shows them only after two steps (Intuit: go live): App details (contact email, end-user licence agreement and privacy policy links, host domain, launch, disconnect and connect/reconnect URLs, categories, regulated industries, hosting regions; Intuit says about 30 minutes) and the Compliance questionnaire. If a field asks for our addresses: host domain ahlanhamad.com, launch URL https://ahlanhamad.com/en/integrations/quickbooks.
  7. Once Intuit has approved the questionnaire, open Keys and credentials → Production, turn on Show credentials and copy the Client ID and Client secret. Keep the secret private; AhlanHamad stores both encrypted.

The Production review is Intuit's, of your app. Intuit reviews your app's details and compliance answers on its side and decides when to approve them; AhlanHamad can't do it for you or speed it up. We are happy to help you fill it in: write to support@ahlanhamad.com. Intuit's guide says an app used privately is live once these steps are done; listing it on the QuickBooks App Store is not needed.

3. In QuickBooks: get your chart of accounts ready

Payroll journals post totals to your own accounts, and QuickBooks refuses Accounts payable (A/P) and Accounts receivable (A/R) on them (they need a vendor or customer on every line). So create the liability accounts you need first. In QuickBooks, go to Settings ⚙ → Chart of accounts → New. Testing with Development keys? Do the same in your sandbox company.

  1. If you have no ordinary liability for net salaries, add one: account type Other Current Liabilities, name for example Salaries payable.
  2. Do the same for social insurance payable (and, if used, deductions withheld and DIFC DEWS payable): Other Current Liabilities accounts.
  3. Add the end-of-service provision as a Long Term Liabilities account, if you don't have one.
  4. Only if you prefer not to post the salary payment straight to your bank account: add an Other Current Liabilities account such as Salary clearing (section 5 explains when).

Expenses (salaries, housing, transport, employer social insurance, end-of-service, bank charges) go to ordinary Expenses accounts; most charts already have them.

4. In AhlanHamad: connect QuickBooks Online

Go to Integrations, open QuickBooks Online and stay on the Connection tab. The card starts with Connect with your own QuickBooks app, with a link to this guide.

  1. Check the address under Redirect URI to register on your app is the one you added in section 2.
  2. Under Which keys are these? choose Development keys — an Intuit sandbox company (for testing) or Production keys — your live QuickBooks company, to match the keys you are about to paste.
  3. Client ID and Client Secret: paste the keys from section 2. Under the secret it says “Stored encrypted on the server. Never shown again and never sent to the browser.”
  4. Click Connect to QuickBooks. AhlanHamad says “Taking you to Intuit to sign in…” and opens Intuit.
  5. Sign in to Intuit as the QuickBooks admin, choose the company (with Development keys, your sandbox company), and approve the connection.
  6. You come back to a page that says Connected to QuickBooks Online, then to the QuickBooks page. The card now shows Connected to QuickBooks Online, Company: with your company's name, “Connected through your own app” (with Development keys, followed by “Sandbox (test) company”), and the Realm ID (QuickBooks' number for your company).

Your app's Client ID and Secret stay saved. If you connect again later, the card says “Your app credentials are saved. Click Connect to sign in with them — no need to enter them again.” To use other keys, click Replace credentials.

From Development to Production keys. When your test looks right and Intuit has approved your app, click Replace credentials, choose Production keys — your live QuickBooks company, paste the Production Client ID and Client Secret and connect again, choosing your live company. That is a different QuickBooks company, so load your accounts and save the mapping again (section 5).

Or one click with Ahlan Hamad's app (when available)

AhlanHamad also has its own QuickBooks app. Where it is switched on for your workspace, the Connection tab shows Or connect with Ahlan Hamad's app under the form: you sign in to Intuit and approve access, with no app or keys of your own. Click Connect with Ahlan Hamad's app; the card then says “Connected through Ahlan Hamad's app”. Your own app stays the main way to connect.

Already sending payroll to another accounting system? If another one is connected and receiving payroll, AhlanHamad asks first: “Connect a second accounting system?” If you connect QuickBooks Online too, every payroll run is posted to both and your payroll costs are booked twice. If you are moving to QuickBooks Online, click Cancel, disconnect the other system first, then connect QuickBooks Online.

5. Check the environment, then map your accounts

  1. Open the Field Mapping tab. The card is called Post payroll journals to QuickBooks Online.
  2. QuickBooks environment follows the keys you connected with: Sandbox for Development keys, Production for Production keys. It can't be changed here: “This environment was set when QuickBooks was connected (Development or Production keys), so it's fixed here. Reconnect to change it.”
  3. Click Load my accounts. This reads your chart of accounts, company name and home currency from QuickBooks. The card then shows Posting to your company and its Base currency.
  4. Map each Ahlan Hamad account to a QuickBooks Online account (table below). Some are pre-selected and marked Suggested when the match is clear; check every one with your accountant.
  5. Click Save mapping. When nothing is missing the card says Mapping complete. Until then it says “Posting is on hold until every required account is mapped.”
  6. If you pay any payroll in a currency other than your QuickBooks home currency, decide on Post runs in other currencies (section 6).

Which QuickBooks account for each payroll account

CodeAhlan Hamad accountNeededTypical QuickBooks account type
5100Salaries — basic, other allowances, overtime & additionsRequiredExpenses (detail type such as Payroll Expenses)
5400Housing allowanceRequiredExpenses
5500Transport allowanceRequiredExpenses
5200Employer social-insurance contributionRequiredExpenses
5300End-of-service expenseRequiredExpenses
2100Net salaries payableRequiredOther Current Liabilities (not Accounts payable)
2200Social insurance payable (employee + employer)RequiredOther Current Liabilities
2300End-of-service provisionRequiredLong Term Liabilities
1101Bank account salaries are paid fromRequiredBank, or a clearing account (see tip)
2700Deductions withheld (loans, penalties, unpaid leave)Only if usedOther Current Liabilities
5810Bank transfer charges on salariesOnly if usedExpenses
5310DIFC DEWS employer contributionOnly if usedExpenses
2310DIFC DEWS payableOnly if usedOther Current Liabilities
5900Foreign-exchange gain/loss on payroll (only if a run in another currency is paid at a different rate)Only if usedYour exchange gain or loss account (Other Expense)

End-of-service is not on the payroll journal. It is its own journal each month (5300 End-of-service expense / 2300 End-of-service provision).

6. What gets posted, and when

When this happens in AhlanHamadQuickBooks Online receivesDated
A payroll run is finalized (Finalize)Payroll accrual: salaries and allowances, employer social insurance and the payables they create (debits 5100–5500, credits 2100, 2200 and, if used, 2700)The last day of the payroll month
The run is paid (Mark as Paid, or CEO Sign-off & Pay)Salary payment: debit 2100 Net salaries payable, credit 1101The day the run was signed off and paid
Bank transfer charges are recorded on a paid runBank charges: debit 5810, credit 1101The pay day
A month endsEnd-of-service accrual: debit 5300, credit 2300 — sent automatically on the 1st of the next month. You can also run it by hand for a finished month with Run Monthly Accrual on the Finance page.The last day of that month
A run is deleted, or a posted journal is correctedA reversal: a new journal entry with the same lines, debit and credit swapped. QuickBooks does not link the two; the reversal's memo starts with “Reversal of” and the reference it reverses. A corrected run is then posted again as a new journal entry.The day of the change

Every journal's description starts with what it is and AhlanHamad's own reference for it: PAY-KW-2026-10 for the October 2026 Kuwait payroll accrual, PAY-KW-2026-10-PMT for its salary payment, PAY-KW-2026-10-FEES for its bank charges, IND-KW-2026-10 for that month's end-of-service accrual (the country code is the run's own). A reversal's description starts with “Reversal of” and the reference it reverses. Each journal also carries a marker: AH followed by 12 letters and digits.

7. Check your first payroll in QuickBooks

  1. In AhlanHamad, open the payroll run. The QuickBooks Online journals card lists each journal (Payroll accrual, Salary payment, …) with its status. Posted means QuickBooks has it, and the card shows its journal number, for example Journal AH1F2E3D4C5B6A.
  2. In QuickBooks, open Reports, search for Journal, run the Journal report for the payroll month, and find the entry with that journal number (Intuit help). The search (magnifying glass) at the top can also find a transaction by its number.
  3. Check: the date (the last day of the payroll month for the accrual), the Journal no., one line per mapped account, totals that match the payroll run in AhlanHamad, and the memo.
  4. After the run is paid, check the Salary payment entry the same way, and match it to your bank as described in section 5.

Statuses on the run card: Queued and Sending (on its way), Waiting (another journal must reach QuickBooks Online first), Retrying (QuickBooks Online or the network was busy; we try again automatically), Posted, On hold (needs you; the reason is shown), Failed (QuickBooks Online refused it; the reason is shown), Not needed (nothing to send; the reason is shown).

8. Troubleshooting

Company admins who can manage settings, and finance managers, also get an in-app notice and an email when QuickBooks Online journals are held or fail: one per problem, a reminder after three days, and a short note when it clears. No amounts, names or QuickBooks Online errors are put in the email; open the payroll run to see the reason.

When connecting (Connection tab and the return page)

What you seeWhat to do
Enter your app's Client ID and Client Secret to connect.Paste both values from your app (own-app connection only), then click Connect.
Enter both the Client ID and the Client Secret to replace the saved credentials.You started replacing the saved credentials: fill in both fields, or click Keep saved credentials.
Connecting isn't available yet: this workspace's app address isn't configured. Contact support and we'll set it up.Contact us. Nothing on your side is wrong.
Couldn't connect QuickBooks Online — with “No authorization code was returned. The connection was cancelled or the link is invalid.”You cancelled or declined on the QuickBooks Online screen, or the link was opened twice. Start again from the Connection tab.
You were signed out before the connection finished. Sign in again, then reconnect from the integration settings.Sign in to AhlanHamad, then click Connect again. Use the same browser for the whole flow.
This connection link is invalid, expired or already used. Start the connection again from the integration's settings page.Each connect link works once and for a short time. Click Connect again on the Connection tab.
Token exchange failed: …QuickBooks Online refused to hand over the connection: usually the Client Secret is wrong, or the redirect URI on your app does not match exactly. Check both (own-app connection), then connect again.
No stored QuickBooks credentials for this company. Run Connect first.Your own app's keys were not saved. Open the Connection tab, paste the Client ID and Client Secret again, and click Connect to QuickBooks.
Intuit shows an error page instead of the sign-in, mentioning the redirect URIThe redirect URI on your Intuit app does not match. Add https://ahlanhamad.com/auth/quickbooks/callback under the Development and Production settings exactly as written, then connect again.
QuickBooks needs to be reconnected — with “QuickBooks no longer accepts the saved connection: access was revoked or has expired. Journals are held, not lost. Connect again below and sign in, and the held journals are sent automatically.”Click Reconnect and sign in again. Held journals are sent by themselves once you are back.

When loading your accounts (Field Mapping tab)

What you seeWhat to do
Could not read the QuickBooks Online company (401 — check the environment and reconnect). …Intuit refused to read the company with this connection. Most often the keys and the environment don't match: Development keys reach only sandbox companies, Production keys only real ones. On the Connection tab, disconnect, click Replace credentials if needed, pick the Which keys are these? option that matches your keys and connect again. If it happens again, send us the whole message.
QuickBooks Online needs to be reconnected: access was revoked or has expired. Reconnect QuickBooks Online from Integrations.Click Reconnect on the Connection tab and sign in to Intuit again.
QuickBooks did not report the company's home currency.Open Settings → Account and settings → Advanced → Currency in QuickBooks (Intuit help) to check the home currency is set, then load your accounts again. If it keeps happening, contact us.

On the payroll run: On hold

A held journal is waiting, not lost. Fix the reason and it goes, either by itself or when you press Retry on the run card.

What you seeWhat to do
Map these accounts first: 5400, 5500.Map the listed account codes on the Field Mapping tab and click Save mapping, then Retry.
Load your accounts and save the mapping on the integration page first.On the Field Mapping tab, click Load my accounts, save the mapping, then Retry.
… mapped to an account that can't be used in a journal (Accounts Payable or Receivable, a system or bank account, or an account with no code). Pick another account on the integration page.In QuickBooks terms: an Accounts payable (A/P) or Accounts receivable (A/R) account. Map those codes to an Other Current Liabilities account (or another suitable account), save, then Retry.
This run's currency differs from your books. Allow other-currency posting to send it.Switch on Post runs in other currencies on the Field Mapping tab, then Retry. Or keep that run out of QuickBooks Online.
The connection needs to be renewed. Reconnect and try again.Intuit stopped accepting the connection: someone disconnected AhlanHamad in QuickBooks, the admin who approved it lost access, or it went unused for too long. Click Reconnect on the Connection tab and sign in again. Journals held for this reason are sent automatically once you reconnect.
Not connected, or posting is switched off.Connect QuickBooks Online again on the Connection tab. Held journals are sent automatically once you reconnect. If QuickBooks Online is connected and you still see this, ask us: posting may have been switched off for your company.

On the payroll run: Failed

These come back from QuickBooks Online, in English, with QuickBooks Online's own words added after ours. Fix the cause in QuickBooks Online or in the mapping, then press Retry. A retry never creates a second journal.

What you seeWhat to do
QuickBooks rejected the journal (400). followed by QuickBooks Online's own messageRead QuickBooks' message after ours. A common one: the date falls on or before your QuickBooks closing date (Settings → Account and settings → Advanced → Accounting → Edit → Close the books, Intuit help). Ask your accountant to move the closing date, or reverse and correct the run in AhlanHamad.
QuickBooks refused access (403). The connection may lack permission to post journals, or the organisation was disconnected — reconnect QuickBooks.The QuickBooks Online user you signed in with can't create journals in that company. Sign in again with a user who can (an admin), then Retry.
QuickBooks could not find the company or an account this journal points at (404). Check the account mapping belongs to the connected company.A mapped account was deleted or archived in QuickBooks Online. Click Reload accounts, fix the mapping, save, then Retry.
This run's payroll accrual journal did not reach QuickBooks Online. Retry the accrual first, then retry this payment, so it clears exactly the salaries payable the accrual booked.Retry the Payroll accrual line first, then the Salary payment line.
No exchange rate from … to … is available.Try again later, or contact us.
… — gave up after 6 attempts.QuickBooks Online or the network kept failing. Check QuickBooks Online opens normally, then press Retry.

Every QuickBooks failure ends with an intuit_tid in brackets. Send us the whole message with it: Intuit support uses that number to find the call.

On the payroll run: Not needed

What you seeWhat it means
Reversed in Ahlan Hamad before it reached QuickBooks Online; the pair nets to zero.Nothing to do: the journal and its reversal cancel out, so neither is sent to QuickBooks Online.
Reverses an entry that never reached QuickBooks Online, so there is nothing to reverse there.Nothing to do.

Two accounting systems

If the QuickBooks Online page or the payroll run says “Payroll is being posted to …” with more than one system, every run is booked in each of them. If you keep your books only in QuickBooks Online, disconnect the others so payroll costs aren't counted twice.

9. Disconnecting

  1. In AhlanHamad, go to Integrations → QuickBooks Online → Connection and click Disconnect QuickBooks. AhlanHamad deletes the stored connection and also revokes its access at Intuit.
  2. If you won't use your Intuit app again, you can delete it in the Intuit Developer portal too.

Intuit sources used in this guide

About AhlanHamad × QuickBooks Online· All integrations