Skip to main content
If you’re an unregulated platform moving funds using Grid’s money transmitter licenses, Grid (operating as Lightspark Payments, LLC) is the licensed money transmitter on your transactions. That license requires a receipt to be delivered to the customer for every completed transaction. Because you own the customer relationship, at the end of each transaction you’ll need to deliver the transaction receipt. This guide explains when to send a receipt, what it must contain, how to map Grid transaction data to each receipt field, and how to confirm delivery back to Grid.
Receipts are required for regulatory compliance — they’re not an optional best practice. Send a receipt to your customer for every completed transaction, and confirm delivery to Grid. Your platform agreement obligates you to deliver receipts and to furnish records of delivery on request.

Sample receipt layout

Your receipt’s visual design is up to you, but the content and field set are fixed. The layout below shows an example with sample data filled in:

When to send a receipt

Trigger receipt generation off the transaction completion event:
  • OUTGOING_PAYMENT.COMPLETED — a send (the customer is the sender).
  • INCOMING_PAYMENT.COMPLETED — a receive (the customer is the recipient).
Send the receipt to your customer as soon as the transaction completes — by email, in-app notification, or any channel that lets the customer retain the receipt (for example, a downloadable PDF or an email they can save).
Only completed transactions get a receipt. Transactions that end in FAILED or EXPIRED do not. Once you send a receipt, freeze its contents — if the transaction is later reversed or refunded, the original receipt stays as issued and the reversal is tracked separately on the transaction record.

What a receipt must contain

A compliant receipt combines Lightspark’s regulatory disclosures (fixed values and legal language) with data-driven fields populated from the specific transaction.

Lightspark regulatory disclosures

Include these exactly as written on every receipt:
FieldValue
Money transmitterLightspark Payments, LLC
NMLS ID2429193
Regulatory address8605 Santa Monica Blvd, PMB 64461, West Hollywood, CA 90069
Websitewww.lightspark.com
Customer service phone(855) 516-0103
Fraud reporting”To report fraud or suspected fraud in connection with the money transmission services, please call customer services toll-free at (855) 516-0103.”
Refund policyLightspark’s refund policy for transmitted funds (link or full text).

Transaction fields

FieldDescriptionRequired when
SenderName of the customer initiating the transactionAlways
RecipientName of the recipient receiving fundsAlways
Transaction IDUnique ID per transactionAlways
Transaction typeCross-border send/receive, on-ramp, off-ramp, or transfer out; for virtual currency transactions, the currency typeAlways
Transaction dateDate the transaction was fundedAlways
Transaction timePrecise time including time zoneAlways
Transfer amountAmount in the currency the transmission was funded inAlways
Total to recipientAmount in the currency the recipient receivesAlways
Total transfer feesAll fees charged in connection with the transactionAlways
TaxesItemized taxesWhen taxes apply
TotalTotal cost to the senderAlways
Exchange rateFX rate applied, rounded to 2–4 decimal placesWhen the funding and receiving currencies differ
Transaction hashOn-chain transaction hashCrypto transactions only
Virtual currency address(es)Public on-chain addresses involvedCrypto transactions only
FX shortfall disclosure”Recipient may receive less due to fees charged by the recipient’s bank and foreign taxes.”Foreign remittance transactions only

Mapping Grid data to receipt fields

Most receipt fields come directly from the transaction object — available on the completion webhook payload or by retrieving the transaction. All amounts are integers in the smallest unit of their currency (for example, cents), so format them using the currency’s decimals.
Receipt fieldGrid source
Transaction IDid
Transaction typetype (OUTGOING / INCOMING) plus the funding currency
Transaction date / timesettledAt
SendercustomerId / platformCustomerId (outgoing) or counterpartyInformation (incoming)
RecipientDestination external account beneficiary — resolve destination.accountId to the external account and use its beneficiary (from accountInfo) or customerId (outgoing); customerId / platformCustomerId (incoming)
Transfer amountsentAmount.amount + sentAmount.currency
Total to recipientreceivedAmount.amount + receivedAmount.currency
Total transfer feesfees (smallest unit of the sending currency)
Exchange rateexchangeRate
Transaction hash / VC address(es)reconciliationInstructions.transactionHash (a dedicated transaction hash field may be exposed directly on the transaction)

Example: send a receipt on completion

Listen for the completion webhook, verify its signature, assemble the receipt fields, and send the receipt to your customer. See Webhooks for signature verification.
// Inside your verified webhook handler
app.post('/webhooks/grid', async (req, res) => {
  // ... verify the X-Grid-Signature header first (see Webhooks) ...

  const event = req.body;
  if (event.type === 'OUTGOING_PAYMENT.COMPLETED' ||
      event.type === 'INCOMING_PAYMENT.COMPLETED') {
    const tx = event.data;

    const format = (money) =>
      (money.amount / 10 ** money.currency.decimals).toFixed(money.currency.decimals);

    const receipt = {
      // Lightspark regulatory disclosures (fixed)
      moneyTransmitter: 'Lightspark Payments, LLC',
      nmlsId: '2429193',
      address: '8605 Santa Monica Blvd, PMB 64461, West Hollywood, CA 90069',
      customerServicePhone: '(855) 516-0103',
      // Transaction fields
      transactionId: tx.id,
      transactionType: tx.type,
      transactionDateTime: tx.settledAt,
      transferAmount: `${tx.sentAmount.currency.symbol}${format(tx.sentAmount)}`,
      totalToRecipient: `${tx.receivedAmount.currency.symbol}${format(tx.receivedAmount)}`,
      totalTransferFees: tx.fees,
      exchangeRate: tx.exchangeRate, // include when currencies differ
    };

    await sendReceiptEmail(tx.platformCustomerId, receipt); // your delivery channel

    // Tell Grid the receipt was delivered
    await confirmReceiptDelivery(tx.id);
  }

  res.status(200).json({ received: true });
});

Confirm delivery to Grid

After you deliver the receipt to your customer, confirm it with the Confirm receipt delivery endpoint. Grid stores the confirmation timestamp on the transaction’s receiptDeliveryConfirmedAt field so it can be furnished to regulators on request.
cURL
curl -X POST 'https://api.lightspark.com/grid/2025-10-13/transactions/{transactionId}/confirm' \
  -u "$GRID_CLIENT_ID:$GRID_CLIENT_SECRET" \
  -H 'Content-Type: application/json' \
  -d '{ "receiptDeliveryConfirmedAt": "2025-10-03T15:31:00Z" }'
receiptDeliveryConfirmedAt is optional — if you omit it, Grid records the current server time. Calling the endpoint again for the same transaction updates the stored confirmation time.