Back to End of Month Close

Developer Handover Pack

Everything needed to build the automation from scratch: current state, full agent specs, data flow, and the build stack.

4 pagesPDF · Technical
FS-DOC-04Technical

Developer Handover Pack

End of Month Close

[YourCompany.com] · Finance Department · Prepared by FullSpec · [Today's Date]

This document is the authoritative technical reference for the End of Month Close automation build. It covers the current-state process map with bottleneck identification, full agent specifications with IO contracts, an end-to-end data flow trace, and the recommended build stack. The FullSpec team uses this document to guide all build decisions. You and your finance team do not need to act on anything in this document directly, but the pre-build confirmation items in each agent specification require sign-off from a process owner before work begins.

01Process snapshot

Step
Name
Description
1
Send Receipt and Expense Chase Emails
The bookkeeper manually emails each department head and team member to request outstanding receipts, expense claims, and any unposted bills before cut-off. Owner: Bookkeeper. Tool: Gmail. Time cost: 40 min.
2
Download Bank and Credit Card Statements
Bank feeds are checked and any gaps are filled by logging into each bank portal and downloading CSV statements. Statements are saved to a shared folder. Owner: Bookkeeper. Tool: Google Sheets. Time cost: 45 min.
3
Collect and Sort Supplier Documents
Invoices and receipts from Hubdoc or Dext are reviewed, sorted by category, and matched to purchase orders where applicable. Owner: Bookkeeper. Tool: Hubdoc. Time cost: 60 min. BOTTLENECK.
4
Post and Categorise Transactions in Xero
The bookkeeper reviews the Xero bank feed, codes uncategorised transactions, and corrects any auto-coded items that landed in the wrong account. Owner: Bookkeeper. Tool: Xero. Time cost: 90 min. BOTTLENECK.
5
Reconcile Bank Accounts
Each bank account is reconciled in Xero. Unmatched items are investigated and either manually matched or flagged for follow-up. Owner: Bookkeeper. Tool: Xero. Time cost: 75 min.
6
Review and Post Accruals and Prepayments
The controller works through the accruals schedule in a spreadsheet, calculates the month entries, and posts them manually into Xero. Owner: Controller. Tool: Google Sheets. Time cost: 50 min. BOTTLENECK.
7
Run Aged Payables and Receivables Reports
Aged reports are exported from Xero and reviewed to confirm no large balances are sitting uncollected or unpaid at period end. Owner: Controller. Tool: Xero. Time cost: 30 min.
8
Prepare Management Accounts Pack
The controller copies profit and loss, balance sheet, and cash flow figures from Xero into the management report template in Google Sheets, adding commentary manually. Owner: Controller. Tool: Google Sheets. Time cost: 90 min. BOTTLENECK.
9
Internal Review and Sign-Off
The Finance Manager reviews the draft management accounts pack and approves or returns it for corrections before distribution. Owner: Finance Manager. Tool: none. Time cost: 45 min.
10
Distribute Management Report to Stakeholders
The approved report is exported as a PDF and emailed individually to each director or stakeholder. A Slack message is sometimes sent as a notification. Owner: Controller. Tool: Gmail. Time cost: 20 min.
Time cost summary: Total manual time per close cycle is 545 minutes (approximately 9 hours 5 minutes). At a frequency of one close per month this equates to roughly 11 hours of active staff time per week when spread across the month. The automation replaces Steps 1, 2, 3, 4, 5, 6, 7, 8, and 10. Step 9 (Finance Manager review and sign-off) remains a human checkpoint and is built into the automated flow as an approval gate. The four primary bottlenecks (Steps 3, 4, 6, and 8) account for 290 minutes combined and are the highest-priority targets for automation.
Developer Handover PackPage 1 of 4
FS-DOC-04Technical

02Agent specifications

Chase and Notification Agent

Sends templated receipt and expense chase messages on the last business day of each month to all relevant staff via Gmail and Slack. The agent monitors for replies and send statuses, then fires a 24-hour reminder to any recipient who has not responded. It writes a delivery and reply log to a Google Sheet row for audit purposes. This agent replaces the manual email composition and follow-up work currently done by the bookkeeper at the start of every close cycle. Estimated build: 8 hours. Complexity: Simple.

Trigger
Automation platform schedule fires on the last business day of the month. Business-day detection uses a calendar calculation within the orchestration layer, not a fixed date.
Tools
Gmail (SMTP send + read via Gmail API); Slack (incoming webhook or Bot token for channel post)
Replaces steps
Step 1: Send Receipt and Expense Chase Emails (40 min manual)
Estimated build
8 hours / Simple
// Input
recipient_list: []  // array of {name, email, slack_user_id, department}
period_label: string  // e.g. 'May 2025'
chase_template_id: string  // references Gmail draft template by label
reminder_delay_hours: 24

// Output
delivery_log: []  // array of {recipient_email, sent_at, channel: 'gmail'|'slack', status: 'sent'|'failed'}
reply_received: []  // array of {recipient_email, replied_at, thread_id}
reminder_queue: []  // recipients with no reply after reminder_delay_hours

// On reminder trigger (24h no reply)
reminder_sent: []  // array of {recipient_email, reminder_sent_at, channel}
  • Gmail API tier required: Google Workspace Business Starter or above. The service account or OAuth client must have the Gmail send scope (https://www.googleapis.com/auth/gmail.send) and readonly scope (https://www.googleapis.com/auth/gmail.readonly) for reply detection. Confirm the connected account before build.
  • Slack: use a Bot token with chat:write and channels:read scopes. Do not use legacy incoming webhooks if the Slack workspace is on a paid plan, as channel targeting is more reliable via Bot token.
  • Recipient list must be maintained in a named Google Sheet tab ('chase_recipients') with columns: name, email, slack_user_id, department. The agent reads this at runtime; it does not hard-code contacts.
  • Gmail templates are stored as draft emails with a specific label prefix ('FullSpec/chase'). The agent clones the draft, substitutes {period_label} and {recipient_name} tokens, and sends. Do not use the Drafts API send endpoint for bulk sending; use the Messages.send endpoint per recipient.
  • Dedupe: if the schedule trigger fires more than once in a day (e.g. due to a platform retry), check the delivery_log sheet for an existing entry with the same period_label before sending. Skip if a sent record exists.
  • Confirm with the process owner: how many recipients are on the chase list, and whether any departments use a shared inbox that would confuse reply detection.
  • Fallback: if a Gmail send fails (API error or quota), log the failure to the delivery_log with status 'failed' and post a Slack alert to the finance channel naming the failed recipient.
Reconciliation Agent

Pulls all uncategorised and unreconciled transactions from Xero for the closed period, matches bank feed entries against recorded transactions using rule-based logic, and applies existing Xero coding rules to confident matches. Items that fall below the confidence threshold or match no known rule are written to a structured exceptions tab in Google Sheets for bookkeeper review. The agent also ingests supplier documents from Hubdoc and Dext, linking document references to the matched Xero transaction where possible. This agent replaces Steps 2, 3, 4, and 5. Step 5 reconciliation confirmation is automated for matched items; unmatched items remain in the exceptions list. Estimated build: 22 hours. Complexity: Complex.

Trigger
Triggered after the chase window closes. In practice: a fixed delay of 48 hours after the Chase and Notification Agent completes, or a manual override trigger from the orchestration layer if the process owner wants to advance the timeline.
Tools
Xero (Accounting API: BankTransactions, BankStatements, Accounts, TrackingCategories); Google Sheets (exceptions output); Dext (document export API); Hubdoc (document sync via Hubdoc API or email-to-inbox integration)
Replaces steps
Step 2 (45 min): bank statement download. Step 3 (60 min): supplier document collection. Step 4 (90 min): transaction coding. Step 5 (75 min): bank reconciliation.
Estimated build
22 hours / Complex
// Input
xero_tenant_id: string
period_start: date  // first day of closed month
period_end: date    // last business day of closed month
confidence_threshold: float  // default 0.85; below this score goes to exceptions
coding_rules: []  // read from Xero bank rules via BankRules endpoint

// Xero pull
bank_transactions: []  // {transaction_id, date, amount, payee, account_code, status: 'UNRECONCILED'|'RECONCILED'}
bank_statement_lines: []  // {statement_line_id, date, amount, description, bank_account_id}

// Hubdoc / Dext pull
supplier_documents: []  // {doc_id, supplier_name, amount, date, document_url, matched_transaction_id|null}

// Output: matched
reconciled_items: []  // {transaction_id, statement_line_id, confidence_score, account_code, doc_id|null}

// Output: exceptions (written to Google Sheets tab 'recon_exceptions')
exception_items: []  // {transaction_id, date, amount, payee, reason: 'no_match'|'low_confidence'|'duplicate_flag', doc_id|null}

// Output: summary row (written to 'recon_summary' tab)
summary: {period_label, total_transactions, matched_count, exception_count, run_timestamp}
  • Xero API plan requirement: Xero Accounting plan with API access enabled. The Standard or Adviser plan includes this. Confirm the subscription tier before build. OAuth 2.0 PKCE flow is required; store the refresh token in the shared credential store, not in the workflow definition.
  • Xero rate limits: 60 API calls per minute per connection, 5,000 calls per day. For a close cycle processing up to 600 transactions, batch all BankTransactions calls with page size of 100 and add a 1-second delay between pages to stay within limits.
  • Hubdoc integration: Hubdoc does not publish a public REST API. Use the Hubdoc email-to-inbox feature to push documents to a monitored Gmail inbox, then parse the structured email body to extract supplier_name, amount, and date. Alternatively, use Dext exclusively if the client has an active Dext subscription, as Dext provides a documented REST API.
  • Dext API: requires API key from the Dext dashboard (Settings > API). Endpoints used: GET /items (list documents for period), GET /items/{id} (fetch document detail). Confirm API key availability before build.
  • Confidence scoring: calculate a weighted match score using: amount exact match (weight 0.5), date within 3 days (weight 0.3), payee string similarity above 0.7 (weight 0.2). Matches scoring 0.85 or above are auto-reconciled. Below 0.85 goes to the exceptions sheet.
  • Dedupe: before posting any reconciled match back to Xero, check that the statement_line_id is not already marked RECONCILED in Xero. If it is, skip and log a warning row to the recon_summary tab.
  • Confirm with the process owner: how many bank accounts are being reconciled, and whether all accounts have live bank feeds connected in Xero or whether CSV uploads are still needed for any accounts.
  • The exceptions Google Sheet must be pre-created with a defined schema (columns: transaction_id, date, amount, payee, reason, doc_id, bookkeeper_action, resolved_at). The agent appends rows; it does not overwrite existing data.
Accruals and Reporting Agent

Reads the accruals schedule from a named Google Sheet, calculates the correct journal entries for the period, and posts them to Xero as manual journal lines. Once journals are confirmed as posted, the agent pulls final period figures from the Xero Profit and Loss, Balance Sheet, and Cash Flow Statement reports, populates a Google Sheets management accounts template, generates a variance commentary draft based on configurable thresholds, and exports the completed pack as a PDF. The PDF is held pending Finance Manager approval. On approval, the agent sends the PDF to each stakeholder via Gmail and posts a Slack notification confirming distribution. This agent replaces Steps 6, 7, 8, and 10. Step 9 (Finance Manager approval) is a human gate built into the flow. Estimated build: 18 hours. Complexity: Moderate.

Trigger
Triggered after the bookkeeper marks all exceptions as resolved in the recon_exceptions Google Sheet (a status column set to 'cleared' for all open rows triggers a webhook or polling check in the orchestration layer).
Tools
Xero (Accounting API: ManualJournals, Reports/ProfitAndLoss, Reports/BalanceSheet, Reports/CashSummary); Google Sheets (accruals schedule read; management accounts template write); Gmail (report distribution); Slack (distribution notification)
Replaces steps
Step 6 (50 min): accruals posting. Step 7 (30 min): aged reports. Step 8 (90 min): management accounts pack build. Step 10 (20 min): report distribution.
Estimated build
18 hours / Moderate
// Input: accruals schedule (read from Google Sheets tab 'accruals_schedule')
accruals: []  // {line_id, description, account_code, debit_amount, credit_amount, period_label, active: bool}

// Input: Xero report pull
xero_tenant_id: string
period_start: date
period_end: date
variance_threshold_pct: float  // default 0.10; variances above 10% trigger commentary

// Output: journal posting
posted_journals: []  // {journal_id, xero_journal_id, status: 'posted'|'failed', error_message|null}

// Output: report data (written to Google Sheets tab 'mgmt_accounts_[period_label]')
pl_data: {}  // {revenue, cogs, gross_profit, operating_expenses, ebitda, net_profit}
bs_data: {}  // {total_assets, total_liabilities, net_assets, equity}
cf_data: {}  // {operating_cf, investing_cf, financing_cf, net_change}
variance_commentary: []  // [{line_item, budget_value, actual_value, variance_pct, commentary_text}]

// Output: PDF
report_pdf_url: string  // Google Drive link to exported PDF, access restricted to finance team

// On approval (Finance Manager sets approval_status = 'approved' in approval_tracker tab)
distribution_log: []  // {recipient_email, sent_at, gmail_message_id}
slack_notification: {channel: '#finance', message: 'Management accounts for [period_label] have been distributed.', timestamp}
  • Accruals schedule prerequisite: the Google Sheet tab 'accruals_schedule' must have a consistent column structure before build begins. If the current schedule is ad hoc or varies month to month, the process owner must standardise it first. The agent cannot tolerate variable column positions.
  • Xero ManualJournals API: POST to /ManualJournals with an array of JournalLines. Each line requires account_code (string, must match an existing Xero account), line_amount (positive for debit, negative for credit), and description. Validate all account codes against the Xero chart of accounts before the first run.
  • Variance commentary: pull prior period figures from the Xero ProfitAndLoss report using the compareWith parameter (e.g. compareWith=1 for one prior period). Calculate variance as (actual - prior) / prior. If variance_pct exceeds variance_threshold_pct, generate a commentary string from a template: '{line_item} is {pct}% {above|below} the prior period at ${actual_value}.'
  • PDF export: use the Google Sheets API export endpoint (export?format=pdf) with print settings locked to the named sheet range. Store the exported file in a Google Drive folder named 'Management Accounts / [period_label]' with view access limited to the finance team Google Group.
  • Approval gate: poll the 'approval_tracker' Google Sheet tab every 30 minutes for a row where period_label matches and approval_status is set to 'approved' or 'rejected'. On 'rejected', post a Slack alert to the Finance Manager and bookkeeper naming the period. Do not distribute until approval_status is 'approved'.
  • Confirm with the process owner: who is on the stakeholder distribution list, and whether any recipients are external (outside the Google Workspace domain), as PDF sharing permissions differ for external addresses.
  • Aged payables and receivables (Step 7) are pulled via the Xero Reports API (AgedPayablesByContact, AgedReceivablesByContact) and appended as a tab in the management accounts Google Sheet. No separate output file is needed.
Developer Handover PackPage 2 of 4
FS-DOC-04Technical

03End-to-end data flow

Full trigger-to-distribution data flow with field names and agent handoff comments
// ============================================================
// END OF MONTH CLOSE: FULL DATA FLOW
// Trigger to final distribution
// ============================================================

// TRIGGER
// Orchestration layer detects last business day of month
schedule_event: {
  trigger_type: 'calendar_schedule',
  period_label: 'May 2025',
  period_start: '2025-05-01',
  period_end:   '2025-05-31',
  fired_at:     '2025-05-30T08:00:00Z'
}

// ============================================================
// AGENT 1: Chase and Notification Agent
// ============================================================

// Read recipient list from Google Sheets tab 'chase_recipients'
input.recipient_list: [
  {name, email, slack_user_id, department}
]
input.chase_template_id: 'FullSpec/chase/receipt-request'
input.reminder_delay_hours: 24

// Gmail API: Messages.send per recipient
gmail.send -> {to: recipient.email, subject: 'Action required: receipts for {period_label}', body: rendered_template}

// Slack Bot token: chat.postMessage per recipient
slack.post -> {channel: recipient.slack_user_id, text: 'Please submit receipts for {period_label} by EOD today.'}

// Write delivery log
output.delivery_log -> Google Sheets tab 'delivery_log': {recipient_email, sent_at, channel, status}

// 24h polling: check Gmail thread for replies
gmail.read -> threads where in_reply_to = sent_message_id
output.reply_received -> {recipient_email, replied_at, thread_id}
output.reminder_queue -> recipients where reply_received = false AND elapsed >= 24h

// -- AGENT 1 OUTPUT HANDOFF --
// delivery_log and reply_received passed to orchestration layer
// Orchestration waits 48 hours then triggers Agent 2

// ============================================================
// AGENT 2: Reconciliation Agent
// ============================================================

// Xero API pull: BankTransactions
xero.GET /BankTransactions?where=Date>=period_start&Date<=period_end
-> bank_transactions: [{transaction_id, date, amount, payee, account_code, status}]

// Xero API pull: BankStatements (bank feed lines)
xero.GET /BankStatements?bankAccountID={id}&fromDate=period_start&toDate=period_end
-> bank_statement_lines: [{statement_line_id, date, amount, description, bank_account_id}]

// Xero API pull: BankRules (existing coding rules)
xero.GET /BankRules
-> coding_rules: [{rule_id, conditions, account_code, tracking}]

// Dext API pull
dext.GET /items?from=period_start&to=period_end
-> supplier_documents: [{doc_id, supplier_name, amount, date, document_url}]

// Hubdoc: parse structured emails from Hubdoc inbox
gmail.read (label:'hubdoc-inbox') -> parse {supplier_name, amount, date, document_url}
-> supplier_documents (appended): [{doc_id, supplier_name, amount, date, document_url}]

// Match engine: score each (transaction, statement_line) pair
for each bank_transaction:
  score = (amount_exact_match * 0.5)
         + (date_within_3_days * 0.3)
         + (payee_string_similarity_gte_0.7 * 0.2)
  if score >= 0.85 -> reconciled_items[]
  if score <  0.85 -> exception_items[]

// Link supplier documents to matched transactions
for each reconciled_item:
  match supplier_documents where amount == transaction.amount
    AND date within 2 days AND supplier_name similarity >= 0.7
  -> reconciled_item.doc_id = supplier_document.doc_id

// Write outputs
output.reconciled_items -> Xero: PUT /BankTransactions (status: RECONCILED, account_code)
output.exception_items -> Google Sheets tab 'recon_exceptions':
  {transaction_id, date, amount, payee, reason, doc_id, bookkeeper_action='', resolved_at=''}
output.summary -> Google Sheets tab 'recon_summary':
  {period_label, total_transactions, matched_count, exception_count, run_timestamp}

// -- AGENT 2 OUTPUT HANDOFF --
// Bookkeeper reviews 'recon_exceptions' tab and sets bookkeeper_action + resolved_at
// Orchestration polls 'recon_exceptions' every 30 min
// When all rows have resolved_at populated -> trigger Agent 3

// ============================================================
// AGENT 3: Accruals and Reporting Agent
// ============================================================

// Read accruals schedule
Google Sheets tab 'accruals_schedule' ->
  accruals: [{line_id, description, account_code, debit_amount, credit_amount, period_label, active}]
  filter: active == true AND period_label == current_period

// Post journals to Xero
xero.POST /ManualJournals:
  {Date: period_end, LineAmountTypes: 'NoTax',
   JournalLines: [{AccountCode, Description, LineAmount, TrackingCategories}]}
-> posted_journals: [{line_id, xero_journal_id, status}]

// Pull period reports from Xero
xero.GET /Reports/ProfitAndLoss?fromDate=period_start&toDate=period_end&compareWith=1
-> pl_data: {revenue, cogs, gross_profit, operating_expenses, ebitda, net_profit, prior_period_values}

xero.GET /Reports/BalanceSheet?date=period_end
-> bs_data: {total_assets, total_liabilities, net_assets, equity}

xero.GET /Reports/CashSummary?fromDate=period_start&toDate=period_end
-> cf_data: {operating_cf, investing_cf, financing_cf, net_change}

xero.GET /Reports/AgedPayablesByContact?date=period_end
-> aged_payables: [{contact_name, outstanding_amount, days_overdue}]

xero.GET /Reports/AgedReceivablesByContact?date=period_end
-> aged_receivables: [{contact_name, outstanding_amount, days_overdue}]

// Variance commentary generation
for each pl_line in pl_data:
  variance_pct = (actual - prior) / prior
  if abs(variance_pct) >= variance_threshold_pct (0.10):
    commentary_text = '{line_item} is {pct}% {above|below} the prior period at ${actual_value}.'
    -> variance_commentary[]

// Populate management accounts template
Google Sheets tab 'mgmt_accounts_{period_label}':
  write pl_data, bs_data, cf_data, aged_payables, aged_receivables, variance_commentary

// Export PDF
Google Sheets export API -> PDF
-> Google Drive folder 'Management Accounts/{period_label}/pack.pdf'
-> report_pdf_url: string (restricted to finance Google Group)

// Approval gate
Google Sheets tab 'approval_tracker':
  write {period_label, report_pdf_url, approval_status='pending', approver_email='ml@yourcompany.com'}
// Orchestration polls every 30 min
// Finance Manager sets approval_status = 'approved' | 'rejected'

// On approval_status == 'approved':
gmail.send -> each stakeholder_email:
  {subject: 'Management Accounts: {period_label}', attachment: report_pdf_url}
-> distribution_log: [{recipient_email, sent_at, gmail_message_id}]

slack.post -> channel '#finance':
  {text: 'Management accounts for {period_label} have been distributed. {report_pdf_url}'}

// On approval_status == 'rejected':
slack.post -> channel '#finance':
  {text: 'Management accounts for {period_label} returned for correction. Finance Manager notes: {rejection_note}'}

// ============================================================
// END OF FLOW
// ============================================================
Developer Handover PackPage 3 of 4
FS-DOC-04Technical

04Recommended build stack

Orchestration layer
A workflow automation tool running one workflow per agent (three workflows total: chase_notification, reconciliation, accruals_reporting) plus one master orchestration workflow that fires the schedule trigger and manages handoffs between agents. All workflows share a single credential store. No credentials are stored inline in workflow definitions. The credential store holds: Xero OAuth refresh token, Gmail OAuth client credentials, Slack Bot token, Dext API key, and Google Sheets service account JSON. Credential names must follow the convention 'fullspec_{tool}_{env}' (e.g. 'fullspec_xero_prod', 'fullspec_gmail_sandbox').
Webhook configuration
Two inbound webhooks are required. (1) Exceptions cleared webhook: the orchestration layer exposes a webhook endpoint that the reconciliation workflow calls when all recon_exceptions rows are resolved. This avoids continuous polling on the Sheets API. (2) Approval webhook: optionally, a lightweight approval link embedded in the Finance Manager notification email can POST approval_status to the orchestration layer directly, bypassing the need to open Google Sheets. Both webhook URLs must be registered in the shared credential store and rotated if the workflow is rebuilt. All webhooks require HTTPS and a shared secret header (X-FullSpec-Token) validated on receipt.
Templating approach
Gmail templates are maintained as Gmail drafts with the label prefix 'FullSpec/chase'. Liquid-style tokens ({period_label}, {recipient_name}) are substituted at runtime by the orchestration layer before send. The management accounts Google Sheets template is a locked master sheet in the 'Management Accounts' Google Drive folder; the agent copies the master to a new tab named 'mgmt_accounts_{period_label}' each cycle rather than overwriting the master. Variance commentary strings use a fixed sentence template defined in the workflow configuration, not in a separate file, to keep dependencies minimal.
Error logging
All agent errors are written to a Supabase table named 'automation_error_log' with columns: error_id (uuid), workflow_name, agent_name, error_code, error_message, payload_snapshot (jsonb), occurred_at (timestamptz), resolved (bool). On any error with severity 'critical' (Xero journal post failure, PDF export failure, approval webhook timeout exceeding 72 hours), the orchestration layer posts a Slack alert to '#finance-alerts' naming the workflow, error code, and a link to the Supabase error row. Non-critical errors (e.g. a single Gmail send failure) are logged to Supabase and included in a daily digest message to '#finance-alerts' rather than triggering an immediate alert.
Testing approach
All three agents are built and validated in a sandbox environment first. The Xero sandbox tenant (available via the Xero developer portal) is used for all API calls during build. Gmail and Slack sandbox credentials point to a dedicated test Google account and a private '#fullspec-test' Slack channel. Google Sheets sandbox uses a cloned copy of the production accruals schedule and exceptions template with synthetic transaction data covering normal, low-confidence, and no-match scenarios. No calls are made to production Xero until the parallel run phase, which runs alongside one live manual close cycle before go-live.
Estimated total build time
Chase and Notification Agent: 8 hours. Reconciliation Agent: 22 hours. Accruals and Reporting Agent: 18 hours. End-to-end integration testing, sandbox validation, and parallel run support: 12 hours. Total: 60 hours.
Pre-build blockers: three items must be confirmed before build begins. (1) Xero API access: confirm the subscription plan includes API access and that an OAuth 2.0 client ID and secret have been created in the Xero developer portal. (2) Accruals schedule structure: confirm the Google Sheet tab 'accruals_schedule' exists with a consistent column schema matching the field names in the IO spec above. If the current schedule is ad hoc, the process owner must standardise it before Agent 3 can be built. (3) Hubdoc vs Dext: confirm which document collection tool is the primary source. If both are in use, confirm whether Dext is on a plan that includes API access (Dext Premium or above). If Hubdoc is the primary tool and no API is available, the Gmail email-to-inbox parsing approach will be used instead. Contact the FullSpec team at support@gofullspec.com to confirm these items before the build kickoff call.
Developer Handover PackPage 4 of 4

More documents for this process

Every document generated for End of Month Close.

Launch Plan
Operations · Owner
View
ROI and Business Case
Finance · Owner
View
Process Runbook / SOP
Operations · Owner
View
Integration and API Spec
Technical · Developer
View
Test and QA Plan
Quality · Developer
View