Atlanta Art Solutions

Salestax Liability Pipeline
System Architecture & Data Flow Briefing
March 8, 2026
384Charges
$30,054.53Gross Revenue
$2,076.44Est. GA Tax
18Counties
75+ZIP Codes

1. Pipeline Overview

Two ordering platforms (PhotoFinale/PPRpix and ROES Server) feed into a single Stripe account. The incremental sync runs daily at 06:00 UTC, pulling new charges and enriching them with platform identification. ROES charges are backfilled every 20 minutes with description and metadata to enable QuickBooks Stripe Connector sync.

Deliverablesgenerate-monthly-tax-report.jsbackfill-roes.jsscan-results.jsonincremental-sync.jsStripe APIROES ServerPhotoFinale/PPRpixDeliverablesgenerate-monthly-tax-report.jsbackfill-roes.jsscan-results.jsonincremental-sync.jsStripe APIROES ServerPhotoFinale/PPRpixAll charges landin one accountEnables QBOConnector syncCharge (description +metadata + orderCharge (NO description,NO metadata)Fetch new charges(daily 06:00 UTC)Charge objects +balance_transactionMerge & save(platform identified)Read ROES chargesUpdate description +23 metadata keysFilter by monthSegment PF vs ROESCalculate per-ZIP taxXLSX + PDF +JSON + CSV JE

2. Tax Jurisdiction Logic

ZIP code is the definitive jurisdiction locator. City name is NOT used due to unreliability in Stripe data (55 of 101 January orders listed 'Atlanta' regardless of actual municipality). Tax is back-calculated using the formula: taxable = gross / (1 + rate), then tax = gross - taxable.

Tax CalculatorZIP Lookup(ga-tax-jurisdictions.js)PlatformDetectorStripe ChargeTax CalculatorZIP Lookup(ga-tax-jurisdictions.js)PlatformDetectorStripe Chargealt[Store pickup (1234 LoganCircle)][Has shipping][No shipping]alt[PhotoFinale (hasdescription)][ROES (no description)]alt[ZIP found][ZIP not found]Identify platformCheck shipping addressUse billing ZIPUse shipping ZIPUse billing ZIPDefault GA in-storeUse billing ZIP if availableLookup in 75+ ZIP databaseCounty + City + MARTA ratesFulton/Atlanta 9% defaulttaxable = gross / (1 + rate)tax = gross - taxableState 4% + County + City + MARTA

Tax Jurisdiction Rules

ROES DefaultGA in-store pickup (override only if shipping specifies non-GA state)
PhotoFinaleShipping ZIP → billing ZIP → default Atlanta/Fulton 9%
Store PickupDetected via "1234 Logan Circle, 30318" pattern
GA Rate Range7.0% – 9.0% (State 4% + County + City + MARTA varies)
FallbackUnknown ZIPs → Atlanta/Fulton 9% (conservative estimate)
Out-of-StateFully tax exempt ($0.00)

3. Automation & Scheduling

All automation runs via systemd user timers. Crontab is non-functional on this VPS. Two timers orchestrate the data pipeline:

QBO StripeConnectorStripe APIbackfill-roes.jsincremental-sync.jsaas-roes-backfill(every 20 min)aas-stripe-sync(daily 06:00 UTC)QBO StripeConnectorStripe APIbackfill-roes.jsincremental-sync.jsaas-roes-backfill(every 20 min)aas-stripe-sync(daily 06:00 UTC)Hourly syncTrigger daily syncFetch new chargesNew transactionsSave to scan-results.jsonTrigger syncFetch new chargesRun backfillFind unbackfilled ROESUpdate charge(add description + metadata)Read charges(requires description)Backfilled ROES +PhotoFinale charges
TimerScheduleAction
aas-stripe-syncDaily 06:00 UTCIncremental Stripe sync
aas-roes-backfillEvery 20 minSync + ROES charge backfill (enables QBO Connector sync)

Manage timers with: systemctl --user list-timers, journalctl --user -u <unit>

4. Report Generation Outputs

Three report types are generated from the synced Stripe data:

monthly-summaries/deliverables/Fee ExportCombined SummaryPer-Month Reportmonthly-summaries/deliverables/Fee ExportCombined SummaryPer-Month ReportPer-month: XLSX has 4 sheetsSummary + PF Orders + ROES Orders + FailedCombined: month-over-monthcomparison + jurisdiction detailDetail: 1 row per chargeJE: 1 monthly summary entry{Month}_{Year}_Sales_Tax_Report.xlsx{Month}_{Year}_Sales_Tax_Report.pdf{Month}_{Year}_Sales_Tax_JE.csv{YYYY-MM}-sales-tax-report.jsonCombined_Sales_Tax_Summary.xlsxCombined_Sales_Tax_Summary.pdfcombined-summary.jsonStripe_Processing_Fees.csvStripe_Processing_Fees_JE.csv

Per-Month Reports

Generated via generate-monthly-tax-report.js with --month YYYY-MM flag.

Combined Summary

Generated via generate-combined-summary.js - compares all months.

Stripe Fees Export

Generated via generate-stripe-fees-csv.js.

5. Financial Summary

All-time totals across December 2025 – February 2026 (3 months):

43%18%11%8%7%7%6%GA Tax Rate Distribution (Dec-Feb 384 charges)Fulton/Atlanta 9.0%Fulton/Other 7.5%DeKalb/Atlanta 9.0%DeKalb/Other 7.5%Cobb 7.0%Other Counties 7-8%Out-of-State 0%
MetricDec 2025Jan 2026Feb 2026TOTAL
Orders128144112384
Gross Revenue$9,155.52$11,848.01$9,051.00$30,054.53
Stripe Fees$303.95$385.15$295.18$984.28
Net Revenue$8,851.57$11,462.86$8,755.82$29,070.25
GA Taxable Orders113137109359
Estimated GA Tax$644.18$740.49$691.77$2,076.44
Out-of-State157325
PhotoFinale1168586287
ROES12592697

6. Script Reference

ScriptPurpose
incremental-sync.jsStripe API sync → scan-results.json
backfill-roes-charges.jsROES charge enrichment for QBO Stripe Connector sync
cron-roes-backfill.shSync + backfill wrapper script (systemd timer)
generate-monthly-tax-report.jsPer-month XLSX+PDF+JSON+CSV tax report
ga-tax-jurisdictions.js75+ ZIP jurisdiction database module
generate-combined-summary.jsMulti-month comparison report (XLSX+PDF+JSON)
generate-stripe-fees-csv.jsStripe fee export for QBO (detail CSV + JE CSV)
roes-tax-merger.jsROES CSV tax data merger (historical tool)
monthly-tax-aggregator.jsROES CSV monthly aggregation (historical tool)

7. Known Limitations

  1. PhotoFinale tax amounts are ESTIMATED via back-calculation (taxable = gross / (1 + rate)). Actual tax amounts are not captured by Stripe metadata.
  2. Approximately 15 split-jurisdiction ZIP codes exist in the Atlanta metro area, where a single ZIP may span multiple municipalities with different tax rates. Maximum theoretical monthly error is approximately $60.
  3. No tracking for tax-exempt entities or organizations. All GA orders are assumed taxable.
  4. ROES orders have no customer-facing order number in Stripe metadata (use Stripe charge ID for lookups).
  5. Shipping charges cannot be separated from product amounts in current data. This causes slight tax overestimation since shipping may be taxed at different rates or exempt.